SmartExpressions : Différence entre versions

De YoWiki
Sauter à la navigation Sauter à la recherche
 
(21 révisions intermédiaires par 2 utilisateurs non affichées)
Ligne 91 : Ligne 91 :
 
   <li> 2 - Un nombre entier (positif ou négatif) </li>
 
   <li> 2 - Un nombre entier (positif ou négatif) </li>
 
   <li> 3 - L'unité sous forme d'une chaîne de caractères parmi : "year"; "month"; "day"; "hour"; "minute"; "second". <br/>
 
   <li> 3 - L'unité sous forme d'une chaîne de caractères parmi : "year"; "month"; "day"; "hour"; "minute"; "second". <br/>
       Unité spéciale pour la France et ses territoires :  "jour_ouvrable", "jour_ouvré", "jour_franc", "mois_franc" (tenant compte des jours fériés Français)
+
       + Unité spéciale pour la France et ses territoires :  "jour_ouvrable", "jour_ouvré", "jour_franc", "mois_franc" (tenant compte des jours fériés Français) <br/>
 +
      + Mais aussi l'unité particulière `month_quant` qui correspond à une règle administrative courante dîtes de "mois de même quantième". On parle par exemple d'un délais de 3 mois au même quantième. Cela signifie que l'on avance de 3 mois et que le jour de destination doit être le même que celui de départ (Ex: 15 Mars + 3 mois = 15 juin). Néanmoins, cette unité prend aussi en compte le fait que si la date de destination n'existe pas (ex: 31 Aout + 1 mois), alors on renvoie le dernier jour du mois de destination (= ici le 30 Septembre).
 +
 
 
   </li>
 
   </li>
 
   <li> 4 - '''''(facultatif)''''' La zone géographique qui doit être utilisée pour calculer les jours fériés (utile uniquement pour le calcul des jours spéciaux tel que ''jour_ouvré'' etc.). À choisir parmi : ''Métropole, Alsace-Moselle, Guadeloupe, Guyane, Martinique, Mayotte, Nouvelle-Calédonie, La Réunion,
 
   <li> 4 - '''''(facultatif)''''' La zone géographique qui doit être utilisée pour calculer les jours fériés (utile uniquement pour le calcul des jours spéciaux tel que ''jour_ouvré'' etc.). À choisir parmi : ''Métropole, Alsace-Moselle, Guadeloupe, Guyane, Martinique, Mayotte, Nouvelle-Calédonie, La Réunion,
Ligne 143 : Ligne 145 :
 
# Fonction : <code>date_diff</code>
 
# Fonction : <code>date_diff</code>
 
# Nombre de paramètres : <code>3</code>
 
# Nombre de paramètres : <code>3</code>
# Paramètres attendus : Date de début, Date de fin, Une chaîne de caractères parmi : year; month; day; hour; minute; second
+
<ul style="margin-left:50px">
 +
  <li> 1 - Date de départ (variable provenant d'un DateInput, ou chaîne format "d-m-Y H:i")</li>
 +
  <li> 2 - Date de fin (variable provenant d'un DateInput, ou chaîne format "d-m-Y H:i")</li>
 +
  <li> 3 - L'unité dans laquelle renvoyer la différence entre les deux dates. L'unité est fournie sous la forme d'une chaîne de caractères parmi : "year"; "month"; "day"; "hour"; "minute"; "second". <br/>
 +
      + Unité spéciale pour la France et ses territoires :  "jour_ouvrable", "jour_ouvré" <br/>
 +
  </li>
 +
  <li> 4 - '''''(facultatif)''''' La zone géographique qui doit être utilisée pour calculer les jours fériés (utile uniquement pour le calcul des jours spéciaux tel que ''jour_ouvré'' etc.). À choisir parmi : ''Métropole (par défaut), Alsace-Moselle, Guadeloupe, Guyane, Martinique, Mayotte, Nouvelle-Calédonie, La Réunion,
 +
Polynésie Française, Saint-Barthélémy, Saint-Martin, Wallis-et-Futuna, Saint-Pierre-et-Miquelon''.
 +
  </li>
 +
</ul>
  
 
Renvoie un nombre (valeur absolue) correspondant à la différence, entre la Date de début et la Date de fin, dans l'unité spécifiée.  
 
Renvoie un nombre (valeur absolue) correspondant à la différence, entre la Date de début et la Date de fin, dans l'unité spécifiée.  
 +
Notez que la date de fin n'est généralement pas inclue dans la comptage de la différence.
 +
 
<div style="margin-left: 30px">  
 
<div style="margin-left: 30px">  
 
   <p><b style="color: #777;">Par exemple :</b></p>
 
   <p><b style="color: #777;">Par exemple :</b></p>
Ligne 151 : Ligne 164 :
 
   <p> ▷ <code>date_diff(DATE_SIGNATURE,"20-09-2004","year")</code>  =>  renvoie <code>15</code> car 15 années se sont écoulées <br/>
 
   <p> ▷ <code>date_diff(DATE_SIGNATURE,"20-09-2004","year")</code>  =>  renvoie <code>15</code> car 15 années se sont écoulées <br/>
 
       ▷ <code>date_diff("20-09-2004",DATE_SIGNATURE, "year")</code>  =>  renvoie aussi <code>15</code> (la valeur est absolue, peu importe l'ordre des dates) <br/>
 
       ▷ <code>date_diff("20-09-2004",DATE_SIGNATURE, "year")</code>  =>  renvoie aussi <code>15</code> (la valeur est absolue, peu importe l'ordre des dates) <br/>
       ▷ <code>date_diff("20-09-2004",DATE_SIGNATURE, "day")</code>  =>  renvoie <code>5732</code> (le nombre total de jour entre les deux dates)
+
       ▷ <code>date_diff("20-09-2004",DATE_SIGNATURE, "day")</code>  =>  renvoie <code>5732</code> (le nombre total de jour entre les deux dates) <br/>
 +
      ▷ <code>date_diff("01-05-2020","31-05-2020", "day")</code>  =>  renvoie <code>30</code> (le nombre total de jour entre le 01 et le 31 Mai, le 31 Mai n'étant pas inclu). <br/>
 +
      ▷ <code>date_diff("01-05-2020","31-05-2020", "jour_ouvré")</code>  =>  renvoie <code>18</code> (le nombre de jours ouvrés entre le 01 et le 31 Mai 2020). <br/>
 +
      ▷ <code>date_diff("01-05-2020","31-05-2020", "jour_ouvré", "Martinique")</code>  =>  renvoie <code>17</code> (le nombre de jours ouvrés entre le 01 et le 31 Mai 2020 en Martinique, car contrairement à la Métropole, le 22 Mai est aussi férié). <br/>
 +
 
 
   </p>
 
   </p>
 
</div>
 
</div>
Ligne 183 : Ligne 200 :
  
 
<p>Par exemple : <code>date_month(DATE_SIGNATURE)</code></p>
 
<p>Par exemple : <code>date_month(DATE_SIGNATURE)</code></p>
 +
 +
===== Connaître le jour de la semaine =====
 +
 +
# Fonction : <code>date_weekday</code> , renvoie la valeur numérique du jour de la semaine (1 pour lundi, 7 pour dimanche).
 +
 +
# Nombre de paramètres : <code>1</code>
 +
# Paramètres attendus : Une date
 +
 +
<p>Par exemple : <code>date_weekday(DATE_SIGNATURE)</code> => Renvoie 1 pour lundi, 2 pour mardi…, 6 pour samedi, 7 pour dimanche</p>
 +
 +
===== Savoir si le jour est ouvrable, ouvré, ou férié =====
 +
 +
# Fonction : <code>day_is</code> , renvoie un booléen (VRAI ou FAUX) si la date est du type demandé.
 +
 +
# Paramètres attendus : <code>2</code> ou <code>3</code>
 +
<ul style="margin-left:50px">
 +
  <li> 1 - La date questionnée (variable provenant d'un DateInput, ou chaîne format "d-m-Y H:i")</li>
 +
  <li> 2 - Le type de jour demandée parmi : <code>weekend</code>, <code>ouvré</code>,  <code>ouvrable</code>, <code>férié</code></li>
 +
  <li> 3 - '''''(facultatif)''''' La zone géographique qui doit être utilisée pour calculer les jours fériés (utile uniquement pour le calcul des jours spéciaux tel que ''jour_ouvré'' etc.). À choisir parmi : ''Métropole (par défaut), Alsace-Moselle, Guadeloupe, Guyane, Martinique, Mayotte, Nouvelle-Calédonie, La Réunion,
 +
Polynésie Française, Saint-Barthélémy, Saint-Martin, Wallis-et-Futuna, Saint-Pierre-et-Miquelon''.
 +
  </li>
 +
</ul>
 +
 +
<div style="margin-left: 30px">
 +
  <p><b style="color: #777;">Par exemple :</b></p>
 +
  <p> ▷ <code>day_is("25-12-2021", "férié")</code>  =>  renvoie <code>TRUE</code> car le jour de Noël est férié<br/>
 +
      ▷ <code>day_is("26-12-2021", "férié")</code>  =>  renvoie <code>FALSE</code><br/>
 +
      ▷ <code>day_is("26-12-2021", "weekend")</code>  =>  renvoie <code>TRUE</code> car ce jour est un dimanche.<br/>
 +
      ▷ <code>day_is("23-12-2021", "ouvré")</code>  =>  renvoie <code>TRUE</code> car ce jour est un jeudi, non-férié.<br/>
 +
      ▷ <code>day_is("22-05-2021", "ouvré")</code>  =>  renvoie <code>TRUE</code> car ce jour est un vendredi, non-férié (en Métropole du moins).<br/>
 +
      ▷ <code>day_is("22-05-2021", "ouvré", "Martinique")</code>  =>  renvoie <code>FALSE</code> car ce jour est férié en Martinique contrairement à la Métropole.<br/>
 +
  </p>
 +
</div>
  
 
===== changer le format d'une date =====
 
===== changer le format d'une date =====
Ligne 198 : Ligne 248 :
 
''Introduction : notez bien que les traitements sur les nombres peuvent être effectués aussi bien sur des variables que sur d'autres dynvars''
 
''Introduction : notez bien que les traitements sur les nombres peuvent être effectués aussi bien sur des variables que sur d'autres dynvars''
  
===== arrondir un nombre en choisissant le nombre de chiffres souhaités après la virgule =====
+
 
 +
===== Arrondir un nombre en choisissant le nombre de chiffres souhaités après la virgule =====
  
 
# Fonction : <code>round</code>
 
# Fonction : <code>round</code>
Ligne 211 : Ligne 262 :
 
<code>round(PRIX_ACHAT, 3)</code>
 
<code>round(PRIX_ACHAT, 3)</code>
  
===== arrondir un nombre entier à l'entier inférieur =====
+
 
 +
 
 +
===== Arrondir un nombre entier à l'entier inférieur =====
  
 
# Fonction : <code>floor</code>
 
# Fonction : <code>floor</code>
Ligne 223 : Ligne 276 :
 
<code>floor(PRIX_ACHAT)</code>
 
<code>floor(PRIX_ACHAT)</code>
  
===== arrondir un nombre entier à l'entier supérieur =====
+
 
 +
 
 +
===== Arrondir un nombre entier à l'entier supérieur =====
  
 
# Fonction : <code>ceil</code>
 
# Fonction : <code>ceil</code>
Ligne 234 : Ligne 289 :
 
<p>Pour arrondir un prix d'achat à l'entier supérieur</p>
 
<p>Pour arrondir un prix d'achat à l'entier supérieur</p>
 
<code>ceil(PRIX_ACHAT)</code>
 
<code>ceil(PRIX_ACHAT)</code>
 +
 +
 +
 +
===== Tronquer le nombre de décimale (sans arrondir) =====
 +
 +
# Fonction : <code>truncate</code>
 +
# Nombre de paramètres : <code>1</code>
 +
# Paramètres attendus : Deux nombres. Le premier est la valeur à tronquer (ex: 3.1415) et le second est le nombre de décimale à garder après la virgule (Ex: 2).
 +
 +
''La fonction va tronquer les décimales au nombre de décimales indiqué dans le second paramètre.''
 +
 +
<p>Par exemple :<br/>
 +
Avec PRIX_ACHAT qui est issu d'un calcul et vaut 1.336666, alors <code>truncate(PRIX_ACHAT, 2)</code> vaudra <code>1.33</code>.
 +
</p>
 +
 +
 +
===== Valeur absolue =====
 +
 +
# Fonction : <code>abs</code>
 +
# Nombre de paramètres : <code>1</code>
 +
# Paramètres attendus : le nombre (positif ou négatif) à convertir en valeur absolue.
 +
 +
''La fonction va permettre de ramener les nombres négatifs à leur valeur positive (nombre absolu).''
 +
 +
<p>Par exemple :<br/>
 +
Avec une variable VARIATION qui est issu d'un calcul et qui vaut -6.34, alors <code>abs(VARIATION)</code> vaudra <code>6.34</code>.
 +
</p>
 +
 +
 +
===== Minimum ou Maximum =====
 +
 +
# Fonction : <code>max</code> ou <code>min</code>
 +
# Nombre de paramètres : <code>2</code>
 +
# Paramètres attendus : les deux nombres à comparer.
 +
 +
''La fonction va permettre de renvoyer la valeur maximale (ou minimale) entre le paramètre 1 et 2.''
 +
 +
<p>Par exemple :<br/>
 +
: - <code>max(-6, 55)</code> vaut <code>55</code>.
 +
: - <code>max(100, 8)</code> vaut <code>100</code>.
 +
: - <code>min(100, 8)</code> vaut <code>8</code>.
 +
: - <code>min(-99, 300)</code> vaut <code>-99</code>.
 +
</p>
 +
 +
 +
 +
===== Formater un nombre en chaîne de caractère =====
 +
 +
# Fonction : <code>numFormat</code>
 +
# Nombre de paramètres : <code>4</code> mais seulement le 1er est obligatoire.
 +
# Paramètres :
 +
## - (numérique) le nombre à formater (obligatoire)
 +
## - (numérique) le nombre de décimales à forcer (par défaut, le nombre de décimale d'origine)
 +
## - (string) le caractère pour le séparateur des milliers (ex: <code>","</code> ou <code>" "</code>, ou <code>""</code> etc.). Par défaut: <code>" "</code>.
 +
## - (string) le caractère pour le séparateur de l'entier/décimale (ex: <code>"."</code> ou <code>","</code> etc.). Par défaut: <code>","</code>
 +
 +
 +
''La fonction va permettre de formater un nombre, par exemple pour faire apparaitre des séparateurs de milliers, ou personnaliser les décimales etc.''<br/>
 +
''Le fonctionnement est très similaire au traitement <code>:num-format</code> des SmartDocs.''
 +
 +
 +
Par exemple :
 +
: - <code>numFormat(1003.1415, 2)</code> vaut <code>1 003,14</code>.
 +
: - <code>numFormat(8133003.1415, 0)</code> vaut <code>8 133 003</code>.
 +
: - <code>numFormat(3500)</code> vaut <code>3 500</code>.
 +
: - <code>numFormat(3500.999)</code> vaut <code>3 500,999</code>.
 +
: - <code>numFormat(3000.50, 4, ',', '.')</code> vaut <code>3,500.5000</code>.
  
 
==== Fonctions sur les Chaînes de caractères ====
 
==== Fonctions sur les Chaînes de caractères ====
 +
 +
 +
===== Compter le nombre de caractères d'une chaîne =====
 +
 +
# Fonction : <code>stringLength</code>
 +
# Nombre de paramètres : <code>1</code>
 +
# Paramètres attendus : Une Chaîne de caractères ([[DataStore|string]]).
 +
 +
<p>''Renvoie le nombre de caractère de la chaîne.''<br/>
 +
:: Exemple : <code>stringLength('Hercule !')</code> renvoie <code>9</code> ''(entier numérique)''. </p>
 +
:: <p>Les espaces ou les sauts de lignes comptent aussi pour 1 caractère, même s'ils apparaissent en début ou en fin de la chaîne.</p>
 +
:: <p>Spécial : si la valeur passée en paramètre est une valeur numérique, la fonction renverra le nombre de "digit" de ce nomnre. <br/>Ex : Avec <code>CODE_POSTAL</code> qui vaut <code>34700</code> (entier numérique), alors <code>stringLength(CODE_POSTAL)</code> renvoie <code>5</code>. </p>
 +
:: <p>Si par contre la valeur passée en paramètre est d'un autre type (exemple : une liste, un booléen), ces types n'étant pas pris en charge, la fonction renverra systématiquement <code>0</code>.</p>
  
  
Ligne 266 : Ligne 401 :
  
 
<p>Si le 1er paramètre est une chaîne : renvoie VRAI si la chaîne A contient la chaîne B.</p>
 
<p>Si le 1er paramètre est une chaîne : renvoie VRAI si la chaîne A contient la chaîne B.</p>
<p>Si le 1er caractère est une liste : renvoie VRAI si la liste contient la valeur B correspondante à la chaîne B.</p>
+
<p>Si le 1er paramètre est une liste : renvoie VRAI si la liste contient la valeur B correspondante à la chaîne B.</p>
 +
<p>Si le 1er paramètre est <code>null</code> ou d'un autre format non-attendu (booléen, nombre…) : la fonction renverra <code>null</code> par défaut.</p>
  
 
<div style="margin-left: 30px">  
 
<div style="margin-left: 30px">  
Ligne 276 : Ligne 412 :
 
       ▷ <code>contains(NUM_FACTURE,"20 Euros")</code> => renvoie <code>FALSE</code> car la chaine "2020F01" ne contient pas "20 Euros" <br/>  
 
       ▷ <code>contains(NUM_FACTURE,"20 Euros")</code> => renvoie <code>FALSE</code> car la chaine "2020F01" ne contient pas "20 Euros" <br/>  
 
       ▷ <code>contains(HOBBIES,"cinema")</code> => renvoie <code>VRAI</code> et c'est d'ailleurs le 2ème élément <br/>  
 
       ▷ <code>contains(HOBBIES,"cinema")</code> => renvoie <code>VRAI</code> et c'est d'ailleurs le 2ème élément <br/>  
       ▷ <code>contains(HOBBIES,"cine")</code> => renvoie <code>FALSE</code> car aucun élément est exactement nommé "cine" parmi ceux de la liste <br/>  
+
       ▷ <code>contains(HOBBIES,"cine")</code> => renvoie <code>FALSE</code> car aucun élément est exactement nommé "cine" parmi ceux de la liste <br/>
 
   </p>
 
   </p>
 
</div>
 
</div>
 
  
 
===== Tronquer une chaîne de caractères =====
 
===== Tronquer une chaîne de caractères =====
Ligne 303 : Ligne 438 :
 
<p>La Dynvar ainsi paramétrée vaudra "rcule"</p>
 
<p>La Dynvar ainsi paramétrée vaudra "rcule"</p>
  
==== Fonctions sur les repeaters ====
+
===== Connaître la position d'une sous-chaîne =====
 +
 
 +
# Fonction : <code>stringPos</code>
 +
# Nombre de paramètres : 2 obligatoires, et un dernier facultatif.</code>
 +
# Paramètres attendus :
 +
##  La chaîne de caractères dans laquelle rechercher. (Ex: <code>"Maison d'été"</code>)
 +
##  La chaîne de caractères (ou simplement le caractère) à rechercher (Ex: la lettre <code>"n"</code>)
 +
##  (Optionnel) un nombre entier correspondant à la position de début de recherche. S'il est omis, zéro sera utilisé. Une position négative compte à partir de la fin de la chaîne de caractères n°1.
  
===== Additionner les répétitions d'une sous-variable d'un repeater =====
+
Notez que le premier caractère est comptabilisé comme à la position n°0.
 +
 
 +
Ex: <code>stringPos("Maison d'été", "n")</code> va retourner 5 car la lettre <code>n</code> se trouve à la 5ème position de la chaîne fournie (la lettre <code>M</code> étant comptée comme la position n°0)
 +
 
 +
Ex: <code>stringPos("Maison d'été", "été")</code> va retourner 9 car le terme <code>été</code> se trouve à la 9ème position de la chaîne fournie.
 +
 
 +
Ex: <code>stringPos("Blablabla", "a", 3)</code> va retourner 5 car, si on omet les 3 premiers caractères, la prochaine lettre <code>a</code> se trouve à la 5ème position de la chaîne fournie.
 +
 
 +
 
 +
 
 +
===== Tronquer la chaîne avec tout ce qui est "avant" une sous-chaîne =====
 +
 
 +
# Fonction : <code>stringBefore</code>
 +
# Nombre de paramètres : 1 obligatoire, 1 facultatif.</code>
 +
# Paramètres attendus :
 +
##  La chaîne de caractères dans laquelle rechercher.
 +
##  (Optionnel) La chaîne de caractères (ou simplement le caractère) à partir duquel il faut tronquer. Si rien n'est précisé, le caractère <code>,</code> sera utilisé.
 +
 
 +
Ex: <code>stringBefore("Maison d'été", " ")</code> va retourner <code>Maison</code> car on lui demande de ne retourner que ce qui est avant l'espace.
 +
 
 +
Ex: <code>stringBefore("Damien, Jean, Paul")</code> va retourner <code>Damien</code> car on lui demande de ne retourner que ce qui est avant la virgule (la virgule étant la valeur par défaut du second paramètre quand il n'est pas précisé).
 +
 
 +
 
 +
===== Tronquer la chaîne avec tout ce qui est "après" une sous-chaîne =====
 +
 
 +
# Fonction : <code>stringAfter</code>
 +
# Nombre de paramètres : 1 obligatoire, 1 facultatif.</code>
 +
# Paramètres attendus :
 +
##  La chaîne de caractères dans laquelle rechercher.
 +
##  (Optionnel) La chaîne de caractères (ou simplement le caractère) jusqu'auquel il faut tronquer. Si rien n'est précisé, le caractère <code>,</code> sera utilisé.
 +
 
 +
Ex: <code>stringAfter("Maison d'été", " ")</code> va retourner <code>d'été</code> car on lui demande de ne retourner que ce qui est après l'espace.
 +
 
 +
Ex: <code>stringAfter("Damien, Jean, Paul")</code> va retourner <code> Jean, Paul</code> car on lui demande de ne retourner que ce qui est après la virgule (la virgule étant la valeur par défaut du second paramètre quand il n'est pas précisé).
 +
 
 +
 
 +
===== Rechercher et remplacer dans une chaîne =====
 +
 
 +
# Fonction : <code>stringReplace</code>
 +
# Nombre de paramètres : 2 obligatoires, 1 facultatif.</code>
 +
# Paramètres attendus :
 +
##  La chaîne de caractères dans laquelle rechercher et remplacer ;
 +
##  La chaîne de caractères de remplacement (celle qui sera "insérée") ;
 +
##  (Optionnel) La chaîne de caractères qui sera recherchée (celle qui sera remplacée). Par défaut, si rien n'est précisé, ce sont des sauts de ligne (<code>\n</code>) qui seront recherchés.
 +
 
 +
Ex: <code>stringReplace("Damien", "F", "D")</code> va retourner <code>Famien</code> car on lui demande de remplacer <code>D</code> par <code>F</code> dans la chaîne <code>Damien</code>.
 +
 
 +
Ex: par exemple une variable ADDRESS qui contient une adresse postale sur plusieurs lignes, <code>stringReplace(ADDRESS, ", ")</code> va permettre de la renvoyer sur une seule et même ligne (séparée par des virgules). Le troisième paramètre n'est pas précisé car par défaut, ce sont des sauts de ligne qui sont recherchés et remplacés. 
 +
 
 +
A l'inverse, pour remplacer des virgules par des sauts de ligne, il faudra écrire l'expression de cette façon : <code>stringReplace(ADDRESS, "\n", ",")</code>.
 +
 
 +
==== Fonctions sur des listes ====
 +
 
 +
===== Obtenir la valeur d'un élément d'une liste à partir d'une clé =====
 +
 
 +
# Fonction : <code>get_value</code>
 +
# Nombre de paramètres : <code>2 ou 3</code>
 +
# Paramètres attendus :
 +
## - Une variable de type [[DataStore|List]] ;
 +
## - La clé à cibler ;
 +
## - Dans le cas d'une liste "structurée" (issue d'un [[Repeaters|Repeater]] par exemple), on peut préciser le nom de la sous-variable à renvoyer.
 +
 
 +
::'''Cas pratique'''
 +
::<p>Cas d'une liste EMPLOYES, utilisée dans un Repeater, dont chaque élément défini 3 sous-variables: <code>EMPLOYES.NOM</code>, <code>EMPLOYES.DATE_ENTREE</code>, <code>EMPLOYES.SALAIRE</code>. <br/>
 +
::::Ceci étant, l'utilisateur a renseigner dans un formulaire 2 fiches correspondante à EMPLOYES. Elles ont respectivement les clés '_abc123' et '_xyz987' :
 +
</p>
 +
<pre>
 +
  [
 +
    '_abc123' => [ 'NOM': 'Jean', 'DATE_ENTREE': '13-08-2020', 'SALAIRE': 32000.00 ,
 +
    '_xyz987' => [ 'NOM': 'Sylvie', 'DATE_ENTREE': '11-12-2019', 'SALAIRE': 39500.00
 +
  ]
 +
</pre>
 +
 
 +
::'''Usage'''
 +
<p>
 +
::::- <code>get_value(EMPLOYES, '_abc123', 'NOM')</code> => va renvoyer "Jean" <br/>
 +
::::- <code>get_value(EMPLOYES, '_xyz987', 'SALAIRE')</code> => va renvoyer <code>39500.0</code>
 +
</p>
 +
 
 +
<p>
 +
::Mais là où cette fonction prend tout son intérêt, c'est quand le second paramètre est dynamique, c'est à dire qu'il est fourni au travers d'une variable.<br/>
 +
::Prenons par exemple, une variable "MEILLEUR_EMPLOYE", qui serait utilisée dans un formulaire avec un champ "choice-list", et qui prendra pour valeur la clé correspondante au meilleur employé de l'entreprise (= c'est à dire '_abc123' ou '_xyz987' dans notre exemple).
 +
<br/>
 +
::::- <code>get_value(EMPLOYES, MEILLEUR_EMPLOYE, 'SALAIRE')</code> => va renvoyer le salaire du meilleur employé selon le choix effectué.<br/>
 +
</p>
 +
 
 +
 
 +
 
 +
 
 +
===== Obtenir la valeur d'un élément d'une liste à partir de son index =====
 +
 
 +
# Fonction : <code>get_value_by_index</code>
 +
# Nombre de paramètres : <code>2</code>
 +
# Paramètres attendus :
 +
## - Une variable de type [[DataStore|List]] ;
 +
## - L'index de l'élément à retourner (1,2,3…)
 +
 
 +
 
 +
:: Cette fonction est similaire au <code>get_value</code> mais en utilisant l'index de l'élément au lieu de sa clé.
 +
:: Le paramètre `index` peut être fourni au travers d'une variable ou directement "en dur".
 +
 
 +
:::: '''''Exemple sans variable''''' : <code>get_value_by_index(EMPLOYES, 3)</code>
 +
:::: '''''Exemple avec variable''''' : <code>get_value_by_index(EMPLOYES, INDEX_MEILLEUR_EMPLOYE)</code>
 +
 
 +
 
 +
:: Notez que dans le cas d'une liste structuré, l'élément retourné sera lui même une liste avec des sous-variables. Il faudra donc parfois combiner cette fonction avec un `get_value` :
 +
:: '''''Exemple''''' : Obtenir le <code>NOM</code> du 3ème employé de la liste <code>EMPLOYES</code> : <code>get_value( get_value_by_index(EMPLOYES, 3), 'NOM')</code>
 +
 
 +
===== Savoir si une liste contient ou pas une certaine clé =====
 +
 
 +
# Fonction : <code>has_key</code>
 +
# Nombre de paramètres : <code>2</code>
 +
# Paramètres attendus :
 +
## - Une variable de type [[DataStore|List]] ;
 +
## - La clé à rechercher ;
 +
 
 +
'''Usage'''
 +
<p>
 +
- <code>has_key(EMPLOYES_CDI, '_abc123')</code> => va renvoyer TRUE si la liste EMPLOYES_CDI contient bien la clé '_abc123'
 +
</p>
 +
 
 +
<p>
 +
Tout comme pour la fonction <code>get_value</code> cette fonction prend tout son intérêt quand le second paramètre est dynamique, c'est à dire qu'il est fourni au travers d'une variable.<br/>
 +
Prenons par exemple, une variable "MEILLEUR_EMPLOYE", qui serait utilisée dans un formulaire avec un champ "choice-list", et qui prendra pour valeur la clé correspondante au meilleur employé de l'entreprise (= c'est à dire '_abc123' ou '_xyz987' dans notre exemple).<br/>
 +
S'il on veut savoir si cet employé fait parti de la liste de ceux qui sont en CDI, on pourrait faire : <br/>
 +
- <code>has_key(EMPLOYES_CDI, MEILLEUR_EMPLOYE)</code> => va renvoyer TRUE si la clé renseignée dans <code>MEILLEUR_EMPLOYE</code> se trouve bien dans la liste <code>EMPLOYES_CDI</code>.
 +
</p>
 +
 
 +
 
 +
 
 +
===== Assigner un nouveau couple clé-valeur dans une liste =====
 +
 
 +
# Fonction : <code>set_in_struct</code>
 +
# Nombre de paramètres : <code>3</code>
 +
# Paramètres attendus :
 +
## - Une variable de type [[DataStore|List]] ;
 +
## - La clé à créer ou mettre à jour (string);
 +
## - La valeur a assigner ;
 +
 
 +
 
 +
'''Usage'''
 +
<p>
 +
- <code>set_in_struct(PRODUITS, CODE_PRODUIT, PRIX)</code> => va renvoyer la liste PRODUITS avec la nouvelle valeur assignée.
 +
</p>
 +
 
 +
'''Explication'''
 +
<p>
 +
Dans l'exemple ci-dessous, nous avons imaginé une liste PRODUITS qui serait de la forme :
 +
<pre>[ '_abc123' => 12.50,  '_xyz985' => 89.99 ]</pre>
 +
- <code>CODE_PRODUIT</code> est une variable "string", par exemple "_bcd456" ; <br/>
 +
- <code>PRIX</code> est une variable "numerique", par exemple <code>13.50</code> ; <br/>
 +
<br/>
 +
Ceci étant, l'instruction ci-dessus, va retourner une liste de la forme :
 +
<pre>[
 +
'_abc123' => 12.50,
 +
'_xyz985' => 89.99,
 +
'_bcd456' => 13.50,
 +
]</pre>
 +
 
 +
 
 +
===== Additionner les répétitions d'une sous-variable d'une liste structurée =====
  
 
# Fonction : <code>list_sum</code>
 
# Fonction : <code>list_sum</code>
 
# Nombre de paramètres : <code>2</code>
 
# Nombre de paramètres : <code>2</code>
# Paramètres attendus : Une variable de type [[DataStore|List]] utilisée pour un [[Repeaters|Repeater]], une sous-variable du même Repeater
+
# Paramètres attendus :  
 +
## - Une variable de type [[DataStore|List]] (utilisée par exemple dans un [[Repeaters|Repeater]]) ;
 +
## - Le nom de la sous-variable qui devra être additionnée ;
  
 
'''Contexte'''
 
'''Contexte'''
<p>Il est parfois nécessaire d'additionner les différentes répétitions d'une même sous-variable d'un repeater.</p>
+
<p>Il est parfois nécessaire d'additionner les différentes répétitions d'une même sous-variable.</p>
 
<p>Par exemple, dans cette situation :</p>
 
<p>Par exemple, dans cette situation :</p>
 
[[Fichier:List sum chemises.png|400px|vignette|néant|Une sous-variable répétée demande ici le prix d'une chemise. Comment faire pour obtenir la somme des prix de toutes les chemises ?]]
 
[[Fichier:List sum chemises.png|400px|vignette|néant|Une sous-variable répétée demande ici le prix d'une chemise. Comment faire pour obtenir la somme des prix de toutes les chemises ?]]
Ligne 319 : Ligne 623 :
 
<p>Le paramétrage prend la forme suivante :</p>
 
<p>Le paramétrage prend la forme suivante :</p>
 
<p><code>list_sum(VARIABLE_LISTE,"SOUS_VARIABLE")</code></p>
 
<p><code>list_sum(VARIABLE_LISTE,"SOUS_VARIABLE")</code></p>
<p>Pour obtenir le prix de toutes les Chemises dans l'exemple ci-dessus, il faudra paramétrer une [[Dynvars|Dynvar]] dont la formule sera <code>list_sum(CHEMISES,"prix")</p>
+
<p>Pour obtenir le prix de toutes les Chemises dans l'exemple ci-dessus, il faudra paramétrer une [[Dynvars|Dynvar]] dont la formule sera <code>list_sum(CHEMISES,"prix")</code></p>
 +
 
 +
 
 +
===== Obtenir une copie filtrée d'une liste à partir d'une série de clés =====
 +
 
 +
# Fonction : <code>filter_by_keys</code>
 +
# Nombre de paramètres : <code>2</code>
 +
# Paramètres attendus :
 +
## - Une liste avec des clés et des valeurs (ex: <code>ASSOCIES</code>);
 +
## - Une liste de clés ;
 +
::'''Exemple de paramétrage :'''
 +
::<p>Pour obtenir une copie de la liste des associés mais avec uniquement ceux qui ont été cochés comme "présents" :</p>
 +
::<p><code>filter_by_keys(ASSOCIES, ASSOCIES_PRESENTS)</code></p>
 +
 
 +
===== Montrer et organiser les valeurs d'une liste (à rerédiger plus parfaitement) =====
 +
 
 +
# Fonction : <code>join</code>
 +
# Nombre de paramètres : <code>5</code>
 +
# Paramètres attendus :
 +
## - Une variable de liste (paramètre obligatoire) ;
 +
## - Séparateur (facultatif) ;
 +
## - Dernier séparateur (facultatif) ;
 +
## - Préfixe (facultatif) ;
 +
## - Suffixe (facultatif)
 +
 
 +
::'''Exemple de paramétrage :'''
 +
<p>Il est possible de combiner "join" avec la fonction "filter_by_keys".</p>
 +
<p>Par ex : join( filter_by_keys(FILIALES_DISPLAY, CONV.TRESO_FILIALES_PARTICIPANTES) , "", "", "\t - ", " ; \n")</p>
 +
 
 +
==== Fonctions autres ====
 +
 
 +
===== Vérifier si une variable est "vide" =====
 +
 
 +
# Fonction : <code>is_empty</code>
 +
# Nombre de paramètres : <code>1</code>
 +
# Paramètres attendus : Une variable de n'importe quel type
 +
# Exemple : <code>is_empty(MY_VAR) == true</code>
 +
 
 +
<p>Pour savoir si une variable ne possède aucun valeur, il est préférable de tester cela avec la fonction <code>is_empty</code>.</p>
 +
<p>La fonction renverra VRAI pour n'importe quelle variable vide : '' (chaîne vide), liste vide …</p>
 +
<p>Par contre, la fonction renverra FALSE si une valeur est présente, même si cette valeur est un 0 ou le booléen "false" (c'est d'ailleurs pour cela qu'il est préférable d'utiliser <code>`is_empty(MY_VAR)`</code> au lieu de, par exemple, <code>`MY_VAR = null`</code>.</p>
 +
 
 +
===== Vérifier si une variable est "non vide" =====
 +
 
 +
# Fonction : <code>is_set</code>
 +
# Nombre de paramètres : <code>1</code>
 +
# Paramètres attendus : Une variable de n'importe quel type
 +
# Exemple : <code>is_set(MY_VAR) == true</code>
 +
 
 +
<p>A l'inverse de la fonction <code>is_empty</code>, la fonction <code>is_set</code> permet de savoir si une variable possède une valeur.</p>
 +
<p>La fonction renverra VRAI pour n'importe quelle variable non-vide : "une chaîne", un nombre tel que 12.45 ou même 0 (zéro), une liste non-vide etc.

Version actuelle datée du 7 avril 2025 à 08:56

Cette page est en cours de construction

Sommaire

Introduction

On désigne par "SmartExpressions" la syntaxe permettant de paramétrer les Dynvars et les Visible If.

Paramétrage

Pour mémoire : la syntaxe est basée sur PHP : https://www.php.net/manual/fr/funcref.php

Bases de la syntaxe

Cette page est encore en cours de construction

Principes

La syntaxe SmartExpressions permet d'effectuer des enchaînements logiques de type SI ... ALORS afin de déterminer des règles d'applications, ainsi que des calculs mathématiques

? : Alors

: : Sinon

or, and : OU, ET

~ : Concaténation (entre plusieurs chaînes de caractères)

*+-/=!= : opérateurs mathématiques

Illustration

Smartex complexe.png

Ici la SmartExpression utilisée signifie :

Si la variable TYPE_SOCIETE est égale à "Entreprise unipersonnelle à responsabilité limitée" OU si la variable TYPE_SOCIETE est égale à "Société à responsabilité limitée" OU si la variable TYPE_SOCIETE est égale à "Société civile", ALORS la Dynvar ACTIONS_PARTS devra valoir "parts sociales", sinon SI si la variable TYPE_SOCIETE est égale à "Société par actions simplifiée" OU si la variable TYPE_SOCIETE est égale à "Société par actions simplifiée unipersonnelle", alors la la Dynvar ACTIONS_PARTS devra valoir "actions"

Décomposition @LEO TODO


Exemples d'application

Opérations mathématiques

Les Dynvars peuvent servir à effectuer des opérations mathématiques, en utilisant les opérateurs basiques, comme par exemple :

Dans cet exemple, une variable PRIX_HT est multipliée par 1.20 pour obtenir un prix TTC

Il est possible d'effectuer des opérations mathématiques entre plusieurs variables, et aussi entre plusieurs Dynvars.

Liste des opérateurs mathématiques pouvant être utilisés : *+-/

Factorisation du raisonnement

Factorisation simple

On peut aussi prévoir qu'une Dynvar prenne pour valeur TRUE ou FALSE en fonction de la valeur d'autres variables

Par exemple :

Si une des deux variables vaut "france", alors la variable FISCALITE_FR vaudra "vrai".

Cette formule signifie : la Dynvar nommée FISCALITE_FR vaudra TRUE si NATIONALITE_ACHETEUR ou NATIONALITE_VENDEUR est égal à "france"

Il sera donc possible d'utiliser la Dynvar FISCALITE_FR dans des Visible Ifs, ou même dans les formules d'autres Dynvars.

Pour utiliser la dynvar FISCALITE_FR, on utilisera donc la SmartExpression suivante : FISCALITE_FR = true ou FISCALITE_FR = false

Factorisation et chaînes de caractères
La SmartExpression contenue dans cette dynvar

Dans l'exemple ci-dessus, la SmartExpression signifie : "Si la variable SOCIETE_RESULTAT est supérieure à 0, Alors la Dynvar BENEFICE_PERTE doit valoir "bénéfice", sinon si la variable SOCIETE_RESULTAT est inférieure à 0, Alors la Dynvar BENEFICE_PERTE doit valoir "perte".

Dynvars et chaînes de caractères

Une Dynvar peut avoir pour formule plusieurs chaînes de caractères, par exemple pour reconstruire un nom complet ou une phrase en utilisant plusieurs variables.

Une dynvar FULL_NAME qui reprend grâce à la concaténation : la civilité, le nom, et le prénom.

Les fonctions

Principes

Une fonction prend toujours la forme suivante : MA_FONCTION( xxx )


Une fonction est donc toujours composée de trois éléments :

MA_FONCTION : on commence toujours par nommer la fonction souhaitée.

( ) : ces parenthèses dites "d'exécution" peuvent contenir plusieurs paramètres, séparés chacun par une virgule. Chaque fonction pourra avoir plus ou moins de paramètres.

xxx : les paramètres de la fonction. Ce sont les paramètres qui vont permettre à la fonction de s'exécuter.

Fonctions sur les Dates

Opération sur une date

Cette fonction permet de réaliser des opérations (somme et soustraction) sur une date. C'est à dire que pour une date donnée, la fonction permet d'obtenir une date antérieur ou postérieure de N jours / années / heures (etc.). Cette fonction est utile pour calculer une date d'échéance (ex : "3 mois après la date de signature…"), ou parler d'une date en fonction d'une autre (Ex : "12 jours avant la date…").

  1. Nom de la fonction : date_sum
  2. Nombre de paramètres : 3
  • 1 - Date à traiter (variable provenant d'un DateInput, ou chaîne format "d-m-Y H:i")
  • 2 - Un nombre entier (positif ou négatif)
  • 3 - L'unité sous forme d'une chaîne de caractères parmi : "year"; "month"; "day"; "hour"; "minute"; "second".
    + Unité spéciale pour la France et ses territoires : "jour_ouvrable", "jour_ouvré", "jour_franc", "mois_franc" (tenant compte des jours fériés Français)
    + Mais aussi l'unité particulière `month_quant` qui correspond à une règle administrative courante dîtes de "mois de même quantième". On parle par exemple d'un délais de 3 mois au même quantième. Cela signifie que l'on avance de 3 mois et que le jour de destination doit être le même que celui de départ (Ex: 15 Mars + 3 mois = 15 juin). Néanmoins, cette unité prend aussi en compte le fait que si la date de destination n'existe pas (ex: 31 Aout + 1 mois), alors on renvoie le dernier jour du mois de destination (= ici le 30 Septembre).
  • 4 - (facultatif) La zone géographique qui doit être utilisée pour calculer les jours fériés (utile uniquement pour le calcul des jours spéciaux tel que jour_ouvré etc.). À choisir parmi : Métropole, Alsace-Moselle, Guadeloupe, Guyane, Martinique, Mayotte, Nouvelle-Calédonie, La Réunion, Polynésie Française, Saint-Barthélémy, Saint-Martin, Wallis-et-Futuna, Saint-Pierre-et-Miquelon.

Par exemple :

Soit une date de signature (DATE_SIGNATURE) ayant pour valeur le 12/05/2020, et l'on veut rajouter 3 jours à cette date :

date_sum(DATE_SIGNATURE, 3, "day") => renvoie 15/05/2020

Ou avec une valeur négative, pour soustraire 3 ans par exemple :

date_sum(DATE_SIGNATURE, -3, "year") => renvoie 12/05/2017

Avec un calcul de jour ouvré (ajout de 4 jours ouvrés à la date de signature en tenant compte des jours fériés de l'Alsace-Moselle) :

date_sum(DATE_SIGNATURE, 4, "jour_ouvré", "Alsace-Moselle") => renvoie 18/05/2017 (car il saute le week-end)

Pour aller plus loin :

Dans les exemples précédents, la seule variable était DATE_SIGNATURE (avec pour valeur 12/05/2020). Cependant, comme dans toute SmartExpression, les valeurs statiques (nombre, chaîne…) peuvent toujours être substituées par une valeur variable. Pour l'exemple, on aurait très bien pu utiliser deux autres variables et les utiliser dans le date_sum(…). Par exemple, avec AJOUT_NUM qui vaudrait 3 (issue d'un champ numérique), et la variable AJOUT_UNITÉ qui vaudrait day (issue d'un champ de choix par exemple), :

date_sum(DATE_SIGNATURE, AJOUT_NUM, AJOUT_UNITÉ) => renvoie 15/05/2020

savoir si une date est avant une autre date
  1. Fonction : date_before
  2. Nombre de paramètres : 2
  3. Paramètres attendus : Date 1, Date 2

Renvoie VRAI si la Date 1 est antérieure à la Date 2. Renvoie FAUX sinon.

Notez que la Date 1 ou la Date 2 peuvent provenir d'une variable complétée par la valeur d'un champ "date-input" d'un SmartForm, ou correspondre à une date fixe fournie sous la forme d'une chaîne de caractère au format j-m-A (la précision peut aller jusqu'à la seconde : j-m-A h:m:s)

Par exemple :

Soit une date de signature (DATE_SIGNATURE) ayant pour valeur le 12/05/2020, et l'on veut vérifier que la signature soit antérieure à la date du 1er Janvier 2020 :

date_before(DATE_SIGNATURE,"01-01-2020") => renvoie FAUX
▷ Alors que date_before(DATE_SIGNATURE,"01-01-2021") => renvoie VRAI

calcul de la différence entre deux dates
  1. Fonction : date_diff
  2. Nombre de paramètres : 3
  • 1 - Date de départ (variable provenant d'un DateInput, ou chaîne format "d-m-Y H:i")
  • 2 - Date de fin (variable provenant d'un DateInput, ou chaîne format "d-m-Y H:i")
  • 3 - L'unité dans laquelle renvoyer la différence entre les deux dates. L'unité est fournie sous la forme d'une chaîne de caractères parmi : "year"; "month"; "day"; "hour"; "minute"; "second".
    + Unité spéciale pour la France et ses territoires : "jour_ouvrable", "jour_ouvré"
  • 4 - (facultatif) La zone géographique qui doit être utilisée pour calculer les jours fériés (utile uniquement pour le calcul des jours spéciaux tel que jour_ouvré etc.). À choisir parmi : Métropole (par défaut), Alsace-Moselle, Guadeloupe, Guyane, Martinique, Mayotte, Nouvelle-Calédonie, La Réunion, Polynésie Française, Saint-Barthélémy, Saint-Martin, Wallis-et-Futuna, Saint-Pierre-et-Miquelon.

Renvoie un nombre (valeur absolue) correspondant à la différence, entre la Date de début et la Date de fin, dans l'unité spécifiée. Notez que la date de fin n'est généralement pas inclue dans la comptage de la différence.

Par exemple :

Soit une date de signature (DATE_SIGNATURE) ayant pour valeur le 31/05/2020, et l'on veut savoir combien d'années de différence entre les 2 dates :

date_diff(DATE_SIGNATURE,"20-09-2004","year") => renvoie 15 car 15 années se sont écoulées
date_diff("20-09-2004",DATE_SIGNATURE, "year") => renvoie aussi 15 (la valeur est absolue, peu importe l'ordre des dates)
date_diff("20-09-2004",DATE_SIGNATURE, "day") => renvoie 5732 (le nombre total de jour entre les deux dates)
date_diff("01-05-2020","31-05-2020", "day") => renvoie 30 (le nombre total de jour entre le 01 et le 31 Mai, le 31 Mai n'étant pas inclu).
date_diff("01-05-2020","31-05-2020", "jour_ouvré") => renvoie 18 (le nombre de jours ouvrés entre le 01 et le 31 Mai 2020).
date_diff("01-05-2020","31-05-2020", "jour_ouvré", "Martinique") => renvoie 17 (le nombre de jours ouvrés entre le 01 et le 31 Mai 2020 en Martinique, car contrairement à la Métropole, le 22 Mai est aussi férié).

renvoyer automatiquement la date du jour

Spécificité : fonction unaire, ne possède pas de paramètres

  1. Fonction : now()
  2. Nombre de paramètres : 0
  3. Paramètres attendus : N/A

Par exemple :

Now().png

trouver automatiquement l'âge d'un individu
  1. Fonction : years_old
  2. Nombre de paramètres : 1
  3. Paramètres attendus : Une date

Par exemple :

years_old(DATE_NAISSANCE)

isoler le jour, le mois, l'année d'une date
  1. Fonction : date_day date_month date_year
  2. Nombre de paramètres : 1
  3. Paramètres attendus : Une date

Par exemple : date_month(DATE_SIGNATURE)

Connaître le jour de la semaine
  1. Fonction : date_weekday , renvoie la valeur numérique du jour de la semaine (1 pour lundi, 7 pour dimanche).
  1. Nombre de paramètres : 1
  2. Paramètres attendus : Une date

Par exemple : date_weekday(DATE_SIGNATURE) => Renvoie 1 pour lundi, 2 pour mardi…, 6 pour samedi, 7 pour dimanche

Savoir si le jour est ouvrable, ouvré, ou férié
  1. Fonction : day_is , renvoie un booléen (VRAI ou FAUX) si la date est du type demandé.
  1. Paramètres attendus : 2 ou 3
  • 1 - La date questionnée (variable provenant d'un DateInput, ou chaîne format "d-m-Y H:i")
  • 2 - Le type de jour demandée parmi : weekend, ouvré, ouvrable, férié
  • 3 - (facultatif) La zone géographique qui doit être utilisée pour calculer les jours fériés (utile uniquement pour le calcul des jours spéciaux tel que jour_ouvré etc.). À choisir parmi : Métropole (par défaut), Alsace-Moselle, Guadeloupe, Guyane, Martinique, Mayotte, Nouvelle-Calédonie, La Réunion, Polynésie Française, Saint-Barthélémy, Saint-Martin, Wallis-et-Futuna, Saint-Pierre-et-Miquelon.

Par exemple :

day_is("25-12-2021", "férié") => renvoie TRUE car le jour de Noël est férié
day_is("26-12-2021", "férié") => renvoie FALSE
day_is("26-12-2021", "weekend") => renvoie TRUE car ce jour est un dimanche.
day_is("23-12-2021", "ouvré") => renvoie TRUE car ce jour est un jeudi, non-férié.
day_is("22-05-2021", "ouvré") => renvoie TRUE car ce jour est un vendredi, non-férié (en Métropole du moins).
day_is("22-05-2021", "ouvré", "Martinique") => renvoie FALSE car ce jour est férié en Martinique contrairement à la Métropole.

changer le format d'une date
  1. Fonction : date_format
  2. Nombre de paramètres : 2
  3. Paramètres attendus : Une date, Un format de date

Par exemple :

Passer d'une date complète à un format jour/mois

date_format(DATE_NAISSANCE, "d/m")

Fonctions sur les Nombres

Introduction : notez bien que les traitements sur les nombres peuvent être effectués aussi bien sur des variables que sur d'autres dynvars


Arrondir un nombre en choisissant le nombre de chiffres souhaités après la virgule
  1. Fonction : round
  2. Nombre de paramètres : 2
  3. Paramètres attendus : Un nombre, Un autre nombre

La fonction enregistre le premier nombre, puis l'arrondit en fonction du deuxième paramètre

La méthode utilisée est celle de l'arrondi arithmétique.

Par exemple :

Pour arrondir un prix d'achat à 3 chiffres après la virgule

round(PRIX_ACHAT, 3)


Arrondir un nombre entier à l'entier inférieur
  1. Fonction : floor
  2. Nombre de paramètres : 1
  3. Paramètres attendus : Un nombre

La fonction attend un nombre et lui retire ses décimales en arrondissant à l'entier inférieur

Par exemple :

Pour arrondir un prix d'achat à l'entier inférieur

floor(PRIX_ACHAT)


Arrondir un nombre entier à l'entier supérieur
  1. Fonction : ceil
  2. Nombre de paramètres : 1
  3. Paramètres attendus : Un nombre

La fonction attend un nombre et lui retire ses décimales en arrondissant à l'entier supérieur

Par exemple :

Pour arrondir un prix d'achat à l'entier supérieur

ceil(PRIX_ACHAT)


Tronquer le nombre de décimale (sans arrondir)
  1. Fonction : truncate
  2. Nombre de paramètres : 1
  3. Paramètres attendus : Deux nombres. Le premier est la valeur à tronquer (ex: 3.1415) et le second est le nombre de décimale à garder après la virgule (Ex: 2).

La fonction va tronquer les décimales au nombre de décimales indiqué dans le second paramètre.

Par exemple :
Avec PRIX_ACHAT qui est issu d'un calcul et vaut 1.336666, alors truncate(PRIX_ACHAT, 2) vaudra 1.33.


Valeur absolue
  1. Fonction : abs
  2. Nombre de paramètres : 1
  3. Paramètres attendus : le nombre (positif ou négatif) à convertir en valeur absolue.

La fonction va permettre de ramener les nombres négatifs à leur valeur positive (nombre absolu).

Par exemple :
Avec une variable VARIATION qui est issu d'un calcul et qui vaut -6.34, alors abs(VARIATION) vaudra 6.34.


Minimum ou Maximum
  1. Fonction : max ou min
  2. Nombre de paramètres : 2
  3. Paramètres attendus : les deux nombres à comparer.

La fonction va permettre de renvoyer la valeur maximale (ou minimale) entre le paramètre 1 et 2.

Par exemple :

- max(-6, 55) vaut 55.
- max(100, 8) vaut 100.
- min(100, 8) vaut 8.
- min(-99, 300) vaut -99.


Formater un nombre en chaîne de caractère
  1. Fonction : numFormat
  2. Nombre de paramètres : 4 mais seulement le 1er est obligatoire.
  3. Paramètres :
    1. - (numérique) le nombre à formater (obligatoire)
    2. - (numérique) le nombre de décimales à forcer (par défaut, le nombre de décimale d'origine)
    3. - (string) le caractère pour le séparateur des milliers (ex: "," ou " ", ou "" etc.). Par défaut: " ".
    4. - (string) le caractère pour le séparateur de l'entier/décimale (ex: "." ou "," etc.). Par défaut: ","


La fonction va permettre de formater un nombre, par exemple pour faire apparaitre des séparateurs de milliers, ou personnaliser les décimales etc.
Le fonctionnement est très similaire au traitement :num-format des SmartDocs.


Par exemple :

- numFormat(1003.1415, 2) vaut 1 003,14.
- numFormat(8133003.1415, 0) vaut 8 133 003.
- numFormat(3500) vaut 3 500.
- numFormat(3500.999) vaut 3 500,999.
- numFormat(3000.50, 4, ',', '.') vaut 3,500.5000.

Fonctions sur les Chaînes de caractères

Compter le nombre de caractères d'une chaîne
  1. Fonction : stringLength
  2. Nombre de paramètres : 1
  3. Paramètres attendus : Une Chaîne de caractères (string).

Renvoie le nombre de caractère de la chaîne.

Exemple : stringLength('Hercule !') renvoie 9 (entier numérique).

Les espaces ou les sauts de lignes comptent aussi pour 1 caractère, même s'ils apparaissent en début ou en fin de la chaîne.

Spécial : si la valeur passée en paramètre est une valeur numérique, la fonction renverra le nombre de "digit" de ce nomnre.
Ex : Avec CODE_POSTAL qui vaut 34700 (entier numérique), alors stringLength(CODE_POSTAL) renvoie 5.

Si par contre la valeur passée en paramètre est d'un autre type (exemple : une liste, un booléen), ces types n'étant pas pris en charge, la fonction renverra systématiquement 0.

Trouver si une chaîne de caractères commence par une autre chaîne de caractères
  1. Fonction : begins_with
  2. Nombre de paramètres : 2
  3. Paramètres attendus : Une Chaîne de caractères (string), une autre Chaîne de caractères

La première chaîne de caractères est la chaîne dans laquelle rechercher, la deuxième chaîne de caractère est la chaîne à rechercher

La Dynvar paramétrée avec cette fonction vaudra TRUE si la chaîne du premier paramètre commence par la chaîne du second paramètre

Trouver si une chaîne de caractères se finit par une autre chaîne de caractères
  1. Fonction : ends_with
  2. Nombre de paramètres : 2
  3. Paramètres attendus : Une Chaîne de caractères (string), une autre Chaîne de caractères

La première chaîne de caractères est la chaîne dans laquelle rechercher, la deuxième chaîne de caractère est la chaîne à rechercher

La Dynvar paramétrée avec cette fonction vaudra TRUE si la chaîne du premier paramètre se finit par la chaîne du second paramètre


Un élément en contient-il un autre ?
  1. Fonction : contains
  2. Nombre de paramètres : 2
  3. Paramètres attendus :
1er paramètre : une Chaine A (string) ou une Liste (list)
Paramètre 2 : une chaîne B (string)

Si le 1er paramètre est une chaîne : renvoie VRAI si la chaîne A contient la chaîne B.

Si le 1er paramètre est une liste : renvoie VRAI si la liste contient la valeur B correspondante à la chaîne B.

Si le 1er paramètre est null ou d'un autre format non-attendu (booléen, nombre…) : la fonction renverra null par défaut.

Exemple :

Soit une chaîne NUM_FACTURE correspondant à un numéro de facture tel que : '2020F01'.
Et soit une Liste HOBBIES correspondants à 3 choix : ["sport", "cinema", "music"] (saisis par exemple via un champ de choix multiple).

contains(NUM_FACTURE,"F") => renvoie VRAI car la chaine "2020F01" contient la chaine "F"
contains(NUM_FACTURE,"2020F") => renvoie VRAI car la chaine "2020F01" contient aussi la chaine "2020F"
contains(NUM_FACTURE,"20 Euros") => renvoie FALSE car la chaine "2020F01" ne contient pas "20 Euros"
contains(HOBBIES,"cinema") => renvoie VRAI et c'est d'ailleurs le 2ème élément
contains(HOBBIES,"cine") => renvoie FALSE car aucun élément est exactement nommé "cine" parmi ceux de la liste

Tronquer une chaîne de caractères
  1. Fonction : substring
  2. Nombre de paramètres : 3
  3. Paramètres attendus : Une Chaîne de caractères (string), le nombre à partir duquel la fonction doit tronquer, le nombre de caractères à prendre en compte après la troncation

À noter : le troisième paramètre est facultatif. S'il n'est pas présent, la fonction renverra tous les caractères situés après la troncation

Par exemple :

Pour une dynvar paramétrée de la manière suivante : substring(DENOMINATION, 2, 3);

Si la variable DENOMINATION vaut "Hercule";

La Dynvar ainsi paramétrée vaudra "rcu"


Ou encore :

Pour une dynvar paramétrée de la manière suivante : substring(DENOMINATION, 0, 4);

Si la variable DENOMINATION vaut "Hercule";

La Dynvar ainsi paramétrée vaudra "Herc"


Ou enfin :

Pour une dynvar paramétrée de la manière suivante : substring(DENOMINATION, 2);

Si la variable DENOMINATION vaut "Hercule";

La Dynvar ainsi paramétrée vaudra "rcule"

Connaître la position d'une sous-chaîne
  1. Fonction : stringPos
  2. Nombre de paramètres : 2 obligatoires, et un dernier facultatif.
  3. Paramètres attendus :
    1. La chaîne de caractères dans laquelle rechercher. (Ex: "Maison d'été")
    2. La chaîne de caractères (ou simplement le caractère) à rechercher (Ex: la lettre "n")
    3. (Optionnel) un nombre entier correspondant à la position de début de recherche. S'il est omis, zéro sera utilisé. Une position négative compte à partir de la fin de la chaîne de caractères n°1.

Notez que le premier caractère est comptabilisé comme à la position n°0.

Ex: stringPos("Maison d'été", "n") va retourner 5 car la lettre n se trouve à la 5ème position de la chaîne fournie (la lettre M étant comptée comme la position n°0)

Ex: stringPos("Maison d'été", "été") va retourner 9 car le terme été se trouve à la 9ème position de la chaîne fournie.

Ex: stringPos("Blablabla", "a", 3) va retourner 5 car, si on omet les 3 premiers caractères, la prochaine lettre a se trouve à la 5ème position de la chaîne fournie.


Tronquer la chaîne avec tout ce qui est "avant" une sous-chaîne
  1. Fonction : stringBefore
  2. Nombre de paramètres : 1 obligatoire, 1 facultatif.
  3. Paramètres attendus :
    1. La chaîne de caractères dans laquelle rechercher.
    2. (Optionnel) La chaîne de caractères (ou simplement le caractère) à partir duquel il faut tronquer. Si rien n'est précisé, le caractère , sera utilisé.

Ex: stringBefore("Maison d'été", " ") va retourner Maison car on lui demande de ne retourner que ce qui est avant l'espace.

Ex: stringBefore("Damien, Jean, Paul") va retourner Damien car on lui demande de ne retourner que ce qui est avant la virgule (la virgule étant la valeur par défaut du second paramètre quand il n'est pas précisé).


Tronquer la chaîne avec tout ce qui est "après" une sous-chaîne
  1. Fonction : stringAfter
  2. Nombre de paramètres : 1 obligatoire, 1 facultatif.
  3. Paramètres attendus :
    1. La chaîne de caractères dans laquelle rechercher.
    2. (Optionnel) La chaîne de caractères (ou simplement le caractère) jusqu'auquel il faut tronquer. Si rien n'est précisé, le caractère , sera utilisé.

Ex: stringAfter("Maison d'été", " ") va retourner d'été car on lui demande de ne retourner que ce qui est après l'espace.

Ex: stringAfter("Damien, Jean, Paul") va retourner Jean, Paul car on lui demande de ne retourner que ce qui est après la virgule (la virgule étant la valeur par défaut du second paramètre quand il n'est pas précisé).


Rechercher et remplacer dans une chaîne
  1. Fonction : stringReplace
  2. Nombre de paramètres : 2 obligatoires, 1 facultatif.
  3. Paramètres attendus :
    1. La chaîne de caractères dans laquelle rechercher et remplacer ;
    2. La chaîne de caractères de remplacement (celle qui sera "insérée") ;
    3. (Optionnel) La chaîne de caractères qui sera recherchée (celle qui sera remplacée). Par défaut, si rien n'est précisé, ce sont des sauts de ligne (\n) qui seront recherchés.

Ex: stringReplace("Damien", "F", "D") va retourner Famien car on lui demande de remplacer D par F dans la chaîne Damien.

Ex: par exemple une variable ADDRESS qui contient une adresse postale sur plusieurs lignes, stringReplace(ADDRESS, ", ") va permettre de la renvoyer sur une seule et même ligne (séparée par des virgules). Le troisième paramètre n'est pas précisé car par défaut, ce sont des sauts de ligne qui sont recherchés et remplacés.

A l'inverse, pour remplacer des virgules par des sauts de ligne, il faudra écrire l'expression de cette façon : stringReplace(ADDRESS, "\n", ",").

Fonctions sur des listes

Obtenir la valeur d'un élément d'une liste à partir d'une clé
  1. Fonction : get_value
  2. Nombre de paramètres : 2 ou 3
  3. Paramètres attendus :
    1. - Une variable de type List ;
    2. - La clé à cibler ;
    3. - Dans le cas d'une liste "structurée" (issue d'un Repeater par exemple), on peut préciser le nom de la sous-variable à renvoyer.
Cas pratique

Cas d'une liste EMPLOYES, utilisée dans un Repeater, dont chaque élément défini 3 sous-variables: EMPLOYES.NOM, EMPLOYES.DATE_ENTREE, EMPLOYES.SALAIRE.

Ceci étant, l'utilisateur a renseigner dans un formulaire 2 fiches correspondante à EMPLOYES. Elles ont respectivement les clés '_abc123' et '_xyz987' :

   [
     '_abc123' => [ 'NOM': 'Jean', 'DATE_ENTREE': '13-08-2020', 'SALAIRE': 32000.00 ,
     '_xyz987' => [ 'NOM': 'Sylvie', 'DATE_ENTREE': '11-12-2019', 'SALAIRE': 39500.00
   ]
Usage

- get_value(EMPLOYES, '_abc123', 'NOM') => va renvoyer "Jean"
- get_value(EMPLOYES, '_xyz987', 'SALAIRE') => va renvoyer 39500.0

Mais là où cette fonction prend tout son intérêt, c'est quand le second paramètre est dynamique, c'est à dire qu'il est fourni au travers d'une variable.
Prenons par exemple, une variable "MEILLEUR_EMPLOYE", qui serait utilisée dans un formulaire avec un champ "choice-list", et qui prendra pour valeur la clé correspondante au meilleur employé de l'entreprise (= c'est à dire '_abc123' ou '_xyz987' dans notre exemple).


- get_value(EMPLOYES, MEILLEUR_EMPLOYE, 'SALAIRE') => va renvoyer le salaire du meilleur employé selon le choix effectué.



Obtenir la valeur d'un élément d'une liste à partir de son index
  1. Fonction : get_value_by_index
  2. Nombre de paramètres : 2
  3. Paramètres attendus :
    1. - Une variable de type List ;
    2. - L'index de l'élément à retourner (1,2,3…)


Cette fonction est similaire au get_value mais en utilisant l'index de l'élément au lieu de sa clé.
Le paramètre `index` peut être fourni au travers d'une variable ou directement "en dur".
Exemple sans variable : get_value_by_index(EMPLOYES, 3)
Exemple avec variable : get_value_by_index(EMPLOYES, INDEX_MEILLEUR_EMPLOYE)


Notez que dans le cas d'une liste structuré, l'élément retourné sera lui même une liste avec des sous-variables. Il faudra donc parfois combiner cette fonction avec un `get_value` :
Exemple : Obtenir le NOM du 3ème employé de la liste EMPLOYES : get_value( get_value_by_index(EMPLOYES, 3), 'NOM')
Savoir si une liste contient ou pas une certaine clé
  1. Fonction : has_key
  2. Nombre de paramètres : 2
  3. Paramètres attendus :
    1. - Une variable de type List ;
    2. - La clé à rechercher ;

Usage

- has_key(EMPLOYES_CDI, '_abc123') => va renvoyer TRUE si la liste EMPLOYES_CDI contient bien la clé '_abc123'

Tout comme pour la fonction get_value cette fonction prend tout son intérêt quand le second paramètre est dynamique, c'est à dire qu'il est fourni au travers d'une variable.
Prenons par exemple, une variable "MEILLEUR_EMPLOYE", qui serait utilisée dans un formulaire avec un champ "choice-list", et qui prendra pour valeur la clé correspondante au meilleur employé de l'entreprise (= c'est à dire '_abc123' ou '_xyz987' dans notre exemple).
S'il on veut savoir si cet employé fait parti de la liste de ceux qui sont en CDI, on pourrait faire :
- has_key(EMPLOYES_CDI, MEILLEUR_EMPLOYE) => va renvoyer TRUE si la clé renseignée dans MEILLEUR_EMPLOYE se trouve bien dans la liste EMPLOYES_CDI.


Assigner un nouveau couple clé-valeur dans une liste
  1. Fonction : set_in_struct
  2. Nombre de paramètres : 3
  3. Paramètres attendus :
    1. - Une variable de type List ;
    2. - La clé à créer ou mettre à jour (string);
    3. - La valeur a assigner ;


Usage

- set_in_struct(PRODUITS, CODE_PRODUIT, PRIX) => va renvoyer la liste PRODUITS avec la nouvelle valeur assignée.

Explication

Dans l'exemple ci-dessous, nous avons imaginé une liste PRODUITS qui serait de la forme :

[ '_abc123' => 12.50,  '_xyz985' => 89.99 ]

- CODE_PRODUIT est une variable "string", par exemple "_bcd456" ;
- PRIX est une variable "numerique", par exemple 13.50 ;

Ceci étant, l'instruction ci-dessus, va retourner une liste de la forme :

[
'_abc123' => 12.50,
'_xyz985' => 89.99,
'_bcd456' => 13.50,
]


Additionner les répétitions d'une sous-variable d'une liste structurée
  1. Fonction : list_sum
  2. Nombre de paramètres : 2
  3. Paramètres attendus :
    1. - Une variable de type List (utilisée par exemple dans un Repeater) ;
    2. - Le nom de la sous-variable qui devra être additionnée ;

Contexte

Il est parfois nécessaire d'additionner les différentes répétitions d'une même sous-variable.

Par exemple, dans cette situation :

Une sous-variable répétée demande ici le prix d'une chemise. Comment faire pour obtenir la somme des prix de toutes les chemises ?

Paramétrage

Le paramétrage prend la forme suivante :

list_sum(VARIABLE_LISTE,"SOUS_VARIABLE")

Pour obtenir le prix de toutes les Chemises dans l'exemple ci-dessus, il faudra paramétrer une Dynvar dont la formule sera list_sum(CHEMISES,"prix")


Obtenir une copie filtrée d'une liste à partir d'une série de clés
  1. Fonction : filter_by_keys
  2. Nombre de paramètres : 2
  3. Paramètres attendus :
    1. - Une liste avec des clés et des valeurs (ex: ASSOCIES);
    2. - Une liste de clés ;
Exemple de paramétrage :

Pour obtenir une copie de la liste des associés mais avec uniquement ceux qui ont été cochés comme "présents" :

filter_by_keys(ASSOCIES, ASSOCIES_PRESENTS)

Montrer et organiser les valeurs d'une liste (à rerédiger plus parfaitement)
  1. Fonction : join
  2. Nombre de paramètres : 5
  3. Paramètres attendus :
    1. - Une variable de liste (paramètre obligatoire) ;
    2. - Séparateur (facultatif) ;
    3. - Dernier séparateur (facultatif) ;
    4. - Préfixe (facultatif) ;
    5. - Suffixe (facultatif)
Exemple de paramétrage :

Il est possible de combiner "join" avec la fonction "filter_by_keys".

Par ex : join( filter_by_keys(FILIALES_DISPLAY, CONV.TRESO_FILIALES_PARTICIPANTES) , "", "", "\t - ", " ; \n")

Fonctions autres

Vérifier si une variable est "vide"
  1. Fonction : is_empty
  2. Nombre de paramètres : 1
  3. Paramètres attendus : Une variable de n'importe quel type
  4. Exemple : is_empty(MY_VAR) == true

Pour savoir si une variable ne possède aucun valeur, il est préférable de tester cela avec la fonction is_empty.

La fonction renverra VRAI pour n'importe quelle variable vide : (chaîne vide), liste vide …

Par contre, la fonction renverra FALSE si une valeur est présente, même si cette valeur est un 0 ou le booléen "false" (c'est d'ailleurs pour cela qu'il est préférable d'utiliser `is_empty(MY_VAR)` au lieu de, par exemple, `MY_VAR = null`.

Vérifier si une variable est "non vide"
  1. Fonction : is_set
  2. Nombre de paramètres : 1
  3. Paramètres attendus : Une variable de n'importe quel type
  4. Exemple : is_set(MY_VAR) == true

A l'inverse de la fonction is_empty, la fonction is_set permet de savoir si une variable possède une valeur.

La fonction renverra VRAI pour n'importe quelle variable non-vide : "une chaîne", un nombre tel que 12.45 ou même 0 (zéro), une liste non-vide etc.