Context transition
Wat is context transition?
Context transition is wat er gebeurt wanneer CALCULATE de huidige rijcontext omzet in een gelijkwaardige filtercontext. In gewone woorden: DAX neemt de rij waar hij op staat, zegt 'filter het model tot precies deze rij', en draait dan de berekening binnen dat filter.
Het is de reden dat een measure zich anders gedraagt van zodra je hem binnen een iterator plaatst, en het is een van de stukken DAX waar een helder beeld in je hoofd het meest loont. Het bouwt rechtstreeks verder op de twee soorten context, filtercontext en rijcontext, dus het helpt om die eerst onder de knie te hebben.
Hoe CALCULATE het in gang zet
CALCULATE heeft een gedocumenteerd neveneffect: voor het de filters toepast die je meegeeft, zet het elke rijcontext om in filtercontext. De referentie van Microsoft zegt het net zo droog, dat CALCULATE zonder filters de rijcontext omzet naar filtercontext.
Hier is het klassieke geval. In een berekende kolom op een Customer-tabel heb je rijcontext, een klant per rij, maar geen filtercontext. Een kale som zou de omzet van elke klant teruggeven, herhaald op elke rij. Wikkel het in CALCULATE en de huidige klantenrij wordt een filter.
Omzet klant =
CALCULATE ( SUM ( Sales[Bedrag] ) )Nu geeft elke rij de omzet van die ene klant terug in plaats van het eindtotaal. CALCULATE las de huidige rij, zette die om in een filter op de klant, en de som respecteerde dat.
Waarom een measure binnen een iterator anders rekent
Rond elke measure zit een onzichtbare CALCULATE. Op het moment dat je een measure gebruikt binnen een iterator zoals SUMX, gebeurt context transition dus automatisch op elke rij van de lus.
Totaal = SUMX ( Customers, [Omzet klant] )Voor elke klantenrij zet de ingebouwde CALCULATE van de measure die rij om in een filter, zodat [Omzet klant] het totaal van die ene klant teruggeeft, en SUMX telt die totalen op. Schrijf hetzelfde idee met een gewone kolom-expressie zonder measure, en je krijgt vaak een ander antwoord, want dan zet niets de transition in gang en ziet de binnenste som de hele tabel.
Die automatische transition is handig en makkelijk om over te struikelen tegelijk. Handig, omdat een goed geschreven measure gewoon werkt wanneer je hem hergebruikt binnen een andere berekening. Struikelen doe je wanneer je niet doorhebt dat er een transition gebeurt en je niet kan uitleggen waarom het getal veranderde.
Context transition en berekeningsgroepen
Een berekeningsgroep past een expressie toe over veel measures heen, en die expressies lopen door CALCULATE. Dat betekent dat context transition deel is van de manier waarop een berekeningsgroep elke measure die ze raakt hervormt. Bouw je time intelligence- of muntvarianten als een berekeningsgroep, dan gelden dezelfde regels over rijen die in filters veranderen. Nog een reden om het concept echt te bezitten in plaats van geval per geval van buiten te leren.
Waar moet je op letten bij het gebruik van context transition?
Het kan duur zijn. Een transition op elke rij van een grote tabel, bijvoorbeeld een measure binnen een iterator over miljoenen rijen, doet elke keer echt werk. Voelt een measure traag aan, kijk dan na of hij rij per rij context omzet en itereer over een kleinere tabel waar het kan.
Niet-unieke rijen filteren breder dan je denkt. Context transition filtert naar elke rij die over al zijn kolommen met de huidige overeenkomt. Heeft de tabel waarover je itereert duplicaten op de kolommen die tellen, dan neemt de transition ze allemaal mee in plaats van de ene rij die je in gedachten had. Geef de tabel een unieke sleutel.
Measures in berekende kolommen. Een measure gebruiken in een berekende kolom zet de huidige rij automatisch om in een filter. Soms is dat net wat je wil, soms een verrassing, dus doe het bewust.