DeltiaAide

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, after et actor. Une formule les lit sans le préfixe trigger. : on écrit record.credits, pas {{trigger.record.credits}}.
  • Fonctions de calcul sûresadd, sub, mul, div, round et sum. 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

  1. Dans les paramètres de l'action, écrivez la valeur sous forme de formule.
  2. Utilisez add, sub, mul ou div plutôt que +, -, * ou /.
  3. 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

  1. Écrivez une expression conditionnelle dans la formule.

Exemple :

{{= record.amount > 1000 ? "gold" : "standard" }}

Insérer un résultat dans une phrase

  1. É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

  1. Vérifiez que le champ à agréger est un champ de relation ou un champ catalogue de la fiche déclencheuse.
  2. Écrivez la formule avec related, map et sum.

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

  1. Écrivez la valeur comme un montant signé à ajouter, jamais comme le solde visé.
  2. 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

FonctionEffet
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).

Type de champ de la ficheCe que related contient
Champ catalogue à valeurs multiplesUn objet par produit avec id, name, sellingPrice, vatRate et unit
Champ de relation CRMUn objet par enregistrement lié, avec ses champs
Champ utilisateurUn 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.

MessageCause
« 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

SituationConséquence
Une opérande n'est pas un nombre : champ vide, texte non numériqueL'action passe en erreur. Aucune valeur n'est écrite
Une division par zéroL'action passe en erreur
Une formule référence related alors qu'aucune donnée liée n'a pu être chargéeL'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.

Sur cette page