Créer une fonction dans DMN et l’utiliser dans une table de décision dans jBPM

 💡 Introduction

Dans jBPM, on utilise souvent des tables de décision DMN pour définir les règles métiers de manière visuelle.
Mais il arrive que certaines logiques (calculs, validations, transformations) soient répétées dans plusieurs décisions.

👉 Pour éviter la duplication, vous pouvez créer une 📦 fonction réutilisable dans votre modèle DMN et l’appeler depuis vos tables de décision, expressions ou contextes.

Cela rend vos modèles plus clairs, modulaires et faciles à maintenir.


🧠 1️⃣ Qu’est-ce qu’une fonction dans DMN ?

Dans DMN, une fonction est un morceau de logique réutilisable écrit en FEEL (Friendly Enough Expression Language).
Elle peut recevoir des paramètres d’entrée et renvoyer une valeur.

✅ Exemple simple de fonction FEEL :

function(x) x * 2

📊 Vous pouvez la définir :

  • Dans un contexte

  • Comme une décision distincte

  • Ou sous forme de Business Knowledge Model (BKM) pour la réutiliser globalement


⚙️ 2️⃣ Pourquoi utiliser des fonctions dans DMN

RaisonAvantage
🧾 RéutilisabilitéDéfinir la logique une seule fois et la réutiliser partout
⚙️ MaintenanceMise à jour plus facile d’une seule définition
🔍 LisibilitéDes tables de décision plus simples et plus propres
🚀 PerformanceLes fonctions FEEL sont légères et rapides

🧩 3️⃣ Exemple de scénario

Prenons un exemple : on veut calculer une prime de performance pour les employés selon leur salaire et leur note d’évaluation.

Nous allons créer :

  • Une fonction CalculateBonus

  • Une table de décision BonusDecision qui appelle cette fonction


🧱 4️⃣ Étape 1 : Créer une fonction dans le modèle DMN

Dans Business Central → Design → Create → DMN,
ajoutez une décision (ou un Business Knowledge Model) nommée CalculateBonus.

Dans la zone d’expression, saisissez :

function(salary, rating) if rating = "A" then salary * 0.2 else if rating = "B" then salary * 0.1 else salary * 0.05

Cette fonction prend deux paramètres (salary, rating) et retourne la prime calculée.


🧩 5️⃣ Étape 2 : Créer la table de décision qui appelle la fonction

Créez ensuite une autre décision appelée BonusDecision.

Données d’entrée :

  • salary

  • rating

Table de décision :

RatingRésultat (Bonus)Description
"A"CalculateBonus(salary, rating)"Excellent"
"B"CalculateBonus(salary, rating)"Bon"
"C"CalculateBonus(salary, rating)"Moyen"

✅ Exemple d’expression FEEL :

CalculateBonus(salary, rating)

Ainsi, la table appelle directement la fonction définie précédemment.


🧩 6️⃣ Étape 3 : Définir la fonction dans un Contexte (optionnel)

Vous pouvez aussi définir la fonction dans un contexte :

{ CalculateBonus: function(salary, rating) if rating = "A" then salary * 0.2 else if rating = "B" then salary * 0.1 else salary * 0.05, FinalResult: CalculateBonus(salary, rating) }

✅ Ici, la clé FinalResult appelle directement la fonction CalculateBonus.


💻 7️⃣ Étape 4 : Appeler le DMN depuis jBPM ou Java

Exemple d’exécution du modèle DMN depuis une application Java :

KieServices ks = KieServices.Factory.get(); KieContainer kContainer = ks.getKieClasspathContainer(); KieSession kSession = kContainer.newKieSession(); DMNRuntime dmnRuntime = KieRuntimeFactory.of(kSession).get(DMNRuntime.class); DMNModel model = dmnRuntime.getModel("http://example.com/dmn", "BonusModel"); DMNContext context = dmnRuntime.newContext(); context.set("salary", 80000); context.set("rating", "A"); DMNResult result = dmnRuntime.evaluateAll(model, context); System.out.println("🎯 Prime : " + result.getContext().get("BonusDecision"));

Sortie console :

🎯 Prime : 16000.0

🧠 8️⃣ Réutiliser la fonction dans plusieurs décisions

Une fois définie, la fonction peut être utilisée dans :

  • Des tables de décision

  • Des expressions FEEL

  • D’autres fonctions

  • Des contextes DMN

Exemple :

if CalculateBonus(salary, rating) > 10000 then "Haute prime" else "Basse prime"

🧰 9️⃣ Astuces et erreurs courantes

ProblèmeCauseSolution
Function not foundFonction non liée ou non importéeRelier la décision fonction à la table de décision
⚠️ Valeur nullVariables non mappéesVérifier la correspondance des variables d’entrée
🧮 Mauvais calculErreur de syntaxe FEELVérifier le modèle DMN XML

🧩 🔟 Exemple DMN simplifié

<dmn:decision id="CalculateBonus" name="CalculateBonus"> <dmn:variable name="CalculateBonus" typeRef="number"/> <dmn:literalExpression> <dmn:text> function(salary, rating) if rating = "A" then salary * 0.2 else if rating = "B" then salary * 0.1 else salary * 0.05 </dmn:text> </dmn:literalExpression> </dmn:decision> <dmn:decision id="BonusDecision" name="BonusDecision"> <dmn:informationRequirement> <dmn:requiredDecision href="#CalculateBonus"/> </dmn:informationRequirement> <dmn:decisionTable hitPolicy="FIRST"> <dmn:input> <dmn:inputExpression typeRef="string"><dmn:text>rating</dmn:text></dmn:inputExpression> </dmn:input> <dmn:output name="BonusDecision" typeRef="number"/> <dmn:rule> <dmn:inputEntry><dmn:text>"A"</dmn:text></dmn:inputEntry> <dmn:outputEntry><dmn:text>CalculateBonus(salary, rating)</dmn:text></dmn:outputEntry> </dmn:rule> </dmn:decisionTable> </dmn:decision>


👉 Regardez “Créer une fonction dans DMN et l’utiliser dans une table de décision dans jBPM” en action :

Voici une courte vidéo pour mieux comprendre l’intégration des fonctions DMN dans jBPM : 🎬 YouTube: Learn IT with Shikha


🏁 Conclusion

🚀 En créant des fonctions DMN, vous pouvez structurer vos modèles de décision de manière plus claire et réutilisable.
Elles permettent de séparer la logique des calculs du reste de la table, tout en rendant vos modèles plus professionnels et évolutifs.

💬 BPMN gère le flux du processus.
DMN gère les décisions.
Les fonctions DMN apportent la modularité et la réutilisabilité.


💼 Support professionnel disponible

Si vous rencontrez des problèmes sur des projets réels liés au développement backend d’entreprise ou à l’automatisation des workflows, je propose des services de conseil payants, de débogage en production, de support projet et de formations ciblées.

Les technologies couvertes incluent Java, Spring Boot, PL/SQL, Azure, ainsi que l’automatisation des workflows (jBPM, Camunda BPM, RHPAM).

📧 Contact: ishikhanirankari@gmail.com | info@realtechnologiesindia.com

🌐 Website: IT Trainings | Digital lectern | Digital rostrum | Digital metal podium   



Comments

Popular posts from this blog

jBPM Installation Guide: Step by Step Setup

Scopes of Signal in jBPM

OOPs Concepts in Java | English | Object Oriented Programming Explained