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)"