View Categories

 Exemples avancés par domaine métier

Table des matières

Calculs commerciaux et financiers #

Calculer le montant brut d’une ligne #

Champs :

Quantite
PrixUnitaire

Formule :

Field("Quantite") * Field("PrixUnitaire")

Exemple :

Quantite = 12
PrixUnitaire = 25
300

Appliquer une remise en pourcentage #

Champs :

MontantBrut
TauxRemise

Formule :

Field("MontantBrut") * (1 - Field("TauxRemise") / 100)

Avec :

MontantBrut = 1 000
TauxRemise = 10

Résultat :

900

Le champ peut être nommé MontantNet.

Calculer une marge #

Field("MontantNet") - Field("CoutRevient")

Avec :

MontantNet  = 900
CoutRevient = 650

Résultat :

250

Calculer un taux de marge en évitant une division par zéro #

Iff(
    Field("MontantNet") = 0,
    0,
    Round(1,(Field("Marge") / Field("MontantNet")) * 100)
)

Format :

0.0 %

Résultat possible :

27.8 %

Calculer le taux d’atteinte d’un objectif #

Iff(
    Field("Objectif") = 0,
    0,
    Round(1,(Field("Realise") / Field("Objectif")) * 100)
)

Avec :

Objectif = 500 000
Realise  = 535 000

Résultat :

107,0

Le format d’affichage du champ peut ensuite ajouter le symbole %.


Construire une chaîne de calculs métier #

C’est un exemple particulièrement intéressant pour expliquer la règle d’ordre des champs calculés.

On peut construire successivement :

Quantite
PrixUnitaire
TauxRemise
CoutRevient
MontantBrut
MontantNet
Marge
TauxMarge
StatutMarge

MontantBrut #

Field("Quantite") * Field("PrixUnitaire")

MontantNet #

Field("MontantBrut") * (1 - Field("TauxRemise") / 100)

Marge #

Field("MontantNet") - Field("CoutRevient")

TauxMarge #

Iff(
    Field("MontantNet") = 0,
    0,
    Round(1,(Field("Marge") / Field("MontantNet")) * 100)
)

StatutMarge #

Iff(
    Field("TauxMarge") >= 20,
    "Rentabilité élevée",
    Iff(
        Field("TauxMarge") >= 10,
        "Rentabilité correcte",
        "Rentabilité faible"
    )
)

Cet exemple permet de rappeler une règle essentielle :

Un champ calculé doit être positionné avant tous les champs calculés qui réutilisent son résultat.
MontantBrut doit donc précéder MontantNet, qui doit précéder Marge, etc.


Classification et indicateurs métier #

Segmenter des clients selon leur chiffre d’affaires #

Iff(
   Field("CAAnnuel") >= 1000000,
    "A - Stratégique",
    Iff(
        Field("CAAnnuel") >= 250000,
        "B - Important",
        "C - Standard"
    )
)

Il est ainsi possible de créer une nouvelle dimension métier sans modifier la requête SQL.

Déterminer l’état d’un objectif #

Iff(
    Field("TauxAtteinte") >= 100,
    "Objectif atteint",
    Iff(
        Field("TauxAtteinte") >= 90,
        "Proche de l'objectif",
        "Sous l'objectif"
    )
)

Combiner plusieurs critères #

Par exemple, signaler un client présentant un risque commercial :

Iff(
    (Field("Encours") > Field("LimiteCredit"))
    or
    (Field("TauxMarge") < 5),
    "À surveiller",
    "Situation normale"
)

Plusieurs conditions obligatoires #

Iff(
    (Field("TauxMarge") >= 15)
    and
    (Field("TauxAtteinte") >= 100),
    "Performance élevée",
    "Performance standard"
)

Les opérateurs and et or permettent donc de construire des règles métier plus élaborées.


Stocks et logistique #

Identifier l’état du stock #

Iff(
    Field("StockDisponible") <= 0,
    "Rupture",
    Iff(
        Field("StockDisponible") <= Field("StockSecurite"),
        "À réapprovisionner",
        "Disponible"
    )
)

Calculer une quantité de réapprovisionnement #

Champs :

StockDisponible
StockCible

Formule :

maxval(
    Field("StockCible") - Field("StockDisponible"),
    0
)

Avec :

StockDisponible = 35
StockCible      = 100

Résultat :

65

Si le stock est déjà supérieur à la cible, le résultat restera à 0.

Contrôler le respect d’une date de livraison #

Iff(
    Field("DateLivraison") <= Field("DateLivraisonPrevue"),
    "Livraison conforme",
    "Livraison en retard"
)

Calculer un taux de service #

Iff(
    Field("QuantiteCommandee") = 0,
    0,
    Round(
        1,
        Field("QuantiteLivree") / Field("QuantiteCommandee") * 100
    )
)

Dates, échéances et périodes #

Les fonctions de date sont particulièrement intéressantes pour éviter d’ajouter systématiquement des colonnes dans les requêtes SQL.

Calculer une échéance de paiement #

Champs :

DateFacture
DelaiPaiementJours

Formule :

AddDays(
    Field("DateFacture"),
    Field("DelaiPaiementJours")
)

Par exemple :

DateFacture         = 15/08/2026
DelaiPaiementJours  = 30

donne une échéance au :

14/09/2026

Déterminer si une échéance est dépassée #

Iff(
    Field("DateEcheance") < _DATE,
    "Échue",
    "À venir"
)

_DATE représente la date courante.

Créer une année d’analyse #

year(Field("DateCommande"))

Créer un trimestre #

quarter(Field("DateCommande"))

Créer un libellé Année / Trimestre #

year(Field("DateCommande"))
& " - T"
& quarter(Field("DateCommande"))

Résultat :

2026 - T3

Cela peut ensuite être utilisé comme dimension dans les composants.

Numéro de semaine #

week(Field("DateCommande"))

Trouver le dernier jour du mois #

lastday(Field("DateCommande"))

Pour une date en février 2028, le résultat sera :

29

Comparer deux dates sous forme lisible #

La fonction DateDiff peut produire une durée formatée :

DateDiff(
    Field("DateDebut"),
    Field("DateFin"),
    "{0:dd} jour(s) {0:hh} heure(s)"
)

Cette fonction est utile pour de l’affichage, mais elle met aussi en évidence une limitation actuelle que je détaille plus bas : il manque une fonction simple retournant directement un nombre de jours entre deux dates.


Qualité et contrôle des données #

C’est une catégorie que j’ajouterais vraiment au Wiki, car les champs calculés peuvent être très utiles pour cela.

Normaliser un code #

upper(trim(Field("CodeClient")))

Par exemple :

"  cli-0045  "

devient :

CLI-0045

Nettoyer un numéro de téléphone #

replace(
    replace(
        replace(Field("Telephone")," ",""),
        ".",
        ""
    ),
    "-",
    ""
)

Ainsi :

04 76.12-34-56

devient :

0476123456

Contrôler un identifiant numérique de longueur fixe #

Si la source garantit une chaîne non nulle :

Iff(
    (length(trim(Field("Identifiant"))) = 14)
    and
    numeric(trim(Field("Identifiant"))),
    "Format correct",
    "À contrôler"
)

Contrôle simple d’une adresse e-mail #

Ce n’est pas une validation complète d’adresse e-mail, mais cela peut servir de contrôle élémentaire :

Iff(
    (pos("@",Field("Email")) > 1)
    and
    (pos(".",Field("Email")) > 3),
    "Format plausible",
    "À contrôler"
)

Extraire une partie d’une référence #

Avec :

CMD-2026-001258

on peut par exemple récupérer le préfixe :

copy(Field("Reference"),1,3)

Résultat :

CMD

Production, qualité et performance #

Calculer un taux de rebut #

Iff(
    Field("QuantiteProduite") = 0,
    0,
    Round(
        2,
        Field("QuantiteRebut") / Field("QuantiteProduite") * 100
    )
)

Déterminer le respect d’un SLA #

Iff(
    Field("TempsTraitementHeures") <= Field("SLAHeures"),
    "SLA respecté",
    "SLA dépassé"
)

Calculer un écart par rapport à une référence #

Field("ValeurReelle") - Field("ValeurCible")

Calculer l’écart absolu #

Si seul l’écart importe, quel que soit son sens :

abs(
    Field("ValeurReelle") - Field("ValeurCible")
)

Calculer un indice de productivité #

Iff(
    Field("HeuresTravaillees") = 0,
    0,
    Round(
        2,
        Field("QuantiteProduite") / Field("HeuresTravaillees")
    )
)

Ressources humaines et capacité #

Calculer un taux d’occupation #

Iff(
    Field("HeuresDisponibles") = 0,
    0,
    Round(
        1,
        Field("HeuresAffectees") / Field("HeuresDisponibles") * 100
    )
)

Calculer les heures supplémentaires #

maxval(
    Field("HeuresTravaillees") - Field("HeuresContractuelles"),
    0
)

Classer une charge de travail #

Iff(
    Field("TauxOccupation") > 100,
    "Surcharge",
    Iff(
        Field("TauxOccupation") >= 80,
        "Charge élevée",
        "Charge normale"
    )
)

Manipulation et présentation de texte #

Construire un libellé métier #

Field("CodeClient")
& " - "
& Field("NomClient")
& " / "
& Field("Ville")

Résultat :

CLI0045 - Société Exemple / Grenoble

Uniformiser une ville #

upper(trim(Field("Ville")))

Remplacer un ancien libellé #

replace(
    Field("Categorie"),
    "GRAND COMPTE",
    "Compte stratégique"
)

Afficher uniquement une partie d’une référence #

copy(Field("NumeroCommande"),5,4)

Un peu de HTML métier #

Sans revenir sur les liens hypertextes, le HTML peut aussi servir à mettre en évidence une information.

Par exemple, pour créer un statut visuel :

Iff(
    Field("Statut") = "OK",
    "<span style=""color:#2e7d32;font-weight:bold;"">Conforme</span>",
    "<span style=""color:#c62828;font-weight:bold;"">À contrôler</span>"
)

Il faut dans ce cas activer Code HTML sur le champ calculé.
C’est suffisant pour des mises en évidence simples ; je déconseillerais de faire du HTML complexe dans des champs calculés.


Défiler vers le haut