EN

Mijn notitiesPraktische Power BI tips

ALLSELECTED in DAX: je noemer volgt de selectie van je gebruiker

Kaart bij de notitie: ALLSELECTED in DAX: je noemer volgt de selectie van je gebruiker

Gisteren stond ALLEXCEPT centraal, de functie die één groepering vasthoudt terwijl de rest van je filters verdwijnt. Vandaag sluit de DAX filter-burst af met de functie die precies het omgekeerde bewaart: niet één kolom, maar alles wat je gebruiker in het rapport heeft aangeklikt.

ALLSELECTED is waar de meeste “mijn percentage klopt niet meer na een klik op de slicer”-vragen in de Fabric Community op uitkomen. De formule doet wat er staat, maar de naam wekt een verwachting die de motor niet waarmaakt.

Wat ALLSELECTED nodig heeft en teruggeeft

Beide argumenten van ALLSELECTED zijn optioneel: je mag hem leeg aanroepen, ALLSELECTED(), en dat geeft het volledige visual-totaal terug. Geef je wel kolommen mee, dan moeten die uit dezelfde tabel komen, net als bij de meeste functies van deze week.

Wat hij vervolgens doet is klein en precies. Microsoft omschrijft de returnwaarde als de context van de query zonder de rij- en kolomfilters die de visual zelf heeft gezet. In gewone woorden: het filter dat de visual op deze cel legt wordt weggeveegd, en alles wat van buiten die visual binnenkomt, zoals een slicerkeuze, blijft gewoon staan. De documentatie noemt dit doel expliciet: ALLSELECTED bestaat om visual totals te leveren, het totaal zoals de visual het toont, niet het totaal van je hele model.

Dezelfde measure zonder slicer

Neem een tabel Sales met Categorie op de rijen en deze measure:

Aandeel van totaal =
DIVIDE(
    SUM(Sales[Bedrag]),
    CALCULATE(SUM(Sales[Bedrag]), ALLSELECTED(Sales[Categorie]))
)

Zonder actieve selectie telt de teller voor Bakery 40.000 euro en komt de noemer op 100.000 euro uit, dus die rij toont 40% en de hele kolom telt op tot 100%. Zolang er niets is aangeklikt, doet ALLSELECTED hier hetzelfde als ALL: hij geeft het totaal van de hele tabel terug. Dat is ook precies waarom de volgende stap pas laat zien waar het verschil zit.

Met de slicer op Noord

Zet er een slicer op Sales[Regio] bij en klik Noord aan. De teller voor Bakery zakt naar 10.000 euro en de noemer zakt mee naar 25.000 euro, want het totaal draait nu om de selectie. Die rij komt dus opnieuw op 40% uit, en je kolom telt nog steeds op tot 100%.

Had er ALL(Sales) of REMOVEFILTERS(Sales) in de noemer gestaan, dan was ook het filter op Sales[Regio] gewist. De noemer was op 100.000 euro blijven hangen en diezelfde rij had 10% getoond, met een kolom die niet meer volloopt. Dat verschil is geen kwestie van smaak: in het documentatievoorbeeld van Microsoft, met twee rapportfilters actief, komt hetzelfde totaal met ALL op 80.450.596,98 uit en met ALLSELECTED() op 877.006,80. Een factor negentig verschil, in hetzelfde rapport, met dezelfde measure-basis.

Wanneer je hem pakt en waar hij lastig wordt

De vraag die je jezelf bij elke percentage-measure kunt stellen, is of je noemer mee moet bewegen met wat je gebruiker aanklikt. Is het antwoord ja, dan is ALLSELECTED de functie die je zoekt. Moet je totaal juist vast blijven staan, dan hoor je bij ALL(Sales) of REMOVEFILTERS(Sales) van dag 3.

Eén eerlijke grens hoort erbij. Zet ALLSELECTED rechtstreeks in een measure die in je rapport ligt, en zijn gedrag is voorspelbaar. Roep je hem aan binnen een berekening die zelf rij voor rij door een tabel loopt, of vanuit een measure met ALLSELECTED erin die zo’n berekening aanroept, dan wordt dat gedrag lastig te voorspellen. Bewaar hem voor de plek waarvoor hij is gemaakt.

De naam zelf is trouwens didactisch een beetje ongelukkig, als je het mij vraagt. “Selected” suggereert alles wat de gebruiker ooit heeft aangeklikt, maar de motor kijkt specifiek naar wat er buiten de huidige visual is gefilterd. Wie de naam letterlijk leest, bouwt de verkeerde verwachting en zoekt de fout daarna in zijn model in plaats van in zijn aannames.

Morgen: de spiekbrief van de hele reeks

Dat sluit de vijf dagen filtercontext af: CALCULATE die filtert, FILTER die een tabel teruggeeft, ALL en REMOVEFILTERS die wissen, ALLEXCEPT die één groepering vasthoudt en ALLSELECTED die de selectie van je gebruiker respecteert. Morgen komt de spiekbrief van deze week: alle vijf functies op één plaat, om naast je scherm te leggen.

Praktisch, helder en direct toepasbaar aan de slag met DAX? Op trainerbjorn.nl vind je trainingen en een gratis leerpad voor de PL-300 certificering.

Alle notities in ‘Praktische Power BI tips’ →