Ga naar hoofdinhoud

DXL Voorbeelden

Op deze pagina vind je praktische voorbeelden van DXL-expressies voor verschillende toepassingen.

Risicoanalyse: Kans × Impact

Een van de meest gebruikte toepassingen is risicoanalyse. Hierbij heb je typisch twee dimensies:

  • Kans - Hoe waarschijnlijk is het dat het risico optreedt?
  • Impact - Hoe groot is de schade als het optreedt?

Risico categoriseren

Match de dimensiewaarde met slugs (vergelijking op GUID):

match @dim:kans {
zeer_laag | laag => "Laag risico",
gemiddeld => "Gemiddeld risico",
hoog | zeer_hoog => "Hoog risico",
_ => "Onbekend"
}
Slugs

DXL gebruikt leesbare slugs die automatisch naar GUID's worden gecompileerd. Zowel @dim:kans als de match-patronen hoog, zeer_hoog etc. zijn slugs die naar entiteiten resolven.

Risicokleur bepalen

match @dim:kans {
hoog | zeer_hoog => "red",
gemiddeld => "orange",
_ => "green"
}

Combinatie van dimensies

Voor gecombineerde evaluatie kun je meerdere dimensies checken:

if @dim:impact == catastrofaal then "Kritiek"
else if @dim:impact == zeer_ernstig && @dim:kans == hoog then "Kritiek"
else if @dim:impact == ernstig || @dim:kans == hoog then "Hoog"
else "Normaal"

Voortgangsberekeningen

Percentage voltooide acties

// Simpele telling
@actions[status == "done"].count() / @actions.count() * 100

// Afgerond op hele procenten
(@actions[status == "done"].count() / @actions.count() * 100).round()

Voortgang op basis van budget

// Budget van voltooide acties / totaal budget
@actions[status == "done"].budget.sum() / @actions.budget.sum() * 100

Voortgang met nul-bescherming

// Voorkom deling door nul
let total = @actions.count();
if total == 0 then 0
else @actions[status == "done"].count() / total * 100

Budgetberekeningen

Totaal budget

@actions.budget.sum()

Budget per status

// Alleen voltooide acties
@actions[status == "done"].budget.sum()

// Nog openstaand budget
@actions[status != "done"].budget.sum()

Budgetoverschrijding

let gepland = @actions.budget.sum();
let besteed = @actions.actual_cost.sum();
besteed - gepland

Percentage besteed

let gepland = @actions.budget.sum() ?? 0;
let besteed = @actions.actual_cost.sum() ?? 0;
if gepland == 0 then 0 else (besteed / gepland * 100).round()

Datumberekeningen

Dagen tot deadline

due_date.days_until()

Is de deadline verstreken?

due_date < today

Dagen sinds start

start_date.days_since()

Projectduur in dagen

end_date.days_since(start_date)

Komende deadlines

// Acties met deadline binnen 7 dagen
@actions[due_date.days_until() <= 7 && due_date.days_until() >= 0]

Verlopen acties

@actions[due_date < today && status != "done"].count()

Statusberekeningen

Status-verdeling

// Aantal per status
let done = @actions[status == "done"].count();
let progress = @actions[status == "inprogress"].count();
let todo = @actions[status == "todo"].count();

done + " gereed, " + progress + " bezig, " + todo + " te doen"

Overall status bepalen

let total = @actions.count();
let done = @actions[status == "done"].count();
let blocked = @actions[status == "blocked"].count();

if total == done then "Afgerond"
else if blocked > 0 then "Geblokkeerd"
else if done > 0 then "In uitvoering"
else "Nog niet gestart"

Tekstmanipulatie

Naam van verantwoordelijke

owner?.name ?? "Niet toegewezen"

Statuslabel

match status {
"done" => "Afgerond",
"inprogress" => "Bezig",
"todo" => "Te doen",
"blocked" => "Geblokkeerd",
_ => status
}

Samenvatting genereren

let count = @actions.count();
let done = @actions[status == "done"].count();
count + " acties, waarvan " + done + " afgerond"

Geavanceerde berekeningen

Gewogen gemiddelde

// Gewogen score op basis van gewicht
let scores = @results.score;
let weights = @results.weight;
// Handmatig berekenen als product/som
@results.score.sum() / @results.count()

Mediaan berekenen

@actions.budget.median()

Minimum en maximum

// Vroegste deadline
@actions.due_date.min()

// Hoogste budget
@actions.budget.max()

// Budget range
@actions.budget.max() - @actions.budget.min()

Tijdspanne berekenen

// Dagen tussen eerste en laatste deadline
@actions.due_date.span()

Filters combineren

Meerdere condities (AND)

@actions[status == "todo" && due_date < today]

Of-condities (OR)

@actions[status == "done" || status == "cancelled"]

Geneste filters

// Acties van specifieke resultaten die niet af zijn
// Gebruik .flat() om de geneste arrays samen te voegen
@results[status != "done"].actions.flat()[status == "todo"]

Filteren op tekst

// Acties met "urgent" in de naam
@actions[name.contains("urgent")]

// Acties die beginnen met "Q1"
@actions[name.starts_with("Q1")]

Null-handling

Standaardwaarde bij null

budget ?? 0
score ?? "Niet beoordeeld"

Safe navigation

// Retourneert null als owner null is
owner?.name

// Retourneert "Onbekend" als owner of name null is
owner?.name ?? "Onbekend"

Conditionele null-check

if budget != null then budget else 0

Match expressions

Op waarde

match priority {
1 => "Urgent",
2 => "Hoog",
3 => "Normaal",
4 => "Laag",
_ => "Niet ingesteld"
}

Op range

match score {
0..50 => "Onvoldoende",
50..70 => "Voldoende",
70..90 => "Goed",
90..101 => "Uitstekend",
_ => "Onbekend"
}

Met guards

match status {
"done" if budget > 10000 => "Groot project afgerond",
"done" => "Project afgerond",
_ => "Nog niet afgerond"
}

Let bindings

Hergebruik van waarden

let total = @actions.budget.sum();
let done = @actions[status == "done"].budget.sum();
let pct = (done / total * 100).round();
pct + "% van budget besteed"

Complexe berekeningen opsplitsen

let actions = @actions;
let total = actions.count();
let done = actions[status == "done"].count();
let progress = actions[status == "inprogress"].count();

if total == 0 then "Geen acties"
else if done == total then "Alles afgerond"
else done + "/" + total + " (" + progress + " bezig)"