Calculer une valeur avec une formule
Le marqueur de formule, les fonctions de calcul sûres pour les montants et l'écriture dans un champ crédit
À quoi ça sert
Une variable recopie une valeur telle quelle. Une formule en calcule une : retrancher un montant à un solde de crédits, multiplier une quantité par un prix unitaire, additionner les prix des produits liés à une fiche, choisir une valeur selon une condition.
Une formule s'écrit dans les paramètres d'une action, entre {{= et }}. Elle
peut occuper toute la valeur — elle rend alors un nombre, un texte ou un oui/non
selon son résultat — ou être insérée dans une phrase, auquel cas son résultat est
converti en texte.
Concepts clés
- Marqueur de formule — la paire
{{=et}}. Sans elle, le contenu est pris pour du texte. - Racines — les mêmes que dans une condition :
record,before,afteretactor. Une formule les lit sans le préfixetrigger.: on écritrecord.credits, pas{{trigger.record.credits}}. - Fonctions de calcul sûres —
add,sub,mul,div,roundetsum. Elles doivent être employées pour tout ce qui touche à de l'argent. related— les enregistrements liés à l'objet déclencheur, chargés au moment du déclenchement. Accessible uniquement dans une formule.
Comment faire
Calculer un montant
- Dans les paramètres de l'action, écrivez la valeur sous forme de formule.
- Utilisez
add,sub,muloudivplutôt que+,-,*ou/. - Arrondissez le résultat final avec
round.
Exemple, pour décrémenter un solde de crédits du montant de la facture :
{{= round(sub(record.credits, record.totalTtc), 2) }}Les opérateurs natifs +, -, * et / restent acceptés, mais ils font un
calcul à virgule flottante imprécis : ne les utilisez jamais pour un montant.
Choisir une valeur selon une condition
- Écrivez une expression conditionnelle dans la formule.
Exemple :
{{= record.amount > 1000 ? "gold" : "standard" }}Insérer un résultat dans une phrase
- Écrivez la formule au milieu du texte.
Exemple :
Solde restant : {{= sub(record.credits, record.totalTtc) }} €Le résultat est converti en texte à l'endroit de la formule. Le reste de la phrase est conservé tel quel.
Additionner les données liées à une fiche
- Vérifiez que le champ à agréger est un champ de relation ou un champ catalogue de la fiche déclencheuse.
- Écrivez la formule avec
related,mapetsum.
Exemple, pour écrire dans un champ CRM la somme des prix de vente des produits liés :
{{= round(sum(related.produits.map(p, p.sellingPrice)), 2) }}Remplacez produits par le nom technique de votre champ. Seuls les champs
réellement cités par une formule sont chargés.
Alimenter un champ crédit
- Écrivez la valeur comme un montant signé à ajouter, jamais comme le solde visé.
- Renseignez un objet contenant le montant et sa note.
Exemple, pour débiter le montant d'une facture :
{
"Crédits": {
"amount": "{{= round(mul(record.totalTtc, -1), 2) }}",
"note": "facture"
}
}Un champ crédit fonctionne comme un cahier auquel on ajoute des écritures : la valeur écrite s'ajoute au solde, elle ne le remplace pas. Quand l'information complémentaire du champ est une liste, la note doit être une des valeurs configurées. Voir Champ crédit.
Référence
Fonctions disponibles
| Fonction | Effet |
|---|---|
add(a, b) | Addition sûre de deux montants |
sub(a, b) | Soustraction sûre |
mul(a, b) | Multiplication sûre : quantité par prix unitaire |
div(a, b) | Division sûre. Échoue si le diviseur vaut zéro |
round(valeur) ou round(valeur, décimales) | Arrondit à N décimales, zéro par défaut. À appliquer sur le résultat monétaire final |
sum(liste) | Somme sûre d'une liste de nombres, typiquement les prix des enregistrements liés |
size(valeur) | Taille d'une chaîne ou d'une liste |
has(champ) | Teste la présence d'une clé |
Cette liste est complète : aucune autre fonction ne peut être appelée. Les
opérations sur les listes — map, filter, all, exists — s'écrivent
attachées à la liste, comme dans related.produits.map(p, p.sellingPrice).
Contenu de related
| Type de champ de la fiche | Ce que related contient |
|---|---|
| Champ catalogue à valeurs multiples | Un objet par produit avec id, name, sellingPrice, vatRate et unit |
| Champ de relation CRM | Un objet par enregistrement lié, avec ses champs |
| Champ utilisateur | Un objet par utilisateur, avec id, name et email |
Les objets auxquels vous n'avez pas accès sont absents de la liste : un total
calculé avec sum les exclut.
Pour un déclencheur de type tâche, ce sont les champs personnalisés du type de tâche qui sont chargés selon les mêmes règles.
Refus à l'enregistrement
Une formule est contrôlée au moment de l'enregistrement de la règle.
| Message | Cause |
|---|---|
| « L'expression de la règle d'automatisation est invalide. » | La formule ne s'analyse pas |
« <racine> n'existe pas dans le contexte de la règle. Racines disponibles : record, before, after, related, actor. » | La formule lit une racine inconnue |
« <référence> n'existe pas : record, before, after, related, actor sont des racines de premier niveau. Écrivez <champ> sans préfixe. » | Une racine a été imbriquée dans une autre |
« Le champ <champ> n'existe pas sur <entité>, ou n'est pas accessible aux automatisations. » | Faute de frappe sur un nom de champ |
« Fonction <nom> inconnue dans la formule. Fonctions autorisées : has, size, add, sub, mul, div, round. » | Une fonction hors de la liste autorisée est appelée |
Erreurs à l'exécution
| Situation | Conséquence |
|---|---|
| Une opérande n'est pas un nombre : champ vide, texte non numérique | L'action passe en erreur. Aucune valeur n'est écrite |
| Une division par zéro | L'action passe en erreur |
Une formule référence related alors qu'aucune donnée liée n'a pu être chargée | L'action passe en erreur |
Une formule ne fabrique jamais de valeur par défaut : plutôt qu'écrire zéro ou une valeur approchée, elle fait échouer l'action, visible dans l'onglet « Exécutions ».
Limite d'écriture
Une formule ne peut pas contenir la séquence }} autrement que pour se fermer.
Si votre calcul en a besoin, placez la formule seule dans la valeur plutôt que de
l'insérer dans une phrase.
Questions fréquentes
Puis-je utiliser une formule dans une condition ?
Non. Le marqueur {{= }} n'est reconnu que dans les paramètres d'une action. Une
condition s'écrit directement en expression, sans marqueur, et les fonctions de
calcul n'y sont pas disponibles. Voir
Restreindre une règle par une condition.
Pourquoi ne pas écrire simplement record.credits - record.totalTtc ?
Parce que la soustraction native est un calcul à virgule flottante : sur des
montants, elle produit des résultats faux au centime près. sub fait le calcul
exact.
Puis-je additionner les montants de plusieurs fiches liées ?
Oui, si elles sont liées par un champ de relation de la fiche déclencheuse :
{{= sum(related.<champ>.map(f, f.<montant>)) }}. Les fiches hors de votre
périmètre d'accès sont exclues du total.
Une formule peut-elle rendre autre chose qu'un nombre ?
Oui. Seule dans la valeur, elle rend son résultat avec son type : nombre, texte ou oui/non. Insérée dans une phrase, elle rend toujours du texte.