# Cookbook — Syntaxe et fonctions

Cette page complète la [référence Syntaxe et fonctions](/user-documentation/documentation-utilisateur/build/building-the-reporting/syntax-functions.md) avec des modèles de rapport complets, prêts à adapter, pour les scénarios terrain les plus courants dans Daxium-Air.

## Recette 1 — Rapport d'intervention par fiche (Word)

**Cas d'usage :** Générer un document Word par fiche d'intervention, incluant les coordonnées du technicien, la localisation GPS, des photos avec filigrane GPS, et une section anomalies conditionnelle.

### Structure du modèle

```
<%Inspector.FullName%> — <%F('dd/MM/yyyy', InspectionDate)%>

Site : <%List(', ', SiteAddress, PostalCode, City)%>
Statut : <%If(InspectionResult = 'Conforme', 'CONFORME ✓', 'NON CONFORME ✗')%>

<%Map(SubmissionLatitude, SubmissionLongitude, 15, 400, 250, 0)%>
```

Photos (avec coordonnées GPS en filigrane) :

```
<%Images(Photos)%><%ImageWatermark(200, 0,
  List(' | ',
    ImageExif(Photos, 'GpsLatitudeDM'),
    ImageExif(Photos, 'GpsLongitudeDM'),
    ImageExif(Photos, 'DateTime')
  ), 'Left', 'Bottom', 'White', '#000000', 0.5, 11)%>
```

Section anomalies conditionnelle (masquée s'il n'y en a pas) :

```
<%Display(DefectCount > 0)%>
## Anomalies constatées

<%Relation('Anomalies', 'DefectDate')%>
  <%DefectDescription%> — <%F('dd/MM/yyyy', DefectDate)%>
<%End%>
```

Signature :

```
<%Image(InspectorSignature, 120)%>
```

### Fonctions utilisées

* `List()` — assemble les champs d'adresse en omettant les vides
* `If()` — affiche un statut lisible
* `Map()` — carte de la position GPS de l'intervention
* `Images()` + `ImageWatermark()` + `ImageExif()` — photos avec GPS et date en filigrane
* `Display()` / `End` — masque la section anomalies si vide
* `Relation()` — liste les fiches anomalies liées

***

## Recette 2 — Rapport de synthèse mensuel en mode listing (Excel)

**Cas d'usage :** Un rapport Excel en mode listing envoyé par e-mail chaque mois, couvrant toutes les fiches du mois précédent, avec comptage, total et graphique en barres.

### Feuille PPActions

| Type:table ; TableName:Interventions ; Value:Id | Type:table ; TableName:Interventions ; Value:TechnicianName | Type:table ; TableName:Interventions ; Value:InterventionDate | Type:table ; TableName:Interventions ; Value:Duration |
| ----------------------------------------------- | ----------------------------------------------------------- | ------------------------------------------------------------- | ----------------------------------------------------- |

### Feuille de données (tableau Interventions — ligne modèle)

| #              | Technicien                 | Date                                          | Durée (min)             |
| -------------- | -------------------------- | --------------------------------------------- | ----------------------- |
| `<%Value:Id%>` | `<%Value:TechnicianName%>` | `<%Value:F('dd/MM/yyyy', InterventionDate)%>` | `<%Value:N(Duration)%>` |

### Section récapitulative (sous le tableau)

```
Total interventions :     <%Count()%>
Durée totale (min) :      <%Sum('N(Duration)')%>
Durée moyenne (min) :     <%Avg('N(Duration)')%>
```

Graphique (interventions par technicien) :

```
<%Chart('Bar', 'Count()', 'TechnicianName', true, 500, 300)%>
```

### Filtre Repeat dans PPActions

```
<%Repeat(InterventionDate > #date-1m# AND InterventionDate < #date#, InterventionDate)%>
```

### Fonctions utilisées

* `N()` / `Sum()` / `Avg()` / `Count()` — agrégation sur l'ensemble des données
* `Chart()` — graphique en barres par technicien
* `Repeat()` avec filtre de date — limite au mois précédent
* `F()` — formatage de la date dans le tableau

***

## Recette 3 — Bon de livraison avec articles liés (Word)

**Cas d'usage :** Un bon de livraison par fiche, listant les produits commandés via un champ relation, avec comptage et total.

### Section fiche principale

```
Bon de livraison n°<%SubmissionId%>
Date : <%F('dd/MM/yyyy', DeliveryDate)%>
Client : <%ClientName%>
Adresse : <%List(', ', DeliveryAddress, PostalCode, City)%>
```

### Tableau de relation (une ligne par produit)

Placez `Relation()` dans la première cellule d'une ligne de tableau :

```
<%Relation('ProduitsCommandes', 'ProductName')%>
```

Ligne modèle :

| `<%ProductName%>` | `<%ProductReference%>` | `<%Quantity%>` | `<%F('0.00', UnitPrice)%>` | `<%F('0.00', Quantity * UnitPrice)%>` |
| ----------------- | ---------------------- | -------------- | -------------------------- | ------------------------------------- |

Ligne de pied (sous le tableau de relation) :

```
<%[ProduitsCommandes.Count]%> articles — Total : <%Sum('N(Quantity) * N(UnitPrice)')%> €
```

### Fonctions utilisées

* `Relation()` — une ligne par fiche produit liée
* `[Relation.Count]` — nombre total de lignes produits
* `List()` — adresse de livraison formatée
* Arithmétique dans les balises — `Quantity * UnitPrice`
* `Sum()` — total général sur toutes les lignes produits

***

## Recette 4 — Rapport multi-sections conditionnel (Word)

**Cas d'usage :** Un modèle unique qui adapte son contenu selon la valeur d'un champ liste (p. ex. `TypeIntervention`). Chaque section n'est générée que pour le type d'intervention correspondant.

### Modèle

```
<%Display(TypeIntervention = 'Maintenance')%>
## Checklist de maintenance
<%ChecklistItem1%> — <%If(ChecklistItem1Result = 'OK', 'Conforme', 'Non conforme')%>
<%ChecklistItem2%> — <%If(ChecklistItem2Result = 'OK', 'Conforme', 'Non conforme')%>
<%End%>

<%Display(TypeIntervention = 'Installation')%>
## Fiche d'installation
Date d'installation : <%F('dd/MM/yyyy', InstallationDate)%>
Installé par : <%Technician.FullName%>
Numéro de série : <%SerialNumber%>
<%End%>

<%Display(TypeIntervention = 'Audit')%>
## Résultats d'audit
Score : <%AuditScore%> / 100
<%If(AuditScore >= 80, 'Résultat : SATISFAISANT', 'Résultat : ACTION REQUISE')%>
<%End%>
```

### Fonctions utilisées

* `Display()` / `End` — affiche chaque section uniquement pour le type correspondant
* `If()` — rendu des libellés conforme/non conforme et résultat
* `F()` — formatage de la date

***

## Conseils pour toutes les recettes

* **Testez avec des données réelles.** Générez un rapport depuis une fiche qui couvre les cas limites (champs optionnels vides, nombre maximum de photos) avant de finaliser le modèle.
* **Utilisez `Exists()` pour protéger les champs image.** Si une photo peut être absente, encadrez la balise : `<%If(Exists('Photos#1'), Image([Photos#1], 200), '')%>` pour éviter un espace vide dans le document.
* **Limite du mode listing.** Les rapports Excel et les rapports Word planifiés sont limités à 30 000 fiches. Ajoutez un filtre de date dans `Repeat()` pour maintenir des temps de génération raisonnables.
* **Apostrophes.** Dans les modèles PowerPoint, remplacez les guillemets typographiques (`'`) par des guillemets droits (`'`) avant d'enregistrer — voir la page [PowerPoint](/user-documentation/documentation-utilisateur/build/building-the-reporting/report-templates/ppt.md) pour les détails.


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://www.center.daxium-air.com/user-documentation/documentation-utilisateur/build/building-the-reporting/syntax-functions-cookbook.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
