Skip to main content
Skip table of contents

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

CODE
/*
 * 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.

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 true op, anders false.

Indien je louter - gebruikt als gestelde waarde, dan retourneert de expressie altijd true.

Eender welk

<

Inputwaarde kleiner dan gestelde waarde, levert true op, anders false.

Number, date, time, date-time

<=

Inputwaarde kleiner dan of gelijk aan gestelde waarde, levert true op, anders false.

Number, date, time, date-time

>

Inputwaarde groter dan gestelde waarde, levert true op, anders false.

Number, date, time, date-time

>=

Inputwaarde groter dan of gelijk aan gestelde waarde, levert true op, anders false.

Number, date, time, date-time

[ x .. y ]

Inputwaarde in de range van gestelde waardes x en y (x en y inclusief), levert true op, anders false.

Number, date, time, date-time

] x .. y [

Inputwaarde in de range van gestelde waardes x en y (x en y exclusief), levert true op, anders false.

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 true retourneert, retourneert de volledige expressie naar true, anders false.

Eender welk

not()

NOT-operator die één van bovenstaande expressies kan inverteren, d.w.z. de expressie zal false retourneren waar je true verwacht, en vice versa.

Eender welk

Booleaanse expressie

Binnen een beslissingstabel inputkolom kan je gebruik maken van eender welke booleaanse expressie, d.w.z. een expressie die true of false retourneert.

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.

Boolean expressies

Expressies die naar true of false evalueren.

Functie of operator

Beschrijving

Voorbeeld

=

Gelijk aan

1 = 2 geeft false

!=

Niet gelijk aan

1 != 2 geeft true

= null

!= null

Null-check

1 = null geeft false

1 != null geeft true

<

Kleiner dan

1 < 2 geeft true

<=

Kleiner of gelijk aan

1 <= 2 geeft true

date("2020-01-01") <= date("2030-01-01") geeft true

>

Groter dan

1 > 2 geeft false

>=

Groter of gelijk aan

1 >= 2 geeft true

between [value] and [value]

Checkt of waarde zich tussen twee andere waardes bevindt

3 between 1 and 2 geeft false

time("12:00:00") between time("08:00:00") and time("12:00:01") geeft true

and

Dubbele conditie, beiden moeten true zijn opdat het geheel true zou retourneren.

1 < 2 and 1 > 2 geeft false

or

Van zodrag één conditie true geeft, zal het geheel ook true retourneren.

1 < 2 or 1 > 2 geeft true

instance of

Checkt of een waarde behoort tot een bepaald data type (boolean, date, string, number).

true instance of boolean geeft true

@"2020-01-01" instance of date geeft true

"Hello, World!" instance of string geeft true

“Hello, World!” instance of number geeft false

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

0 in [1,2,3] geeft false

“a” in [“a”,”b”,”c”] geeft true

String data type

Functie of operator

Beschrijving

Voorbeeld

string()

Conversie van getal, datum … naar een string.

string(5) retourneert "5"

+

Concatenatie van strings. Elke waarde moet van het type string zijn.

"Hello," + " " + "World" + "!" retourneert "Hello, World!"

"Bestelling" + " - " + string(50) retourneert "Bestelling - 50"

Numeric data type

Functie of operator

Beschrijving

Voorbeeld

number()

Conversie van string naar een getal. Indien niet mogelijk, zal de functie null retourneren.

number("5") retourneert 5

number("tekst") retourneert null

modulo(getal,modulus)

Retourneert de rest na deling van het getal door de modulus.

modulo(20,6) geeft 2

abs(getal)

Retourneert de absolute waarde van het getal.

abs(-5) geeft 5

floor(getal)

Rondt het getal af naar beneden en retourneert de dichtsbijzijnde integer.

floor(4.11) geeft 4
floor (-4.11) geeft -5

floor(getal,y)

Rondt het getal af naar beneden en retourneert het dichtsbijzijnde getal met y decimalen.

floor(4.11,1) geeft 4.1

floor(-4.11,1) geeft -4.2

ceiling(getal)

Rondt het getal af naar boven en retourneert de dichtsbijzijnde integer.

ceiling(4.11) geeft 5
ceiling(-4.11) geeft -4

ceiling(getal,y)

Rondt het getal af naar boven en retourneert het dichtsbijzijnde getal met y decimalen.

ceiling(4.11,1) geeft 4.2

ceiling(-4.11,1) geeft -4.1

+

Optellen

1 + 1 geeft 2

-

Aftrekken

1 - 1 geeft 0

*

Vermenigvuldigen

2 * 3 geeft 6

/

Delen

8 / 2 geeft 4

**

Exponentieel

2 ** 3 geeft 8

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 [1], de laatste waarde heeft positie [-1].

[0,1,2,3][1] geeft 0

[0,1,2,3][-1] geeft 3

[0,1,2,3][5] geeft null

[“a”,”b”,”c”][1] geeft “a”

Filter

Retourneert vanuit een lijst de items die voldoen aan de gestelde conditie. Je kan werken met de speciale variabele item.

[0,1,2,3][item<2] geeft [0]

[“a”,”b”,”c”][item!=”b”] geeft [“a”,c”]

some i in x satisfies y

Geeft true vanaf dat één item in de lijst aan de conditie voldoet.

some i in [0,1,2,3] satisfies i > 2 geeft true

every i in x satisfies y

Geeft trueindien alle items in de lijst aan de conditie voldoen.

every i in [0,1,2,3] satisfies i > 2 geeft false

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.

{"naam":"John","leeftijd":50}.leeftijd geeft 50

Filter

Retourneert vanuit een context de key-value pairs die voldoen aan de gestelde conditie.

[{"naam":"John","leeftijd":50},{"naam":"James","leeftijd":60}].["leeftijd" > 55] geeft {"naam":"James","leeftijd":60}

Projectie

Retourneert een lijst met specifieke waardes uit een lijst met verschillende contexten.

[{"naam":"John","leeftijd":50},{"naam":"James","leeftijd":60}].leeftijd geeft [50,60]

Temporal data type

Functie

Beschrijving

Voorbeeld

now()

Retourneert de huidige datum-tijd met de tijdzone inbegrepen

now() retourneert

"2025-08-08T07:41:55.663782293@Etc/UTC"

today()

Retourneert de huidige datum

today() retourneert

"2025-08-08"

day of week(date)

Retourneert de dag van de week als string

day of week (date("2024-12-19")) retourneert "Thursday"

day of year(date)

Retourneert de dag van het jaar als getal

day of year (date("2025-01-01")) retourneert 1

week of year(date)

Retourneert de week van het jaar als getal

week of year (date("2024-12-19")) retourneert 51

month of year(date)

Retourneert de maand van het jaar als string

month of year (date("2024-12-19")) retourneert “December"

abs(duration)

Retourneert absolute waarde van een tijdsduur (bijvoorbeeld mocht die negatief zijn).

abs(duration("-PT5H")) retourneert "PT5H"

years and months duration (date1, date2)

Berekent het tijdsinterval uitgedrukt in jaren en maanden tussen twee datums.

years and months duration(date("1975-08-09"),today()) geeft "P49Y11M"

+

Optelling, enkel specifieke combinaties werken, anders retourneert de expressie null

Voorbeelden:

date + duration geeft date
time + days-time-duration geeft time
date-time + duration geeft date-time

date("2024-12-19") + duration("P1D") retourneert "2024-12-20"

-

Aftrekken, enkel specifieke combinaties werken, anders retourneert de expressie null

Voorbeelden:

date - date geeft days-time-duration
date - duration geeft date

date("2024-12-19") - duration("P1D") retourneert "2024-12-18"

*

Vermenigvuldigen, enkel specifieke combinaties werken, anders retourneert de expressie null

Voorbeelden:

days-time-duration * number geeft days-time-duration

years-months-duration * number geeft years-months-duration

duration("P1D") * 2 retourneert "P2D"

/

Delen, enkel specifieke combinaties werken, anders retourneert de expressie null

Voorbeeld:

days-time-duration / number geeft days-time duration

years-months-duration / number geeft years-months-duration

duration("P2D") / 2 retourneert "P1D"

Get properties

Specifieke eigenschap van een date, time of date-time ophalen. Retourneert een getal.

.year
.month
.weekday
.hour

Specifieke eigenschappen van een duration (tijdsduur). Retourneert een getal.

.months
.days
.minutes

today().year retourneert 2025

today().month retourneert 1

duration("P5D10H50M10S").days retourneert 5

duration("P5D10H50M10S").minutes retourneert 50

Logical statements

If conditions

if x then y else z

Voorbeelden

  • if "Piet" in ["Jan","Paul","Mieke"] then true else false geeft false

  • if 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

CODE
{
  “x”:15
}

Datum vandaag is

Uitkomst

2025-DOSSIER-15

Uitleg

  • today().year geeft het huidige jaar terug

  • string() converteert naar string

  • met + 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

CODE
{
  "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 true of false

  • De 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 tweede 2, 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

CODE
{
  "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

CODE
{
  "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

CODE
{
  "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

CODE
{
  "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

CODE
{
  "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

CODE
{
  "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 = 24

  • Werk de buitenste haakjes af: 5 - 24 = -19

  • Deel 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

CODE
{
  "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

CODE
{
  "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

CODE
{
  "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

CODE
{
  "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

CODE
{
  "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

CODE
{
  "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.

JavaScript errors detected

Please note, these errors can depend on your browser setup.

If this problem persists, please contact our support.