Beslissing expressie syntax (FEEL)
Vooraf
Deze pagina is een korte referentie voor FEEL (Friendly Enough Expression Language) in onze beslissingstabellen.
Voor wie: analisten en ontwikkelaars die business rules modelleren in DMN.
Hoe te gebruiken: unary tests gebruik je in inputcellen om te matchen op waarden (bv. < 5, [1..10], not(…)). Expressies gebruik je om een waarde te berekenen (bv. 1+2, contains(x,"a"), if … then … else …).
Testen: probeer voorbeelden uit in de FEEL playground (links staan verder op de pagina).
Editor-tip: in de beslissingstabel kan je via het potlood-icoon per cel geholpen invoer gebruiken om unary tests samen te stellen.
Algemeen
Comments
Binnen je expressie kan je gebruik maken van een comment regel of comment block.
// dit is een comment regel
/*
* dit is een comment block
* deze bevat meerdere regels
*/
Haakjes
Om structuur aan te brengen in complexe expressies kan je gebruik maken van parentheses of haakjes.
if (x < 10) then true else false retouneert true wanneer x bijvoorbeeld 5 is.
2 - 1 * 2 - 1 retourneert -1
(2 - 1) * (2 - 1) retourneert 1
Unary tests voor business regels
Deze tests pas je toe in de business rule cellen. Ze evalueren steeds naar true of false. Evaluatie gebeurt door de inputwaarde te vergelijken met een gestelde waarde. Indien alle tests in een business rule naar true evalueren, dan matcht de regel.
Meer uitgebreide info over binnen FEEL ondersteunde unary tests vind je terug via de Camunda documentatie site.
Maak gebruik van de FEEL playground om unary test uit te proberen.
Voor het opbouwen van deze tests is user interface ondersteuning voorzien (klik op het potlood icoon naast de cel waar je de expressie wil opbouwen).
Inputwaarde en gestelde waarde moeten van hetzelfde data type zijn. Indien dit niet het geval is, krijg je een error terug.
Functie of operator | Beschrijving | Data types + voorbeeld |
|---|---|---|
Geen | Inputwaarde exact gelijk aan gestelde waarde, levert Indien je louter | Eender welk |
< | Inputwaarde kleiner dan gestelde waarde, levert | Number, date, time, date-time |
<= | Inputwaarde kleiner dan of gelijk aan gestelde waarde, levert | Number, date, time, date-time |
> | Inputwaarde groter dan gestelde waarde, levert | Number, date, time, date-time |
>= | Inputwaarde groter dan of gelijk aan gestelde waarde, levert | Number, date, time, date-time |
[ x .. y ] | Inputwaarde in de range van gestelde waardes x en y (x en y inclusief), levert | Number, date, time, date-time |
] x .. y [ | Inputwaarde in de range van gestelde waardes x en y (x en y exclusief), levert | Number, date, time, date-time |
, | OR-operator die toelaat om twee of meerdere van bovenstaande expressies met elkaar te combineren. Van zodra één lid van de expressie | Eender welk |
not() | NOT-operator die één van bovenstaande expressies kan inverteren, d.w.z. de expressie zal | Eender welk |
Booleaanse expressie | Binnen een beslissingstabel inputkolom kan je gebruik maken van eender welke booleaanse expressie, d.w.z. een expressie die | Eender welk |
Expressies, methods, functies & operatoren
Deze expressies pas je toe om een specifieke waarde uit te rekenen. Onderstaande lijst biedt een beknopt overzicht van de mogelijkheden binnen FEEL-expressies.
Meer uitgebreide info over binnen FEEL ondersteunde expressions, methods, functions & operators vind je terug via de Camunda documentatiesite.
Maak gebruik van de FEEL playground om expressies uit te proberen.
Boolean expressies
Expressies die naar true of false evalueren.
Functie of operator | Beschrijving | Voorbeeld |
|---|---|---|
= | Gelijk aan |
|
!= | Niet gelijk aan |
|
| Null-check |
|
< | Kleiner dan |
|
<= | Kleiner of gelijk aan |
|
> | Groter dan |
|
>= | Groter of gelijk aan |
|
between [value] and [value] | Checkt of waarde zich tussen twee andere waardes bevindt |
|
and | Dubbele conditie, beiden moeten |
|
or | Van zodrag één conditie |
|
instance of | Checkt of een waarde behoort tot een bepaald data type (boolean, date, string, number). |
|
in | Checkt of een waarde zich in een gepredefinieerde lijst van waardes bevindt Checkt of een waarde zich in een context (map of key-value pairs) bevindt |
|
String data type
Functie of operator | Beschrijving | Voorbeeld |
|---|---|---|
| Conversie van getal, datum … naar een string. |
|
+ | Concatenatie van strings. Elke waarde moet van het type string zijn. |
|
Numeric data type
Functie of operator | Beschrijving | Voorbeeld |
|---|---|---|
| Conversie van string naar een getal. Indien niet mogelijk, zal de functie |
|
| Retourneert de rest na deling van het |
|
| Retourneert de absolute waarde van het |
|
| Rondt het getal af naar beneden en retourneert de dichtsbijzijnde integer. |
|
| Rondt het getal af naar beneden en retourneert het dichtsbijzijnde getal met y decimalen. |
|
| Rondt het getal af naar boven en retourneert de dichtsbijzijnde integer. |
|
| Rondt het getal af naar boven en retourneert het dichtsbijzijnde getal met y decimalen. |
|
+ | Optellen |
|
- | Aftrekken |
|
* | Vermenigvuldigen |
|
/ | Delen |
|
** | Exponentieel |
|
List data type
Het is mogelijk om een lijst door te geven als input waarde voor de beslissing.
Wat binnen FEEL aangeduid wordt als een List, wordt binnen andere programmeer- of expressietalen aangeduid met Array, enzovoort. Het is een oplijsting van waardes.
Functie of operator | Beschrijving | Voorbeeld |
|---|---|---|
Select | Retourneert specifieke waarde uit de lijst op basis van positie. De eerste waarde heeft positie |
|
Filter | Retourneert vanuit een lijst de items die voldoen aan de gestelde conditie. Je kan werken met de speciale variabele |
|
| Geeft |
|
| Geeft |
|
Context data type
Het is mogelijk om een map door te geven als input waarde voor de beslissing.
Wat binnen FEEL aangeduid wordt als een Context, wordt binnen andere programmeer- of expressietalen aangeduid met Map, Dictionary, enzovoort. Het is een opsomming van key-value pairs.
Functie of operator | Beschrijving | Voorbeeld |
|---|---|---|
Select | Retourneert specifieke waarde uit de context op basis van key. |
|
Filter | Retourneert vanuit een context de key-value pairs die voldoen aan de gestelde conditie. |
|
Projectie | Retourneert een lijst met specifieke waardes uit een lijst met verschillende contexten. |
|
Temporal data type
Functie | Beschrijving | Voorbeeld |
|---|---|---|
| Retourneert de huidige datum-tijd met de tijdzone inbegrepen |
|
| Retourneert de huidige datum |
|
| Retourneert de dag van de week als string |
|
| Retourneert de dag van het jaar als getal |
|
| Retourneert de week van het jaar als getal |
|
| Retourneert de maand van het jaar als string |
|
| Retourneert absolute waarde van een tijdsduur (bijvoorbeeld mocht die negatief zijn). |
|
| Berekent het tijdsinterval uitgedrukt in jaren en maanden tussen twee datums. |
|
+ | Optelling, enkel specifieke combinaties werken, anders retourneert de expressie Voorbeelden:
|
|
- | Aftrekken, enkel specifieke combinaties werken, anders retourneert de expressie Voorbeelden:
|
|
* | Vermenigvuldigen, enkel specifieke combinaties werken, anders retourneert de expressie Voorbeelden:
|
|
/ | Delen, enkel specifieke combinaties werken, anders retourneert de expressie Voorbeeld:
|
|
Get properties | Specifieke eigenschap van een date, time of date-time ophalen. Retourneert een getal.
Specifieke eigenschappen van een duration (tijdsduur). Retourneert een getal.
|
|
Logical statements
If conditions
if x then y else z
Voorbeelden
if "Piet" in ["Jan","Paul","Mieke"] then true else falsegeeftfalseif prijs > 500 then "duur" else "goedkoop"geeft"duur"wanneer pijs 600 is en"goedkoop"wanneer prijs is 400.
For loops
for a in b return c
Voorbeeld
for x in [100,101,102,103] return "Order: " + string(x) geeft ["Order: 100", "Order: 101", "Order: 102", "Order: 103"]
Extra voorbeelden FEEL-expressies
Voorbeeld 1: exponent
Opgave
2**3
Variabelen
geen
Uitkomst
8
Uitleg
** staat voor exponent (machten uitrekenen)
Voorbeeld 2: string concatenatie
Opgave
string(today().year)+”-”+”DOSSIER”+”-”+string(x)
Variabelen
{
“x”:15
}
Datum vandaag is
Uitkomst
2025-DOSSIER-15
Uitleg
today().yeargeeft het huidige jaar terugstring()converteert naar stringmet
+concateneer je strings
Voorbeeld 3: boolean expressie
Opgave
1<2 or 1>2
Variabelen
geen
Uitkomst
true
Uitleg
Boolean expressie die true evalueert van zodra één van beide condities true is.
Voorbeeld 4: contains
Opgave
contains(input, "kampioen")
Variabelen
{
"input": "Remco Evenepoel is een Belgische wielrenner, geboren in Aalst in 2000, die bekendstaat om zijn uitzonderlijke prestaties in zowel tijdritten als wegwedstrijden. Hij won onder meer de Vuelta a España (2022), werd wereldkampioen op de weg (2022), en veroverde twee olympische titels in Parijs (2024), waarmee hij geschiedenis schreef als eerste renner met nationale, Europese, wereld- én olympische titels in het tijdrijden."
}
Uitkomst
true
Uitleg
contains(tekst, zoekterm) controleert of de opgegeven substring in de tekst voorkomt en retourneert
trueoffalseDe check is hoofdlettergevoelig (case-sensitive), afhankelijk van de FEEL-implementatie.
Voorbeeld 5: item selecteren uit lijst
Opgave
[“Jean”,”Pol”,”Olivier”,”Marc”,”Roland”,”Sylvère”,”Jan”][3]
Variabelen
geen
Uitkomst
"Olivier"
Uitleg
Indexering in FEEL is 1-based: het eerste element heeft index
1, het tweede2, enz.De expressie retourneert het 3e element uit de lijst:
"Olivier"
Voorbeeld 6: item selecteren uit een gefilterde lijst
Opgave
[1,2,3,4,5,6,7,8,9,10][item>5][-1]
Variabelen
geen
Uitkomst
10
Uitleg
Eerst filter je de lijst op waarden groter dan 5: [6,7,8,9,10]. Daarna neem je het laatste element met index [-1]: 10
Voorbeeld 7: lijst transformeren
Opgave
for i in x return i**2
Variabelen
{
"x":[1,2,3,4,5,6,7]
}
Uitkomst
[1,4,9,16,25,36,49]
Uitleg
De for-lus doorloopt elk element van de lijst x: voor elk element i wordt het kwadraat berekend met de exponent-operator **. Er wordt geen indexering gebruikt; de expressie werkt direct op de waarden. Het resultaat is een nieuwe lijst met dezelfde lengte en in dezelfde volgorde als de input: [1,4,9,16,25,36,49]
Voorbeeld 8: modulus
Opgave
modulo(x,y)
Variabelen
{
"x":49,
"y":7
}
Uitkomst
0
Uitleg
De functie modulo geeft de rest na deling: 49 ÷ 7 = 7, zonder rest. Daarom is de rest 0.
Voorbeeld 9: check alle items in een lijst
Opgave
every i in x satisfies contains(i,"a")
Variabelen
{
"x":["Marc","Aaron","Maarten","Gerard","Wannes"]
}
Uitkomst
true
Uitleg
De expressie controleert of elk item in lijst x de letter a bevat. Alle namen (Marc, Aaron, Maarten, Gerard, Wannes ) bevatten minstens één a; daarom geeft every ... satisfies true
Voorbeeld 10: leeftijd berekenen
Opgave
years and months duration (date(geboortedag),date(huidigedag)).years
Variabelen
{
"geboortedag":"1975-08-09",
"huidigedag":"2025-08-08"
}
Uitkomst
49
Uitleg
De functie years and months duration(date(geboortedag), date(huidigedag)) berekent het verschil tussen twee datums als een duur in jaren en maanden. Met .years haal je het aantal volledige jaren op. Omdat 8 augustus 2025 vóór de verjaardag op 9 augustus valt, telt 2025 nog niet mee en kom je uit op 49 volledige jaren.
Voorbeeld 11: aantal dagen tussen twee data berekenen
Opgave
(date("2025-08-15") - date("2025-08-08")).days
Variabelen
geen
Uitkomst
7
Uitleg
Het verschil tussen twee dates (date - date) levert een tijdsduur (days-time-duration) op. Met .days haal je het aantal dagen uit die duur. Tussen 2025-08-08 en 2025-08-15 zit een duur van 7 dagen, dus de uitkomst is 7.
Voorbeeld 12: lijst filteren
Opgave
[{"naam":"Jan","leeftijd":30},{"naam":"Piet","leeftijd":40}][leeftijd > 35]
Variabelen
geen
Uitkomst
[{"naam":"Piet","leeftijd":40}]
Uitleg
De expressie filtert een lijst van contexten op basis van een conditie over het veld leeftijd. Alleen items waarvoor de conditie waar is, blijven over. Hier voldoet enkel Piet (40 > 35), dus de gefilterde lijst bevat enkel {"naam":"Piet","leeftijd":40}. Als geen enkel item voldoet, krijg je een lege lijst terug [].
Voorbeeld 13: item selecteren uit een gefilterde lijst
Opgave
[{"naam":"Jan","leeftijd":30},{"naam":"Piet","leeftijd":40}][leeftijd > 35][1]
Variabelen
geen
Uitkomst
{"naam":"Piet","leeftijd":40}
Uitleg
Eerst filter je op leeftijd > 35. Dat levert de lijst met enkel Piet op: [{"naam":"Piet","leeftijd":40}]. Daarna selecteer je met index [1] het eerste element (FEEL gebruikt 1-based indexering): {"naam":"Piet","leeftijd":40}. Als de gefilterde lijst leeg is, dan retourneert [1] null
Voorbeeld 14: check of er minstens één item voldoet
Opgave
some i in x satisfies i>5
Variabelen
{
"x":[0,1,2,3,4,5]
}
Uitkomst
false
Uitleg
De expressie some i in x satisfies i > 5 geeft true zodra er minstens één element in lijst x groter is dan 5. In x = [0,1,2,3,4,5] is het grootste element 5, dus er is geen enkel element dat strikt groter is dan 5. Daarom is de uitkomst false
Voorbeeld 15: projectie van veld uit lijst van contexten
Opgave
x.leeftijd
Variabelen
{
"x":[{"naam":"Jan","leeftijd":25},{"naam":"Pieter","leeftijd":30},{"naam":"Andy","leeftijd":45}]
}
Uitkomst
[25,30,45]
Uitleg
Dit is een projectie: de expressie .leeftijd wordt op elk item in de lijst x toegepast en geeft een nieuwe lijst terug met de waarden van het veld leeftijd in dezelfde volgorde. Dit is gelijkwaardig aan het mappen over de lijst en verschilt van een selectie van één item (bij selectie krijg je één element, bij projectie een lijst).
Voorbeeld 16: weeknummer bepalen (week of year)
Opgave
week of year (date ("2025-01-01"))
Variabelen
geen
Uitkomst
1
Uitleg
De functie week of year(date) geeft het weeknummer terug volgens de FEEL-implementatie (ISO-weeknummering). Omdat 1 januari 2025 in week 1 valt, is het resultaat 1
Voorbeeld 17
Voorbeeld 17: durations optellen
Opgave
duration ("P2D") + duration ("P5D")
Variabelen
geen
Uitkomst
"P7D"
Uitleg
In FEEL levert het optellen van twee durations opnieuw een duration op. duration("P2D") staat voor 2 dagen en duration("P5D") voor 5 dagen; samen geeft dat 7 dagen, uitgedrukt als P7D
Voorbeeld 18: rekenen met haakjes (operator precedence)
Opgave
(5-1)*(24/6)
Variabelen
geen
Uitkomst
16
Uitleg
- Eerst worden de haakjes geëvalueerd: (5-1) = 4 en (24/6) = 4.
- Daarna worden de resultaten vermenigvuldigd: 4 * 4 = 16.
- Haakjes bepalen de volgorde van evaluatie en krijgen voorrang op * en /.
Voorbeeld 20: datum min duur (date - duration)
Opgave
floor((5-(1*24))/6)
Variabelen
geen
Uitkomst
-4
Uitleg
Bereken eerst het product binnen de binnenste haakjes:
1*24 = 24Werk de buitenste haakjes af:
5 - 24 = -19Deel door 6:
-19 / 6 = -3.166...Pas floor toe (afronden naar beneden, d.w.z. naar de meest negatieve gehele waarde):
floor(-3.166...) = -4
Voorbeeld 20: rekenen met datum
Opgave
date ("2020-01-01") - duration ("P1D")
Variabelen
geen
Uitkomst
"2019-12-31"
Uitleg
In FEEL geeft date - duration een nieuwe datum terug. Eén dag aftrekken van 2020-01-01 resulteert in 2019-12-31.
Voorbeeld 21: vermenigvuldigen
Opgave
x*2
Variabelen
{
"x":5
}
Uitkomst
10
Uitleg
De variabele x krijgt eerst de waarde 5 uit de context. Daarna wordt vermenigvuldigd met 2: 5 * 2 = 10. FEEL gebruikt hier de standaard vermenigvuldigingsoperator * en gewone numerieke substitutie van variabelen.
Voorbeeld 21: rekenen met haakjes (operator precedence)
Opgave
(x-5)*2+5
Variabelen
{
"x":5
}
Uitkomst
5
Uitleg
Werk eerst de haakjes uit: (x-5) = (5-5) = 0.
Vermenigvuldig vervolgens: 0 * 2 = 0.
Tel daarna op: 0 + 5 = 5. Haakjes worden eerst geëvalueerd, daarna vermenigvuldiging, dan optelling.
Voorbeeld 23: item selecteren uit lijst van contexten (filter + index)
Opgave
x.type[item="golf"][1]
Variabelen
{
"x": [
{"merk":"volkswagen","type":"golf"},
{"merk":"opel","type":"astra"},
{"merk":"audi","type":"a4"},
{"merk":"skoda","type":"octavia"}
]
}
Uitkomst
"golf"
Uitleg
Eerst projecteert x.type de lijst contexten naar enkel het veld type per item: ["golf","astra","a4","octavia"]. Daarna filter je met [item="golf"] zodat alleen waarden gelijk aan "golf" overblijven: ["golf"]. Met index [1] (1-based indexering in FEEL) neem je het eerste element: "golf"
Voorbeeld 24: years and months duration
Opgave
abs(years and months duration (date(x),date(y)))
Variabelen
{
"x":"2025-06-01",
"y":"1975-01-01"
}
Uitkomst
"P50Y5M"
Uitleg
De functie years and months duration(date(x), date(y)) berekent het verschil in volledige jaren en resterende maanden tussen twee datums. Tussen 1975-01-01 en 2025-06-01 zitten 50 jaren en 5 maanden, wat als duration wordt weergegeven. Met abs(...) neem je de absolute waarde (altijd positief). Daarom is de uitkomst "P50Y5M".
Voorbeeld 25: concatenatie van strings
Opgave
x + " " + y
Variabelen
{
"x":"Jan",
"y":"Peeters"
}
Uitkomst
"Jan Peeters"
Uitleg
De operator "+" concateneert strings: hij plakt ze aan elkaar. De string “ " is één spatie. Met x = Jan en y = Peeters wordt x + " " + y geëvalueerd tot "Jan Peeters"
Voorbeeld 26: string check
Opgave
x instance of string
Variabelen
{
"x":"5",
"y":"1"
}
Uitkomst
true
Uitleg
De operator instance of controleert het datatype van een waarde en retourneert een boolean. Met x = "5" is x instance of string true.