Instructions de Boucle dans une Variable Dynamique (DynVar Loop Statement)
Sommaire
Introduction
Les Variables Dynamiques (DynVar) permettent de définir une valeur à partir d'une formulaire, contrairement aux variables de saisie pour lesquelles une valeur est fixée lors du remplissage d'un formulaire par exemple.
L'Instruction de Boucle (loop-statement) au sein d'une Variable Dynamique correspond à une syntaxe spécifique, à placer en première ligne de la formule d'une Variable Dynamique, et qui permet d'indiquer que, pour une variable de liste et une formule (SmartExpression) données, la formule doit être exécutée (calculée) autant de fois que d'éléments présents dans la liste.
Syntaxe
Il existe deux types d'instruction de boucle :
- "map" qui permet de produire une liste à partir d'une liste existante (mapping), où chaque élément de la liste produite est le résultat d'une formule (une SmartExpression) ;
- "reduce" qui permet de produire une valeur simple (un nombre, une date, une chaîne de caractère…) à partir d'une liste existante, sur laquelle aura été appliqué une formule (une SmartExpression) sur chacun de ses éléments ;
L'instruction de boucle est à insérer comme la première ligne d'une formule de Variable Dynamique. Voir exemple de paramétrage via un tableau Excel :
Les instructions de boucle contiennent 3 parties paramétrables :
- Le type de fonction de boucle (#map ou #reduce)
- Les définitions des variables de boucle : sous la forme
LISTE as LIST_ITEM
, où LISTE est une variable de liste existante, et LIST_ITEM est un "alias" utilisable seulement dans le corps de cette boucle, et qui aura pour valeur, tour à tour, chaque élément de la liste.
- La SmartExpression a executer en boucle
Le Mapping
Les instructions de boucle de type #map
permettent de produire une liste à partir d'une liste existante, où chaque élément de la liste produite est le résultat de la SmartExpression fournie.
Ce type de boucle est principalement utilisée pour créer des listes de correspondance. Chaque entrée d'une liste étant constitué d'une clé et d'un élément correspondant, le mapping va permettre de créer une nouvelle liste, pour laquelle les clés sont conservées mais les éléments sont remplacés par le résultat de la SmartExpression.
Définition de variables de la boucle : Dans le cadre d'une boucle #map
une seule définition de variable est attendue : la liste à parcourir vers l'élément de l'itération courante (l'alias).
Ex: ASSOCIES_LIST as ASSOCIE
, CHILDREN_LIST as CHILD_ITEM
etc …
- Exemple de DynVar avec #map
Obtenir une liste PARTNERS_POURCENT_LIST
, où pour chaque associé d'une liste ASSOCIES, on va calculer le pourcentage de part qui revient à chacun d'eux, sur un total de 5000 parts :
#map list ASSOCIES as ASSOCIE_ITEM (ASSOCIE_ITEM.ACTIONS / 5000) * 100
Reduce
Les instructions de boucle de type #reduce
permettent de produire une valeur simple (un nombre, une date, une chaîne de caractère…) à partir d'une liste existante, sur laquelle aura été appliqué une formule (la SmartExpression) sur chacun de ses éléments ;
Définition de variables de la boucle : Dans le cadre d'une boucle #reduce
, deux définitions de variable sont attendues : la liste à parcourir vers l'élément de l'itération courante (l'alias), et, la valeur initiale (ex: 0, true…) de la variable spéciale _PREV (qui a pour valeur le résultat de l'itération précédente et dont la dernière valeur sera celle de la Variable Dynamique.
Exemples de Variables Dynamiques avec #reduce
Obtenir une valeur booléenne IS_ANY_ASSOCIEE_NAMED_DAM
, qui vaut TRUE, si pour une liste d'ASSOCIES, au moins un des membres s'appelle "Damien" :
#reduce list ASSOCIES as ASSOCIE_ITEM, false as _PREV : _PREV or ASSOCIE_ITEM.PRENOM == "DAMIEN"
__
Obtenir une valeur booléenne IS_ALL_PARTNERS_TEN_POURCENT
, valant TRUE, si pour une liste d'ASSOCIES, tous les membres ont plus de 500 parts :
#reduce list ASSOCIES as ASSOCIE_ITEM, true as _PREV : _PREV and ASSOCIE_ITEM.ACTIONS > 500.0
__
Renvoie une variable numérique COUNT_PARTNERS_WITH_500_OR_MORE
donnant le nombre des associés qui ont au moins 500 parts :
#reduce list ASSOCIES as ASSOCIE_ITEM, 0 as _PREV : _PREV + (ASSOCIE_ITEM.ACTIONS > 500.0 ? 1 : 0)
__
Renvoie une variable numérique AVERAGE_PARTNERS_YEARS_OLD
, correspondant à la moyenne d'âge de tous les associés :
#reduce list ASSOCIES as ASSOCIE_ITEM, 0 as _PREV : _PREV + (ASSOCIE_ITEM.AGE / ASSOCIES._COUNT)
(coming soon)