Calculs¶
La fonctionnalité Calculs (Admin > Métamodèle > onglet Calculs) vous permet de définir des formules qui calculent automatiquement des valeurs de champs lorsque les fiches sont sauvegardées. C'est un outil puissant pour dériver des métriques, des scores et des agrégations à partir de vos données d'architecture.
Comment ça marche¶
- Un administrateur définit une formule ciblant un type de fiche et un champ spécifiques
- Lorsqu'une fiche de ce type est créée ou mise à jour, la formule s'exécute automatiquement
- Le résultat est écrit dans le champ cible
- Le champ cible est marqué en lecture seule sur la page de détail de la fiche (les utilisateurs voient un badge « calculé »)
Création d'un calcul¶
Cliquez sur + Nouveau calcul et configurez :
| Champ | Description |
|---|---|
| Nom | Nom descriptif du calcul |
| Type cible | Le type de fiche auquel ce calcul s'applique |
| Champ cible | Le champ où le résultat est stocké |
| Formule | L'expression à évaluer (voir la syntaxe ci-dessous) |
| Ordre d'exécution | Ordre d'exécution lorsque plusieurs calculs existent pour le même type (le plus petit s'exécute en premier) |
| Actif | Activer ou désactiver le calcul |
Syntaxe des formules¶
Les formules utilisent un langage d'expression sécurisé et isolé. Vous pouvez référencer les attributs de la fiche, les données des fiches liées et les informations du cycle de vie.
Variables de contexte¶
| Variable | Description | Exemple |
|---|---|---|
fieldKey |
N'importe quel attribut de la fiche courante | businessCriticality |
related_{type_key} |
Tableau de fiches liées d'un type donné | related_applications |
lifecycle_plan, lifecycle_active, etc. |
Valeurs de dates du cycle de vie | lifecycle_endOfLife |
Fonctions intégrées¶
| Fonction | Description | Exemple |
|---|---|---|
IF(condition, valeur_vraie, valeur_fausse) |
Logique conditionnelle | IF(riskLevel == "critical", 100, 25) |
SUM(tableau) |
Somme des valeurs numériques | SUM(PLUCK(related_applications, "costTotalAnnual")) |
AVG(tableau) |
Moyenne des valeurs numériques | AVG(PLUCK(related_applications, "dataQuality")) |
MIN(tableau) |
Valeur minimale | MIN(PLUCK(related_itcomponents, "riskScore")) |
MAX(tableau) |
Valeur maximale | MAX(PLUCK(related_itcomponents, "costAnnual")) |
COUNT(tableau) |
Nombre d'éléments | COUNT(related_interfaces) |
ROUND(valeur, decimales) |
Arrondir un nombre | ROUND(avgCost, 2) |
ABS(valeur) |
Valeur absolue | ABS(delta) |
COALESCE(a, b, ...) |
Première valeur non nulle | COALESCE(customScore, 0) |
LOWER(texte) |
Texte en minuscules | LOWER(status) |
UPPER(texte) |
Texte en majuscules | UPPER(category) |
CONCAT(a, b, ...) |
Concaténer des chaînes | CONCAT(firstName, " ", lastName) |
CONTAINS(texte, recherche) |
Vérifier si le texte contient une sous-chaîne | CONTAINS(description, "legacy") |
PLUCK(tableau, cle) |
Extraire un champ de chaque élément | PLUCK(related_applications, "name") |
FILTER(tableau, cle, valeur) |
Filtrer les éléments par valeur de champ | FILTER(related_interfaces, "status", "ACTIVE") |
MAP_SCORE(valeur, correspondance) |
Associer des valeurs catégorielles à des scores | MAP_SCORE(criticality, {"high": 3, "medium": 2, "low": 1}) |
Exemples de formules¶
Coût annuel total des applications liées :
SUM(PLUCK(related_applications, "costTotalAnnual"))
Score de risque basé sur la criticité :
IF(riskLevel == "critical", 100, IF(riskLevel == "high", 75, IF(riskLevel == "medium", 50, 25)))
Nombre d'interfaces actives :
COUNT(FILTER(related_interfaces, "status", "ACTIVE"))
Placement TIME Model (Tolerate / Invest / Migrate / Eliminate) — le même exemple que vous verrez dans le panneau Formula Reference dans Admin → Métamodèle → Calculations lors de la création d'un nouveau calcul. Type cible = Application, champ cible = timeModel. Suppose que vous avez ajouté deux champs single_select nommés businessFit et technicalFit avec les options excellent, adequate, insufficient, unreasonable :
# ── TIME Model (Tolerate / Invest / Migrate / Eliminate) ──
# Assumes single_select fields: businessFit and technicalFit
# with options: excellent, adequate, insufficient, unreasonable.
#
# Scoring: Map each dimension to 1-4 numeric scale.
# Business Fit = Y-axis (how well does it serve the business?)
# Technical Fit = X-axis (how healthy is the technology?)
#
# Quadrant logic (threshold at score 2.5):
# Invest = high business + high technical
# Migrate = high business + low technical
# Tolerate = low business + high technical
# Eliminate = low business + low technical
#
bf = MAP_SCORE(data.businessFit, {"excellent": 4, "adequate": 3, "insufficient": 2, "unreasonable": 1})
tf = MAP_SCORE(data.technicalFit, {"excellent": 4, "adequate": 3, "insufficient": 2, "unreasonable": 1})
IF(bf is None or tf is None, None, IF(bf >= 2.5, IF(tf >= 2.5, "invest", "migrate"), IF(tf >= 2.5, "tolerate", "eliminate")))
C'est aussi l'exemple opérationnel référencé par le Guide du débutant EA.
Les commentaires sont pris en charge avec # :
# Calculer le score de risque pondéré
IF(businessCriticality == "missionCritical", riskScore * 2, riskScore)
Exécution des calculs¶
Les calculs s'exécutent automatiquement lorsqu'une fiche est sauvegardée. Vous pouvez également déclencher manuellement un calcul pour l'exécuter sur toutes les fiches du type cible :
- Trouvez le calcul dans la liste
- Cliquez sur le bouton Exécuter
- La formule est évaluée pour chaque fiche correspondante et les résultats sont sauvegardés
Ordre d'exécution¶
Lorsque plusieurs calculs ciblent le même type de fiche, ils s'exécutent dans l'ordre spécifié par leur valeur d'ordre d'exécution. C'est important lorsqu'un calcul dépend du résultat d'un autre -- définissez la dépendance pour qu'elle s'exécute en premier (numéro inférieur).