Aller au contenu principal
Version: 1.0.0

Écrire une formule

Un champ calculé affiche une valeur que la plateforme calcule pour vous, à chaque lecture de la fiche. Vous ne la saisissez jamais, elle ne se démode jamais.

Une formule sait faire trois choses : calculer (un montant, une marge), décider (afficher un texte selon une condition) et aller chercher une valeur sur une fiche liée. Cette page couvre l'écriture des formules. Pour le reste des champs calculés, cumuls et pré-remplissage, voir Relations & calculs.

Éditeur de champ calculé, avec l'aperçu du résultat

L'éditeur vous aide

Dans le Studio, onglet Objets, ouvrez votre objet, onglet Champs, puis + Ajouter un champ et choisissez le type Champ calculé (formule).

Trois appuis pendant que vous écrivez :

  • Les champs se complètent tout seuls. Tapez { et la liste des champs s'ouvre : ceux de la fiche, et ceux des fiches liées. Flèches pour choisir, Entrée pour insérer. Vous n'avez jamais à deviner un code technique.
  • Le résultat s'affiche en direct, calculé sur une vraie fiche de votre objet, dont le nom est rappelé à droite (« sur CycloVolt » dans l'image). C'est la seule façon de vérifier qu'une formule dit bien ce que vous croyez.
  • Les valeurs lues sont listées sous l'éditeur, référence par référence. Un résultat surprenant s'explique presque toujours par une référence vide : vous la voyez immédiatement.

Si la formule est incorrecte, le message le dit précisément (fonction inconnue, parenthèse manquante…) et le champ ne peut pas être enregistré tant qu'elle ne tient pas debout.

Corriger plus tard

La formule d'un champ existant se modifie : icône crayon dans la liste des champs. Pas besoin de supprimer le champ et de le recréer.

Les briques du langage

Référencer un champ

Un champ se référence par son code entre accolades :

{quantite} * {prix_unitaire}

Pour un champ d'une fiche liée, on passe par le champ relation, puis le champ visé :

{client.ville}
{client.delai_paiement}

Un seul niveau : {client.ville} fonctionne, {client.commercial.email} non. Si la relation est vide, la valeur lue est vide, le calcul ne casse pas.

Choisir : SI

SI(condition ; valeur si vrai ; valeur si faux)

C'est la brique la plus utile :

SI({statut} == "livree" ; "Terminé" ; "En cours")
SI({montant} > 1000 ; {montant} * 0.95 ; {montant})
SI({client.categorie} == "pro" ; "Tarif pro" ; "Tarif public")

Seule la branche retenue est calculée. Vous pouvez donc écrire sans crainte :

SI({quantite} == 0 ; 0 ; {total} / {quantite})

La division n'a jamais lieu quand la quantité est nulle.

Comparer

== (égal), != (différent), <, <=, >, >=.

Quand les deux côtés sont des nombres, la comparaison est numérique. Sinon elle porte sur le texte, sans tenir compte de la casse ni des espaces autour : {statut} == "Livrée" reconnaît la valeur livrée.

Combiner : ET, OU, NON

SI(ET({montant} > 1000 ; {client.ville} == "Niort") ; "Livraison offerte" ; "")
SI(OU({statut} == "annule" ; {statut} == "refuse") ; "Perdu" ; "En cours")
SI(NON(ESTVIDE({email})) ; "Joignable" ; "À compléter")

Séparateur des arguments

Le point-virgule et la virgule fonctionnent tous les deux : SI(a ; b ; c) comme SI(a, b, c). Écrivez comme dans votre tableur.

Les fonctions

FonctionEffetExemple
SI(cond ; alors ; sinon)Choisit selon une conditionSI({actif} ; "Oui" ; "Non")
ET(a ; b) / OU(a ; b) / NON(a)Combine des conditionsET({a} > 0 ; {b} > 0)
ARRONDI(v ; n)Arrondit à n décimalesARRONDI({ht} * 0.2 ; 2)
MIN(a ; b) / MAX(a ; b)Plus petite / plus grande valeurMIN({remise} ; 50)
ABS(v)Valeur absolueABS({ecart})
ENT(v) / DECIMAL(v)Convertit en entier / en décimalENT({duree})
CONCAT(a ; b ; …)Colle des textesCONCAT({nom} ; " — " ; {ville})
TEXTE(v)Convertit un nombre en texteCONCAT("Total : " ; TEXTE({total}))
MAJUSCULE(v) / MINUSCULE(v)Change la casseMAJUSCULE({code})
SUPPRESPACE(v)Retire les espaces de début et de finSUPPRESPACE({reference})
NBCAR(v)Nombre de caractèresNBCAR({siret})
GAUCHE(v ; n) / DROITE(v ; n)n premiers / derniers caractèresGAUCHE({code_postal} ; 2)
CONTIENT(v ; texte)Vrai si la valeur contient le texteCONTIENT({notes} ; "urgent")
ESTVIDE(v)Vrai si la valeur est videESTVIDE({email})
SIVIDE(v ; repli)Première valeur non videSIVIDE({surnom} ; {nom})
AUJOURDHUI()Date du jourSI({date_echeance} < AUJOURDHUI() ; "En retard" ; "")

Les noms anglais fonctionnent aussi (IF, AND, ROUND, CONCAT…), et la casse n'a pas d'importance : SI, Si et si sont la même fonction.

Opérateurs de calcul : +, -, *, /, % (reste de division), ** (puissance), et les parenthèses. À noter : + colle deux textes et additionne deux nombres ; en cas de doute, CONCAT est explicite.

Le type du résultat

Le sélecteur Type du résultat dit ce que produit la formule : Nombre décimal (par défaut), Nombre entier, Texte, Oui / Non ou Date. C'est lui qui décide de l'affichage dans les listes, les fiches et les documents.

Choisissez Texte dès que votre formule peut renvoyer un libellé, sinon le résultat restera vide : une formule qui rend « Terminé » dans un champ déclaré numérique n'a pas de valeur numérique à afficher.

Des formules qui servent

BesoinFormuleType du résultat
Montant d'une ligne{quantite} * {prix_unitaire}Nombre décimal
TVA arrondie au centimeARRONDI({total_ht} * 0.2 ; 2)Nombre décimal
Remise selon le type de clientSI({client.categorie} == "pro" ; {total} * 0.9 ; {total})Nombre décimal
État lisible d'une commandeSI({statut} == "livree" ; "Terminé" ; "En cours")Texte
Signaler un retardSI({date_echeance} < AUJOURDHUI() ; "En retard" ; "")Texte
Étiquette complèteCONCAT({nom} ; " — " ; {client.ville})Texte
Fiche à compléterESTVIDE({email})Oui / Non
Marge en pourcentageSI({ca} == 0 ; 0 ; ARRONDI(({ca} - {cout}) / {ca} * 100 ; 1))Nombre décimal
Livraison offerteSI(ET({montant} > 1000 ; {client.ville} == "Niort") ; "Offerte" ; "Facturée")Texte

Ce qu'une formule ne fait pas

  • Elle ne s'enregistre pas : la valeur est recalculée à chaque lecture. Modifiez un champ source, le résultat suit immédiatement.
  • Elle n'est ni triable ni filtrable : le tri et les filtres travaillent sur les données stockées.
  • Elle ne remonte pas plusieurs relations : un seul saut, {client.ville}.
  • Elle ne se référence pas elle-même, et ne peut pas lire un champ marqué Sensible / PII (chiffré au repos) : le résultat, lui, ne serait pas chiffré et exposerait la valeur.
  • Un champ vide vaut 0 dans un calcul et texte vide dans une comparaison de textes. Une division par zéro donne un résultat vide, jamais une erreur.
Champ protégé

Un champ utilisé dans une formule ne peut pas être supprimé : le Studio refuse avec le message « Champ utilisé dans une formule, non supprimable ». Retirez d'abord la référence de la formule.

Pour aller plus loin : Relations & calculs · Types de champs · Automatisations · Documents PDF