# Syntaxe et fonctions

## Index des fonctions

| Instruction / Fonction           | Description                                                                    | Section                                                       |
| -------------------------------- | ------------------------------------------------------------------------------ | ------------------------------------------------------------- |
| `<%SystemName%>`                 | Insérer un champ par son nom système                                           | [Insérer un champ simple](#inserer-un-champ-simple)           |
| `<%MarkDown(SystemName)%>`       | Insérer un champ texte enrichi en préservant la mise en page (Word uniquement) | [Insérer un champ simple](#inserer-un-champ-simple)           |
| Arithmétique `<% A + B %>`       | Calculs entre champs                                                           | [Insérer une formule](#inserer-une-formule)                   |
| `Repeat()`                       | Répéter une ligne de tableau pour chaque fiche en mode listing                 | [Repeat()](#repeat)                                           |
| `DISTINCT()`                     | Supprimer les valeurs en double dans un listing                                | [Repeat()](#repeat)                                           |
| `Image()` / `Img()`              | Insérer une seule image                                                        | [Manipulation d'images](#manipulation-dimages)                |
| `Images()`                       | Insérer toutes les images d'un champ multi-images                              | [Manipulation d'images](#manipulation-dimages)                |
| `UseImagesPreview()`             | Redimensionner les images avant insertion pour alléger le fichier              | [Manipulation d'images](#manipulation-dimages)                |
| `#xComment`                      | Récupérer le commentaire associé à une image                                   | [Manipulation d'images](#manipulation-dimages)                |
| `SetPdfJpegQuality()`            | Convertir les images en JPEG avec un indice de qualité donné                   | [Manipulation d'images](#manipulation-dimages)                |
| `Map()`                          | Afficher une carte GPS centrée sur la localisation de la fiche                 | [Manipulation d'images](#manipulation-dimages)                |
| `ImageExif()`                    | Extraire les métadonnées Exif (date, GPS) d'une photo                          | [Manipulation d'images](#manipulation-dimages)                |
| `BarCode()`                      | Insérer un code-barres                                                         | [Manipulation d'images](#manipulation-dimages)                |
| `QrCode()`                       | Insérer un QR code                                                             | [Manipulation d'images](#manipulation-dimages)                |
| `ImageWatermark()`               | Superposer du texte sur une image                                              | [Manipulation d'images](#manipulation-dimages)                |
| `Index()`                        | Numéro de ligne auto-incrémenté dans un listing                                | [Fonctions utilitaires](#fonctions-utilitaires)               |
| `MapLetter()`                    | Lettre d'épingle générée par Google Maps                                       | [Fonctions utilitaires](#fonctions-utilitaires)               |
| `Format()` / `F()`               | Formater un champ Date ou Nombre                                               | [Fonctions utilitaires](#fonctions-utilitaires)               |
| `Date()`                         | Date et heure actuelles                                                        | [Fonctions utilitaires](#fonctions-utilitaires)               |
| `AddHours()`                     | Ajouter ou retirer des heures à une date                                       | [Fonctions utilitaires](#fonctions-utilitaires)               |
| `AddDays()`                      | Ajouter ou retirer des jours à une date                                        | [Fonctions utilitaires](#fonctions-utilitaires)               |
| `AddMonths()`                    | Ajouter ou retirer des mois à une date                                         | [Fonctions utilitaires](#fonctions-utilitaires)               |
| `AddYears()`                     | Ajouter ou retirer des années à une date                                       | [Fonctions utilitaires](#fonctions-utilitaires)               |
| `Add()`                          | Sommer plusieurs valeurs numériques, en traitant les valeurs nulles comme 0    | [Fonctions utilitaires](#fonctions-utilitaires)               |
| `ToUpper()` / `ToLower()`        | Convertir une chaîne en majuscules ou minuscules                               | [Fonctions utilitaires](#fonctions-utilitaires)               |
| `List()`                         | Assembler plusieurs valeurs avec un séparateur                                 | [Fonctions utilitaires](#fonctions-utilitaires)               |
| `Split()`                        | Extraire un segment d'une chaîne délimitée                                     | [Fonctions utilitaires](#fonctions-utilitaires)               |
| `ToNumber()` / `N()`             | Convertir du texte en nombre                                                   | [Fonctions utilitaires](#fonctions-utilitaires)               |
| `ToDate()` / `D()`               | Convertir du texte en date                                                     | [Fonctions utilitaires](#fonctions-utilitaires)               |
| `ToString()` / `S()`             | Convertir une valeur en texte                                                  | [Fonctions utilitaires](#fonctions-utilitaires)               |
| `If()`                           | Retourner une valeur selon une condition                                       | [Instructions conditionnelles](#instructions-conditionnelles) |
| `Exists()`                       | Tester si un champ existe dans le formulaire                                   | [Instructions conditionnelles](#instructions-conditionnelles) |
| `Hide()` … `<%End%>`             | Masquer une section du document lorsque la condition est vraie                 | [Instructions conditionnelles](#instructions-conditionnelles) |
| `Display()` … `<%End%>`          | Afficher une section du document lorsque la condition est vraie                | [Instructions conditionnelles](#instructions-conditionnelles) |
| `DisplayRow()`                   | Afficher une ligne de tableau lorsque la condition est vraie                   | [Instructions conditionnelles](#instructions-conditionnelles) |
| `Contains()`                     | Tester si une chaîne contient un motif                                         | [Instructions conditionnelles](#instructions-conditionnelles) |
| `StartsWith()`                   | Tester si une chaîne commence par une valeur                                   | [Instructions conditionnelles](#instructions-conditionnelles) |
| `EndsWith()`                     | Tester si une chaîne se termine par une valeur                                 | [Instructions conditionnelles](#instructions-conditionnelles) |
| `Relation()`                     | Répéter des lignes pour chaque fiche enfant liée                               | [Relation](#relation)                                         |
| `Count()`                        | Compter les fiches de l'ensemble courant                                       | [Fonctions d'agrégation](#fonctions-dagregation)              |
| `Sum()`                          | Sommer un champ numérique sur toutes les fiches                                | [Fonctions d'agrégation](#fonctions-dagregation)              |
| `Avg()`                          | Valeur moyenne d'un champ sur toutes les fiches                                | [Fonctions d'agrégation](#fonctions-dagregation)              |
| `Min()` / `Max()`                | Valeur minimale ou maximale d'un champ                                         | [Fonctions d'agrégation](#fonctions-dagregation)              |
| `GlobalMap()`                    | Afficher plusieurs points GPS sur une seule carte                              | [Fonctions d'agrégation](#fonctions-dagregation)              |
| `Chart()`                        | Afficher un graphique en barres ou en camembert                                | [Fonctions d'agrégation](#fonctions-dagregation)              |
| Accesseurs de champs Liste       | Extraire des niveaux ou des éléments d'un champ liste                          | [Cas particuliers](#cas-particuliers)                         |
| Accesseurs de champs Utilisateur | Extraire les noms et e-mails d'un champ utilisateur                            | [Cas particuliers](#cas-particuliers)                         |
| Balises d'état de workflow       | Afficher l'état de workflow courant et sa couleur                              | [Cas particuliers](#cas-particuliers)                         |
| `FileImage()`                    | Insérer des pages PDF sous forme d'images dans un rapport                      | [Cas particuliers](#cas-particuliers)                         |
| `FilePageCount()`                | Compter les pages d'un PDF attaché                                             | [Cas particuliers](#cas-particuliers)                         |

***

## Champs système

Utilisez les balises suivantes pour accéder aux métadonnées de la fiche dans n'importe quel modèle de rapport.

### Identification de la fiche

| Champ           | Balise                         |
| --------------- | ------------------------------ |
| Numéro de fiche | `<%SubmissionId%>` ou `<%Id%>` |
| Numéro UID      | `<%SubmissionUid%>`            |

### Création de la fiche

| Champ                                     | Balise                       |
| ----------------------------------------- | ---------------------------- |
| Date du premier enregistrement sur le web | `<%Created_At%>`             |
| Date de création de la fiche              | `<%DataCreatedAt%>`          |
| Créateur — prénom                         | `<%[CreateUser.FirstName]%>` |
| Créateur — nom                            | `<%[CreateUser.LastName]%>`  |
| Créateur — e-mail                         | `<%[CreateUser.Email]%>`     |

### Dernière mise à jour

| Champ                                     | Balise                   |
| ----------------------------------------- | ------------------------ |
| Date du dernier enregistrement sur le web | `<%[Updated_At]%>`       |
| Date de mise à jour de la fiche           | `<%[Updated_At]%>`       |
| Dernière modification par (e-mail)        | `<%[UpdateUser.Email]%>` |

### Formulaire

| Champ                     | Balise              |
| ------------------------- | ------------------- |
| Nom du formulaire         | `<%StructureName%>` |
| Identifiant du formulaire | `<%StructureId%>`   |

### Tâche liée

| Champ                                   | Balise                    |
| --------------------------------------- | ------------------------- |
| Date et heure de début prévues          | `<%[Task.PlannedStart]%>` |
| Date et heure de fin prévues            | `<%[Task.PlannedEnd]%>`   |
| Échéance                                | `<%[Task.PlannedDue]%>`   |
| Date et heure de début effectives       | `<%[Task.RealStart]%>`    |
| Date et heure de fin effectives         | `<%[Task.RealEnd]%>`      |
| État (effectué, à faire)                | `<%[Task.FillStatus]%>`   |
| Statut temporel (à l'heure, en retard…) | `<%[Task.TimeStatus]%>`   |

### Autres informations

| Champ                                     | Balise                                          |
| ----------------------------------------- | ----------------------------------------------- |
| Nom de la société (depuis l'URL)          | `<%CompanyTitle%>`                              |
| Position GPS native (création sur mobile) | `<%SubmissionLatitude%><%SubmissionLongitude%>` |

## Insérer un champ simple

Un champ de formulaire s'insère en entourant son nom système par `<%` et `%>`. Ces marqueurs indiquent au système où les données de la fiche doivent être insérées. Vous pouvez appliquer n'importe quelle mise en forme prise en charge par Word/Excel (gras, italique, souligné) directement sur la balise.

```
<%System_Name%>
```

Si votre champ Texte utilise l'option « Texte enrichi », utilisez `<%MarkDown(SystemName)%>` pour préserver la mise en page dans les rapports Word. Non fonctionnel dans Excel.

{% hint style="warning" %}
Les noms système sont sensibles à la casse.
{% endhint %}

## Insérer une formule

Vous pouvez appliquer des calculs directement entre champs dans une balise de rapport.

```
<%FieldName1 <operator> FieldName2 | ConstantExpression%>
```

`<operator>` peut être n'importe quelle opération mathématique : `+`, `-`, `*`, `/`, `%`

* **ConstantExpression** est un nombre avec ou sans décimales
* Les parenthèses sont prises en charge
* `%` est également l'opérateur modulo

**Exemples :**

* `<%Price * 1.196%>` — avec Price = 10 : le résultat est **11.96**
* `<%(Price * Quantity) – (15 / 100) * (Price * Quantity)%>` — avec Price = 18 et Quantity = 2 : le résultat est **30.6**

Voici la liste complète des fonctions mathématiques prises en charge. Elles sont également **sensibles à la casse**.

<figure><img src="/files/8lulTPCLJTWuKfrwSyE3" alt=""><figcaption></figcaption></figure>

## Repeat()

Lorsque le modèle de rapport est en **mode listing**, l'instruction `Repeat()` répète une section du document pour chaque ligne de données. Elle doit être placée dans la première cellule (la plus à gauche) de la ligne du tableau à répéter.

```
<%Repeat(filter, sort)%>
```

| Paramètre | Description                                                            | Défaut |
| --------- | ---------------------------------------------------------------------- | ------ |
| `filter`  | Condition de filtrage, p. ex. `Id>3` ou `DateField<#date#` (optionnel) | Aucun  |
| `sort`    | Nom système du champ de tri (optionnel)                                | Aucun  |

{% hint style="info" %}
Le modèle tout entier ne peut contenir qu'une seule instruction `Repeat()`. Si plusieurs sont présentes, seule la première est détectée.
{% endhint %}

`Repeat()` peut être utilisé de quatre manières :

| Utilisation         | Syntaxe                 |
| ------------------- | ----------------------- |
| Sans aucun critère  | `<%Repeat()%>`          |
| Filtrage uniquement | `<%Repeat(Id>3)%>`      |
| Tri uniquement      | `<%Repeat(,Name)%>`     |
| Filtrage et tri     | `<%Repeat(Id>3,Name)%>` |

Ex :

![](/files/xDRepBIIwscnLmIDIQeS)

Avec 3 lignes de données, le résultat est le suivant:

<figure><img src="/files/NqOn7St3BIkQlfdmMqab" alt=""><figcaption></figcaption></figure>

### Filtrer les résultats

Filtrez les lignes répétées à l'aide d'une condition :

```
<%Repeat(DateField > #12/01/2023#)%>
```

Les dates utilisent le format `Jour/Mois/Année`. Vous pouvez également utiliser `#date#` comme variable pour la date du jour :

```
<%Repeat(DateField < #date#)%>
<%Repeat(DateField < #date-5d#)%>
```

Le second exemple signifie « il y a 5 jours ». Le format n'est pas sensible à la casse (`#Date-5D#` fonctionne aussi).

Vous pouvez définir l'intervalle de temps grâce aux unités du tableau ci-dessous :

<figure><img src="/files/fPCb7sjzSU7F5i1B5H4L" alt=""><figcaption></figcaption></figure>

{% hint style="info" %}
Utilisez `+` au lieu de `-` pour faire référence à des dates futures. Exemple : `<%Repeat(DateField < #date+10d#)%>` signifie aujourd'hui + 10 jours.
{% endhint %}

Vous pouvez combiner les conditions de filtrage avec les opérateurs `AND` ou `OR` :

```
<%Repeat(DateField<#date-5d# AND Id >= 3)%>
```

{% hint style="warning" %}
Cette syntaxe de filtrage ne prend pas en charge les fonctions utilisant les noms système des champs.
{% endhint %}

### Éviter la redondance des données — DISTINCT()

Lorsque vous utilisez `Repeat()`, utilisez `DISTINCT()` pour éviter de répéter la même valeur :

```
<%DISTINCT('Client')%>
```

Pour les champs contenant plusieurs textes distincts (dates, listes multi-niveaux), utilisez un second argument comme séparateur de concaténation :

```
<%DISTINCT('F(\'MM yyyy\',CreatedAt)', ',')%>
```

Cela retourne tous les mois uniques de création de fiches sur l'ensemble répété.

### Trier les résultats

`Repeat()` accepte un second paramètre pour trier les résultats. Le critère de tri doit être un nom de colonne :

```
<%Repeat(filteringCriteria, SortingCriteria)%>
```

Exemple :

```
<%Repeat(Id>15860, Name)%>
```

<figure><img src="/files/n9CusPJXIPAH4RGpU032" alt=""><figcaption></figcaption></figure>

## Manipulation d'images

### Image()

Insère une seule image depuis un champ image :

```
<%Image(FieldName, Width, Height)%>
```

Alias raccourci : `<%Img(FieldName, Width, Height)%>`

| Paramètre   | Description                              | Défaut              |
| ----------- | ---------------------------------------- | ------------------- |
| `FieldName` | Nom système du champ image               | —                   |
| `Width`     | Largeur de l'image en pixels             | —                   |
| `Height`    | Hauteur de l'image en pixels (optionnel) | Identique à `Width` |

* Si la hauteur est omise, l'image est placée dans un carré de `Width × Width` pixels
* Si la largeur et la hauteur sont toutes deux spécifiées, l'image s'inscrit dans ce rectangle sans déformation

**Exemples :**

Grande photo : `<%Image(ImageFieldName, 200)%>`

<figure><img src="/files/rE1dd9VjY31z6rbM7GTO" alt=""><figcaption></figcaption></figure>

Petite photo : `<%Img(ImageFieldName, 70, 50)%>`

<figure><img src="/files/j8b68HFEw5ajUkNPEPEN" alt=""><figcaption></figcaption></figure>

### Images()

Pour les champs image autorisant plusieurs images (max > 1), utilisez `Images()` inséré dans un tableau à une seule colonne :

```
<%Images(FieldName, start, end)%>
```

| Paramètre   | Description                                      | Défaut |
| ----------- | ------------------------------------------------ | ------ |
| `FieldName` | Nom système du champ multi-images                | —      |
| `start`     | Index de la première image à inclure (optionnel) | 1      |
| `end`       | Index de la dernière image à inclure (optionnel) | Toutes |

Pour définir une taille pour les images, ajoutez `<%Image()%>` :

```
<%Images(Photo)%><%Image(400)%>
```

Pour récupérer des données supplémentaires (métadonnées) des images, renseignez le champ dans un tableau avec la structure suivante :

<figure><img src="/files/CBYqdQFbsaAYmwYLQJns" alt=""><figcaption></figcaption></figure>

### Redimensionner les images — UseImagesPreview()

Redimensionnez les images avant de les insérer pour réduire le poids du rapport et le temps de génération :

```
<%UseImagesPreview('ImageSize')%>
```

Remplacez `ImageSize` par l'attribut du tableau ci-dessous. Toutes les images situées après cette balise seront redimensionnées en conséquence :

<figure><img src="/files/40Iv869MLidL2h4zSnFB" alt=""><figcaption></figcaption></figure>

{% hint style="info" %}
`UseImagesPreview()` ne permet pas d'extraire les données Exif. Il n'y a pas d'informations Exif sur les images d'aperçu.
{% endhint %}

### Récupérer les commentaires d'une image

Affichez le commentaire associé à une image précise d'un champ image :

```
<%Value:If(Exists('NomDuChampImage#xComment'), [NomDuChampImage#xComment], '')%>
```

{% hint style="info" %}
**Explication :**

* `NomDuChampImage` correspond au nom système du champ image.
* `#x` indique le numéro de l'image (1, 2, 3, etc.).
* `Comment` permet d'accéder au commentaire associé à l'image.
  {% endhint %}

Exemple : `<%Value:If(Exists('Photo#1Comment'), [Photo#1Comment], '')%>`

### Convertir les images en JPG — SetPdfJpegQuality()

Réduisez la taille des images en les convertissant en JPEG. La fonction prend un index de qualité compris entre 1 et 100 :

```
<%SetPdfJpegQuality(10)%>
```

Ajoutez cette balise dans le document Word ou dans une cellule de la feuille PPActions.

### Insérer une image depuis un champ relation (Excel)

Pour insérer une photo issue d'une fiche liée dans un rapport Excel (hors mode listing) :

```
<%Img([RelationshipSystemName.ImageSystemName], 60, 60)%>
```

{% hint style="info" %}
Remplacez le snake\_case par du CamelCase : mettez en majuscule la première lettre de chaque mot du nom système et supprimez les tirets bas.
{% endhint %}

### Map()

Affiche une carte centrée sur les coordonnées GPS de la fiche. Nécessite l'API Google Maps et un champ localisation configuré dans le formulaire.

```
<%Map(latitude, longitude, zoom, width, height, MapType)%>
<%Map(address, zoom, width, height, MapType)%>
```

| Paramètre   | Description                                |
| ----------- | ------------------------------------------ |
| `latitude`  | Champ contenant la coordonnée de latitude  |
| `longitude` | Champ contenant la coordonnée de longitude |
| `address`   | Nom système de votre champ localisation    |
| `zoom`      | 1 à 22 (22 = le plus détaillé)             |
| `width`     | Largeur de la carte en pixels              |
| `height`    | Hauteur de la carte en pixels              |
| `MapType`   | 0 = Street View, 1 = Satellite, 2 = Mixte  |

Exemple avec la localisation par défaut : `<%Map(SubmissionLatitude, SubmissionLongitude, 17, 200, 200)%>`

<figure><img src="/files/gv4CN4M6xSwivzAJM5H1" alt=""><figcaption></figcaption></figure>

Exemple avec un champ localisation : `<%Map(LocalizationIntervention_latitude, LocationIntervention_longitude, 17, 200, 200)%>`

![](/files/RHKX2lebyBYEzyUcWt7N)

### Données Exif — ImageExif()

Récupère les métadonnées Exif stockées dans une photo (données texte, coordonnées GPS, etc.) :

```
<%ImageExif(FieldName, 'ExifAttribute')%>
```

| Paramètre         | Description                                                                                    |
| ----------------- | ---------------------------------------------------------------------------------------------- |
| `FieldName`       | Nom système du champ image                                                                     |
| `'ExifAttribute'` | Clé d'attribut Exif, p. ex. `'DateTime'`, `'GpsLatitude'`, `'GpsLongitude'`, `'GpsLatitudeDM'` |

<figure><img src="/files/t6KXmF2IInlhwI2rCduZ" alt=""><figcaption></figcaption></figure>

**Exemples :**

* Date de l’image : `<%ImageExif(`*`Photo`*`, 'DateTime')%>` *(Résultat : 25/08/2004)*
* Carte depuis le GPS de la photo : `<%Map(ImageExif(LocationField, 'GpsLatitude'), ImageExif(LocationField, 'GpsLongitude'), 17, 150, 150)%>`

![](/files/RHKX2lebyBYEzyUcWt7N)

{% hint style="info" %}
Pour le reporting Excel en mode listing, l'instruction pour obtenir les données Exif est : `<%Value:ImageExif([Photo],'DateTime')%>` *(Résultat : 25/08/2004 09:32)*
{% endhint %}

### Codes-barres — BarCode()

Insère un code-barres dans un document :

```
<%BarCode(data, 'BarCodeType', width, height)%>
```

| Paramètre       | Description                                               |
| --------------- | --------------------------------------------------------- |
| `data`          | La donnée à encoder                                       |
| `'BarCodeType'` | Format du code-barres — voir tableau des types ci-dessous |
| `width`         | Largeur du code-barres en pixels                          |
| `height`        | Hauteur du code-barres en pixels                          |

**Exemple :** `<%BarCode('123456789012', 'EAN13', 120, 120)%>`

![](/files/4k19eMSPfu4IksVd9I6G)

Types de codes-barres disponibles :

| Code                | Description                                                                          |
| ------------------- | ------------------------------------------------------------------------------------ |
| **Code11**          | Principalement utilisé pour l'étiquetage des équipements de télécommunication        |
| **Codabar**         | Ancien code utilisé dans les bibliothèques et les banques de sang                    |
| **EAN13**           | Numérotation européenne des articles — la donnée doit contenir 12 chiffres           |
| **EAN8**            | EAN compressé pour petits produits — la donnée doit contenir 7, 9, 12 ou 13 chiffres |
| **Industrial2of5**  | Ancien code, peu utilisé aujourd'hui                                                 |
| **Interleaved2of5** | Code numérique compact, utilisé dans l'industrie et le fret aérien                   |
| **MSI**             | Variante du code Plessey, courant aux États-Unis                                     |
| **Postnet**         | Utilisé par l'USPS pour le tri automatisé du courrier                                |
| **UPCA**            | Code produit universel pour le commerce — la donnée doit contenir 12 chiffres        |
| **UPCE**            | UPC compressé pour petits produits — la donnée doit contenir 6 ou 7 chiffres         |
| **Matrix2of5**      | La donnée peut contenir un nombre quelconque de chiffres                             |
| **IntelligentMail** | La donnée doit contenir 20 chiffres                                                  |

### QR Codes — QrCode()

Insère un QR code 2D dans un modèle :

```
<%QrCode(data, width, height)%>
```

| Paramètre | Description                  |
| --------- | ---------------------------- |
| `data`    | La donnée à encoder          |
| `width`   | Largeur du QR code en pixels |
| `height`  | Hauteur du QR code en pixels |

Exemple : `<%QrCode('A String To Encode 123456', 150, 150)%>`

<figure><img src="/files/Gfqc7qw6wXn3mWvMEwd7" alt=""><figcaption></figcaption></figure>

### Filigrane — ImageWatermark()

Ajoute une surcouche de texte sur une image :

```
<%ImageWatermark(ImageFieldName, ImageWidth, ImageHeight, WatermarkText, HorzAlign, VertAlign, ForegroundColor, BackgroundColor, BackGroundOpacity, FontSize)%>
```

| Paramètre           | Description                                     | Défaut        |
| ------------------- | ----------------------------------------------- | ------------- |
| `ImageFieldName`    | Nom système du champ image                      | —             |
| `ImageWidth`        | Largeur de l'image en pixels                    | —             |
| `ImageHeight`       | Hauteur de l'image en pixels                    | —             |
| `WatermarkText`     | Texte à afficher sur l'image                    | —             |
| `HorzAlign`         | Alignement horizontal : Left, Center, Right     | Right         |
| `VertAlign`         | Alignement vertical : Top, Middle, Bottom       | Bottom        |
| `ForegroundColor`   | Couleur du texte (#RRGGBB ou constante)         | Red           |
| `BackgroundColor`   | Couleur de fond du texte (#RRGGBB ou constante) | White         |
| `BackGroundOpacity` | Opacité du fond, entre 0 et 1                   | 0 (invisible) |
| `FontSize`          | Taille de police en pixels                      | 12            |

**Exemples :**

```
<%ImageWatermark([Support], 300, 0, 'Welcome')%>
<%ImageWatermark([Support], 300, 0, 'Welcome', 'Left', 'Top', 'Red', 'White', 0.9, 14)%>
```

Pour insérer un retour à la ligne dans le texte du filigrane, utilisez `\u000A` :

```
<%ImageWatermark(ImageSystemName, 300, 0, 'Hello\u000Aworld\u000A!', 'Left', 'Top', 'Red', 'White', 0.9, 14)%>
```

Vous pouvez combiner plusieurs valeurs de données à l'aide de `List()` :

```
<%ImageWatermark([ImageSystemName], 300, 0, List(',', ImageExif(ImageSystemName, 'GpsLatitudeDM'), ImageExif(ImageSystemName, 'GpsLongitudeDM')), 'Left', 'Top', 'Red', 'White', 0.9, 14)%>
```

Pour utiliser la valeur d'un champ comme texte de filigrane :

```
<%ImageWatermark(ImageSystemName, 300, 0, FieldSystemName, 'Center', 'Middle', 'Red', 'White', 0.9, 14)%>
```

![](/files/lYMUBNE3ZcdMN2fTTCsM)

### Filigrane sur un champ multi-images

Lorsqu'un champ image contient plusieurs images, combinez `Images()` et `ImageWatermark()` :

```
<%Images(SystemNameImagefield)%><%ImageWatermark(200, 0, List(',', ImageExif('GpsLatitude'), ImageExif('GpsLongitude')), 'Center', 'Middle', 'Red', 'White', 0.9, 14)%>
```

{% hint style="info" %}
Les instructions combinées doivent être placées dans un tableau au sein du modèle. Le nom système du champ image n'est mentionné qu'une seule fois, dans l'instruction `Images()` — ne le répétez pas dans `ImageWatermark()` ni dans `ImageExif()`.
{% endhint %}

## Fonctions utilitaires

Les fonctions ne sont **pas sensibles à la casse** et peuvent être combinées. Nous recommandons d'utiliser le CamelCase pour les noms de fonctions.

{% hint style="warning" %}
Les noms de champs restent sensibles à la casse dans tous les cas.
{% endhint %}

### Index()

Retourne un numéro de séquence auto-incrémenté dans un tableau de listing.

`<%Index()%>`

![](/files/ss19mTVIcqsy1lWnSmCl)

![](/files/WJl2MOWvekqwsdTO6hfb)

### MapLetter()

Retourne la lettre de l'épingle de carte générée par l'API Google Maps pour un point de localisation. À utiliser en combinaison avec `Map()`.

`<%MapLetter()%>`

![](/files/eTR1WQIdveHRdhkYPGH1)

<figure><img src="/files/tFiBHTavQCez67ZY1DfJ" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/eK6wbYGR7mwKnVBzx3Oo" alt=""><figcaption></figcaption></figure>

### Format() — dates et nombres

Convertit un champ Date ou Nombre dans un format d'affichage spécifique. `F()` est un raccourci pour `Format()`.

```
<%Format('FormatString', FieldName)%>
<%F('FormatString', FieldName)%>
```

| Paramètre        | Description                                |
| ---------------- | ------------------------------------------ |
| `'FormatString'` | Modèle de format — voir tableau ci-dessous |
| `FieldName`      | Champ Date ou Nombre à formater            |

Les formats disponibles sont présentés dans le tableau ci-dessous :

<figure><img src="/files/oGEGvjkr1ZeY8eNynG6w" alt=""><figcaption></figcaption></figure>

**Exemples** (avec Price = 19.3 et Date = 14/02/2012 15:14:20) :

* `<%Format('0.00', Price)%>` → **19.30**
* `<%F('yyyy-MM-dd', Date)%>` → **2023-02-16**

#### Date()

Retourne la date et l'heure actuelles :

```
<%Date()%>
<%F('dd/MM/yyyy', Date())%>
```

#### AddHours()

Ajoute ou retire des heures à un champ date/heure :

```
<%AddHours(SystemName, NumberHours)%>
```

Exemple : `<%AddHours(DateTime, -6)%>` *(Résultat : 14/02/2023 06:00:00 au lieu de 12:00:00)*

{% hint style="info" %}
Utilisez un nombre positif pour ajouter des heures : `<%AddHours(DateTime, 6)%>`
{% endhint %}

#### AddDays()

```
<%AddDays(Date, NumberOfDays)%>
```

`NumberOfDays` peut être positif ou négatif. Exemple : `<%AddDays(Date(), -5)%>`

#### AddMonths()

```
<%AddMonths(Date, NumberOfMonths)%>
```

Exemple : `<%AddMonths(Created, -1)%>`

#### AddYears()

```
<%AddYears(Date, NumberOfYears)%>
```

Exemple : `<%AddYears(Created, +2)%>`

### Add()

Retourne la somme de plusieurs valeurs numériques. Les valeurs nulles ou vides sont traitées comme 0.

```
<%Add(Value1, Value2, Value3, …)%>
```

Exemple : `<%Add(Size1, Size2, Size3)%>` — avec Size1=5.3, Size2=2.3, Size3=null → **7.6**

### Manipulation de chaînes

Une chaîne de caractères s'exprime via `<%String()%>` ou son raccourci `<%S()%>`.

#### Concaténation

Utilisez l'opérateur `+` pour concaténer des chaînes. Lors du mélange de types, convertissez d'abord les nombres en chaînes avec `S()` :

`<%S(Price) + ' Euros'%>` → **14.32 Euros**

#### ToUpper() / ToLower()

```
<%ToUpper(FieldName)%>
<%ToLower(FieldName)%>
```

#### List()

Crée une liste séparée à partir de plusieurs valeurs. Si un élément est vide, son séparateur est omis :

```
<%List(separator, value1, value2, …)%>
```

| Paramètre           | Description                       |
| ------------------- | --------------------------------- |
| `separator`         | Chaîne à placer entre les valeurs |
| `value1, value2, …` | Champs ou valeurs à assembler     |

Exemple : `<%List(', ', Address, PostalCode, City, Country)%>` → **12 rue des églantiers, 17400, Lacanau, France**

Peut être combiné avec `Map()` pour produire une adresse valide à partir de champs séparés.

#### Split()

Extrait une valeur d'une chaîne contenant un séparateur. L'index commence à 0 :

```
<%Split(string, separator, IndexToExtract)%>
```

| Paramètre        | Description                           |
| ---------------- | ------------------------------------- |
| `string`         | La chaîne ou le champ à découper      |
| `separator`      | Le caractère délimiteur               |
| `IndexToExtract` | Index (base 0) du segment à retourner |

Exemple : `<%Split(Address, ',', 2)%>` — avec Address = « 12, rue des mines, Puteaux, 92800, France » → **Puteaux**

### Conversion de type

#### ToNumber() / N()

Convertit une chaîne de texte en nombre :

```
<%ToNumber(FieldName)%>
<%N(FieldName)%>
```

Exemple : `<%Format('0.00', N(Price))%>` — avec Price = « 127.4202 » → **127.42**

{% hint style="info" %}
Le nombre converti peut utiliser une virgule `,` ou un point `.` comme séparateur décimal — les deux sont pris en charge.
{% endhint %}

#### ToDate() / D()

Convertit une date texte en date réelle :

```
<%ToDate(FieldName)%>
<%D(FieldName)%>
```

Exemple : `<%F('dd/MM/yyyy', ToDate(Date))%>` — avec Date = « 14/02/2012 15:24:10 » → **14/02/2012**

#### ToString() / S()

Convertit le contenu d'un champ en chaîne :

```
<%ToString(FieldName)%>
<%S(FieldName)%>
```

## Instructions conditionnelles

### If()

Affiche une valeur selon une condition :

```
<%If(condition, 'TrueResult', 'FalseResult')%>
```

| Paramètre                    | Description                                                                             |
| ---------------------------- | --------------------------------------------------------------------------------------- |
| `condition`                  | Expression booléenne (p. ex. `Field = 'Value'`). Utilisez `&&` pour ET, `\|\|` pour OU. |
| `'TrueResult'`               | Valeur retournée si la condition est vraie                                              |
| `'FalseResult'`              | Valeur retournée si la condition est fausse                                             |
| `'NotSetResult'` (optionnel) | Valeur retournée si le champ est vide — active la forme raccourcie à 3 valeurs          |

La condition doit retourner `true` ou `false`. Les opérateurs pris en charge sont :

| Opérateur | Signification |
| --------- | ------------- |
| `=`       | Égal à        |
| `<>`      | Différent de  |
| `!=`      | Non égal      |
| `&&`      | ET            |
| `\|\|`    | OU            |

Vous pouvez combiner plusieurs comparaisons de champs avec `&&` et `||` :

```
<%If((Boolean='True' && Statut='Création'), 'valueIfTrue', 'valueIfFalse')%>
```

**Exemple booléen** — couvre les trois états possibles (true, false, non défini) :

```
<%If(Booleen='True', 'Yes', '')%><%If(Booleen='False', 'No', '')%><%If(Booleen='', '', '')%>
```

Ou avec la forme raccourcie à 3 valeurs :

```
<%If(MyBoolean, 'valueIfTrue', 'valueIfFalse', 'valueIfNotSet')%>
```

{% hint style="info" %}
Le caractère apostrophe diffère entre Word et Excel. Si vous copiez-collez un modèle de l'un vers l'autre, remplacez les apostrophes manuellement.
{% endhint %}

### Exists()

Teste si un champ existe dans le formulaire :

```
<%Exists('FieldName')%>
```

Retourne `true` ou `false`. Particulièrement utile pour vérifier la présence d'images :

```
<%If(Exists('Photos#1'), Image([Photos#1], 180), '')%>
```

### Hide() / Display() / DisplayRow()

Ces fonctions affichent ou masquent des sections entières du document selon une condition. Terminez toujours par `<%End%>`.

#### Hide()

Masque une section lorsque la condition est vraie :

```
<%Hide(Condition)%> Contenu à masquer <%End%>
```

Opérateurs booléens pris en charge :

| Opérateur | Signification |
| --------- | ------------- |
| `\|\|`    | OU            |
| `&&`      | ET            |
| `<>`      | Différent de  |
| `==`      | Égal          |
| `!=`      | Non égal      |

Exemples :

```
<%Hide((Field1 == 'value' || Field1 == 'value2') && Field3 != '')%> Contenu masqué <%End%>
```

<figure><img src="/files/sYNyJQ48EPzDgmopDbGQ" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/VilS4y3WCToD1cKjjstm" alt=""><figcaption></figcaption></figure>

#### Display()

Affiche une section lorsque la condition est vraie (inverse de `Hide()`) :

```
<%Display(Condition)%> Contenu à afficher <%End%>
```

{% hint style="warning" %}
Il n'est pas possible d'utiliser à la fois `Hide()` et `Display()` dans la même condition.
{% endhint %}

#### DisplayRow()

Disponible uniquement dans les tableaux. Affiche une ligne lorsque la condition est vraie. Doit être placée dans la première cellule (la plus à gauche) de la ligne, avant tout autre contenu :

```
<%DisplayRow(Condition)%>
```

{% hint style="warning" %}
Il n'est pas possible d'utiliser à la fois `Hide()` et `DisplayRow()` dans la même condition. Il n'est pas non plus possible d'afficher l'*utilisateur courant* dans les rapports.
{% endhint %}

### Contains()

Retourne `true` si une chaîne contient un motif donné :

```
<%Contains(String, pattern)%>
```

| Paramètre | Description                    |
| --------- | ------------------------------ |
| `String`  | Le champ ou la chaîne à tester |
| `pattern` | La sous-chaîne à rechercher    |

Exemple : `<%If(Contains(Field, 'measurement'), 'MEASURE', 'NOTHING')%>`

{% hint style="info" %}
La comparaison est sensible à la casse. Utilisez `ToUpper()` ou `ToLower()` en combinaison avec `Contains()` pour une comparaison insensible à la casse : `<%If(Contains(ToUpper(Field), 'MEASURE'), 'MEASURE', 'NOTHING')%>`
{% endhint %}

### StartsWith()

Retourne `true` si une chaîne commence par la valeur spécifiée :

```
<%StartsWith(String, Pattern)%>
```

| Paramètre | Description                    |
| --------- | ------------------------------ |
| `String`  | Le champ ou la chaîne à tester |
| `Pattern` | Le préfixe à rechercher        |

Exemple : `<%If(StartsWith(Field, 'default'), 'Default value', '')%>`

### EndsWith()

Retourne `true` si une chaîne se termine par la valeur spécifiée :

```
<%EndsWith(String, Pattern)%>
```

| Paramètre | Description                    |
| --------- | ------------------------------ |
| `String`  | Le champ ou la chaîne à tester |
| `Pattern` | Le suffixe à rechercher        |

Exemple : `<%If(EndsWith(Field, 'END'), 'end', '')%>`

## Relation

Pour inclure les données d'un formulaire enfant lié, utilisez l'instruction `Relation()` dans un tableau :

```
<%Relation('Libellé du champ relation')%>
```

La ligne du tableau se répète une fois pour chaque fiche enfant. Si aucune fiche enfant n'est liée, le tableau est vide.

Exemple :

<figure><img src="/files/wbeQf8fEpXEoFdF3MI97" alt=""><figcaption></figcaption></figure>

Résultat :

![](/files/q0GIpnkIfPinfCzBbEfq)

{% hint style="info" %}
Le type de champ « Élément de relation » n'est pas persistant et ne peut pas être utilisé dans un rapport.
{% endhint %}

### Trier une relation

Triez les fiches enfants selon la valeur d'un champ. Ajoutez le nom système du champ en second paramètre.

Tri ascendant : `<%Relation('Libellé de relation', 'SystemNameOfField')%>`

Tri descendant : `<%Relation('Libellé de relation', 'SystemNameOfField DESC')%>`

![](/files/QbT7lbwDw9vlUddH6BNJ)

<figure><img src="/files/6nmCCVcArHm6yvkGaHxp" alt=""><figcaption></figcaption></figure>

### Filtrer par sous-formulaire

Lorsqu'un champ relation pointe vers plusieurs sous-formulaires, filtrez par nom de formulaire :

```
<%Relation('Libellé de relation', OrderBy, StructureName='Nom du formulaire')%>
```

* `OrderBy` correspond au tri décrit ci-dessus (laissez une chaîne vide `''` pour l'ignorer)
* `StructureName` est le nom du formulaire sur lequel filtrer

Exemple — ne conserver que les fiches du sous-formulaire « Anomalie » :

```
<%Relation('Anomalies observed', '', StructureName='Anomaly')%>
```

### Limiter le nombre de fiches enfants

Passez la limite en 4ᵉ paramètre :

```
<%Relation('Relation0', 'FieldX DESC', StructureName='Form name', 2)%><%[String0]%>
```

| Paramètre                   | Description                                 |
| --------------------------- | ------------------------------------------- |
| `'Relation0'`               | Nom système du champ relation               |
| `'FieldX'`                  | Champ de tri (optionnel)                    |
| `StructureName='Form name'` | Formulaire sur lequel filtrer (optionnel)   |
| `2`                         | Nombre maximum de fiches enfants à afficher |

### Compter les fiches enfants

Cette option ne peut-être utilisée qu’avec l’option Multiple activée pour la relation, car ce n’est pas un champ de création de données mais de liaison

Affiche le nombre de fiches dans une relation :

`<%[Relation.Count]%>`

{% hint style="warning" %}
Les majuscules sont requises — `Relation.Count` doit être écrit exactement comme indiqué.
{% endhint %}

Exemple

![](/files/UYFTAdhjuiq4SolfMDR8)

### Relations imbriquées

Il est possible d'insérer la relation d'une relation dans votre rapport. Pour cela, il faut créer un premier tableau et y insérer votre première relation, puis insérer un deuxième tableau à l'intérieur du premier tableau :

Dans l'exemple suivant nous verrons comment insérer dans un premier tableau une relation du formulaire, nommée **"libellé de la relation"** puis comment insérer dans un deuxième tableau imbriqué une relation d'un autre formulaire lui même étant une relation du sous formulaire. Cette dernière relation se nomme "**libellé de la relation de relation**".

Il est possible d'imbriquer une relation dans une autre en créant un second tableau à l'intérieur du premier. Vous pouvez descendre jusqu'à **8 niveaux**.

![](/files/VnUahNdZVEKV1w5FDsS9)

## Fonctions d'agrégation

{% hint style="info" %}
Les arguments des fonctions d'agrégation doivent toujours être entourés de guillemets simples. Exemple : `<%Sum('ToNumber(Price)')%>`
{% endhint %}

### Count()

Compte le nombre total de fiches de l'ensemble courant :

`<%Count()%>`

Cette instruction peut être utilisée n'importe où dans le document.

### Sum()

Retourne la somme d'un champ numérique sur toutes les fiches :

`<%Sum('FieldName')%>`

Si le type de champ n'est pas garanti numérique, utilisez `N()` pour convertir : `<%Sum('N(Price)')%>`

### Avg()

Retourne la valeur moyenne d'un champ :

`<%Avg('FieldName')%>`

### Min() / Max()

Retourne la valeur minimale ou maximale d'un champ :

`<%Min('FieldName')%>` / `<%Max('FieldName')%>`

### GlobalMap()

Affiche tous les points de localisation de plusieurs fiches sur une même carte. Nécessite un modèle en mode listing.

```
<%GlobalMap('LatitudeField', 'LongitudeField', ConnectPoints, Width, Height, MapType)%>
```

| Paramètre        | Description                                                               |
| ---------------- | ------------------------------------------------------------------------- |
| `LatitudeField`  | Nom du champ contenant les valeurs de latitude (entre guillemets)         |
| `LongitudeField` | Nom du champ contenant les valeurs de longitude (entre guillemets)        |
| `ConnectPoints`  | `true` pour relier les points par une ligne, `false` pour épingles seules |
| `Width`          | Largeur de la carte en pixels                                             |
| `Height`         | Hauteur de la carte en pixels                                             |
| `MapType`        | 0 = Route, 1 = Aérien, 2 = Mixte                                          |

Exemple : `<%GlobalMap('latitude', 'longitude', true, 300, 300, 0)%>`

![](/files/L9LbeIFStLOwTJM7FtHQ)

Avec une relation :

<figure><img src="/files/rQs3kNnv63fsRu4jjcQV" alt=""><figcaption></figcaption></figure>

### Chart()

Affiche un graphique en barres ou en camembert à partir de données agrégées :

```
<%Chart(GraphType, AggregationFunction, LabelField, DisplayValues, Width, Height)%>
```

| Paramètre             | Description                                                                 |
| --------------------- | --------------------------------------------------------------------------- |
| `GraphType`           | `'Pie'`, `'Pie3D'` ou `'Bar'`                                               |
| `AggregationFunction` | Une fonction telle que `Count()` ou `Sum(field)`                            |
| `LabelField`          | Nom du champ utilisé pour grouper et étiqueter les résultats                |
| `DisplayValues`       | `true` pour afficher les valeurs sur le graphique, `false` pour les masquer |
| `Width`               | Largeur du graphique en pixels                                              |
| `Height`              | Hauteur du graphique en pixels                                              |

**Exemples :**

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

<figure><img src="/files/abjJBIG1AcKn0GohukqM" alt=""><figcaption></figcaption></figure>

`<%Chart('Pie3d', 'Sum(Price)', 'ReparationType', false, 600, 300)%>`

<figure><img src="/files/8tHifycq8YgNoMXWsiQ8" alt=""><figcaption></figcaption></figure>

`<%Chart('Pie', 'Count()', 'TypeReparation', true, 600, 300)%>`

<figure><img src="/files/FXYvBw6c0OGOwbt5c0G4" alt=""><figcaption></figcaption></figure>

## Cas particuliers

### Champs Liste

#### Isoler un niveau dans une liste arborescente

Par défaut : `<%ListSystemName%>`

Pour une liste arborescente avec résultat A,B,C :

| Valeur souhaitée    | Syntaxe                                                            |
| ------------------- | ------------------------------------------------------------------ |
| Premier niveau (A)  | `<%[ListSystemName.FirstLevel]%>` ou `<%[ListSystemName.Level1]%>` |
| Deuxième niveau (B) | `<%[ListSystemName.Level2]%>`                                      |
| Dernier niveau (C)  | `<%[ListSystemName.LastLevel]%>` ou `<%[ListSystemName.LevelN]%>`  |

Pour une liste à choix multiples (sans arborescence) avec résultat A | B | C :

| Valeur souhaitée     | Syntaxe                      |
| -------------------- | ---------------------------- |
| Premier élément (A)  | `<%[ListSystemName.Item1]%>` |
| Deuxième élément (B) | `<%[ListSystemName.Item2]%>` |
| Nième élément        | `<%[ListSystemName.ItemN]%>` |

Pour une liste à choix multiples avec arborescence (résultat : A,A1 | B,B1 | C,C1) :

| Valeur souhaitée                 | Syntaxe                                     |
| -------------------------------- | ------------------------------------------- |
| Premier élément complet          | `<%[ListSystemName.Item1]%>` → A,A1         |
| Premier élément, premier niveau  | `<%[ListSystemName.Item1.Level1]%>` → A     |
| Deuxième élément, dernier niveau | `<%[ListSystemName.Item2.LastLevel]%>` → B1 |

{% hint style="info" %}
Pour obtenir à la fois l'élément de liste et son parent, utilisez un champ formule.
{% endhint %}

#### Valeurs annexes d'une liste

Une valeur de liste peut porter des sous-valeurs (identifiant externe, URL, image, couleur) :

| Valeur                         | Syntaxe                                                   |
| ------------------------------ | --------------------------------------------------------- |
| Identifiant externe            | `<%[ListSystemName.ExternalId]%>`                         |
| URL                            | `<%[ListSystemName.Url]%>`                                |
| Image (taille 50 px)           | `<%Img([ListSystemName.Image], 50)%>`                     |
| Code couleur                   | `<%[ListSystemName.Color]%>`                              |
| Valeur colorée avec sa couleur | `<%TextColor([ListSystemName], [ListSystemName.Color])%>` |

Syntaxe des sous-valeurs par élément (exemple pour le premier élément) :

* `<%[ListSystemName.Item1.ExternalId]%>`
* `<%[ListSystemName.Item1.Url]%>`
* `<%[ListSystemName.Item1.Image]%>`
* `<%[ListSystemName.Item1.Color]%>`

{% hint style="warning" %}
Le type de champ « Élément de liste » n'est pas persistant — il ne peut pas être utilisé dans un rapport. Les identifiants externes ne doivent pas contenir de caractères spéciaux (par exemple le tiret bas `_`).
{% endhint %}

### Champs Utilisateur

#### Tous les utilisateurs d'un champ

Dans ces exemples, le nom système du champ est `UserFieldName` :

| Information                                             | Syntaxe                         |
| ------------------------------------------------------- | ------------------------------- |
| Tous les prénoms (séparés par virgule)                  | `<%[UserFieldName.FirstName]%>` |
| Tous les noms (séparés par virgule)                     | `<%[UserFieldName.LastName]%>`  |
| Tous les noms complets (séparés par virgule)            | `<%[UserFieldName.FullName]%>`  |
| Tous les e-mails (séparés par virgule)                  | `<%[UserFieldName.Email]%>`     |
| Nom complet ou e-mail (selon paramétrage du formulaire) | `<%[UserFieldName]%>`           |

#### Utilisateur spécifique dans un champ

| Information               | Syntaxe                              |
| ------------------------- | ------------------------------------ |
| E-mail de l'utilisateur 1 | `<%[UserFieldName.User1.Email]%>`    |
| Nom de l'utilisateur 4    | `<%[UserFieldName.User4.LastName]%>` |
| Prénom de l'utilisateur 2 | `<%UserFieldName.User2.FirstName%>`  |

### État de workflow

| Information                      | Syntaxe                                 |
| -------------------------------- | --------------------------------------- |
| État courant (langue par défaut) | `<%[Submission.CurrentState]%>`         |
| Est-ce un état final ?           | `<%[Submission.CurrentState.End]%>`     |
| Couleur de l'état                | `<%[Submission.CurrentState.Color]%>`   |
| Nom de l'état en français        | `<%[Submission.CurrentState.Name.FR]%>` |
| Nom de l'état en anglais         | `<%[Submission.CurrentState.Name.EN]%>` |

Afficher l'état courant avec sa couleur associée :

```
<%Display(Exists('Submission.CurrentState'))%><%TextColor('█',[Submission.CurrentState.Color])%><%[Submission.CurrentState]%><%End%>
```

### Champ Durée

Il n'est pas possible de récupérer directement une valeur de champ Durée dans un rapport Word. Utilisez un champ Formule JavaScript pour la convertir au préalable, puis incluez ce champ formule dans le rapport.

Exemple de formule JavaScript pour récupérer la valeur de la durée :

```javascript
var given_seconds = items['SYSTEM_NAME_OF_DURATION_FIELD'] / 1000;
var dateObj = new Date(given_seconds * 1000);
var hours = dateObj.getUTCHours();
var minutes = dateObj.getUTCMinutes();
var seconds = dateObj.getSeconds();
var timeString = hours.toString().padStart(2, '0') + 'h'
              + minutes.toString().padStart(2, '0') + 'min'
              + seconds.toString().padStart(2, '0');
return timeString;
```

### Champ Signature

Utilisez `<%Image()%>` avec le nom système du champ signature et la taille souhaitée :

```
<%Image(Sign1, 80)%>
```

### Champ Fichier — FileImage() et FilePageCount()

#### FileImage()

Insère une ou toutes les pages d'un PDF attaché à un champ fichier sous forme d'images dans le rapport :

```
<%FileImage('FileFieldName', PageNumber, Width, Dpi)%>
```

| Paramètre       | Type           | Description                                      | Défaut  |
| --------------- | -------------- | ------------------------------------------------ | ------- |
| `FileFieldName` | string         | Nom système du champ fichier                     | —       |
| `PageNumber`    | int ou `'All'` | Numéro de page à insérer, ou `'All'` pour toutes | `'All'` |
| `Width`         | int            | Largeur de l'image d'aperçu en pixels            | 585     |
| `Dpi`           | int            | Résolution d'affichage (points par pouce)        | 92      |

**Exemples :**

```
<%FileImage('File')%>
→ Insère la première page du premier PDF attaché.

<%FileImage('File', 2)%>
→ Insère la seconde page du premier PDF attaché.

<%FileImage('File', 1, 300)%>
→ Insère la première page, redimensionnée à 300 px de large.

<%FileImage('File', 'All', 650, 120)%>
→ Insère toutes les pages, 650 px de large à 120 DPI.
```

Pour afficher le second document attaché :

```
<%FileImage('File#2')%>
```

{% hint style="warning" %}
Seuls les fichiers PDF sont pris en charge. L'insertion de plusieurs pages peut augmenter le temps de génération du rapport. Dans les rapports de type listing, gardez la taille totale du document raisonnable.
{% endhint %}

#### FilePageCount()

Retourne le nombre total de pages d'un PDF attaché :

```
<%FilePageCount('FileFieldName')%>
```

#### Autres expressions liées aux fichiers

| Expression                     | Description                       |
| ------------------------------ | --------------------------------- |
| `<%[File.Count]%>`             | Nombre total de fichiers attachés |
| `<%[File]%>` ou `<%[File#1]%>` | Accède au premier fichier attaché |
| `<%[File#2]%>`                 | Accède au second fichier attaché  |
| `<%[File#1Name]%>`             | Nom du premier fichier            |
| `<%[File#1MimeType]%>`         | Type MIME du premier fichier      |
| `<%[File#1Extension]%>`        | Extension du fichier              |
| `<%[File#1Size]%>`             | Taille du fichier en octets       |

{% hint style="info" %}
Vous cherchez des exemples concrets de bout en bout ? Consultez le [Cookbook Syntaxe et fonctions](/user-documentation/documentation-utilisateur/build/building-the-reporting/syntax-functions-cookbook.md) pour des modèles de rapport réels combinant plusieurs fonctions.
{% endhint %}


---

# 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.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.
