Context transitie in Power BI

Net terwijl je DAX denkt te gaan begrijpen, is het weer zover! Je hebt een prachtig – en uiteraard foutloos – stukje DAX proza weten te produceren, maar… het doet niet wat je zou willen. Het lijkt wel willekeur te zijn wat de uitkomst is.

Het doel van deze blog is niet om alle mogelijke problemen en verklaringen te geven. Wel om één mogelijk issue te kiezen en hier eens wat dieper op in te gaan. Context transitie leek me interessant. Laten we beginnen.

Context

Context transitie bestaat uit twee woorden: context en transitie. Laten we beginnen bij de eerste.

Power BI kent twee soorten context, namelijk ‘row context’ en ‘filter context’. Zoals een wijs DAX man mij eens vertelde:

“…The row context iterates, but it does not filter…”

“…The filter context filters, but it does not iterate…”

Laten we eens kijken naar een voorbeeld van filter context:

In bovenstaande afbeelding zien we dat de rood omlijnde waarde wordt berekend. Maar in welke filter context is deze berekening uitgevoerd? Wat zien we nu in de rood omlijnde ‘cel’ staan? Vanuit de rij wordt gefilterd op blauwe producten. Vanuit de kolom op het jaar 2013. Daarnaast is er een slicer die filtert op de maat 60. Tot slot wordt ook vanuit de barchart een filter meegegeven op de modelnaam Touring-1000. Deze vier dingen vormen hier samen de filter context.

Voor nu is dat voldoende. Laten we eens een voorbeeld van row context bekijken.

Ik maak een nieuwe kolom aan om de omzet te berekenen, als volgt:

We zien dat we netjes het resultaat krijgen dat we verwachten. Maar hoe weet bovenstaande formule in welke rij hij moet kijken om de berekening uit te kunnen voeren?

Het antwoord is: door de row context. De formule voert deze berekening telkens uit in de huidige row context, tegen de huidige filter context. Omdat we de DAX code in een kolom hebben geschreven, hebben we automatisch een row context. Nogmaals:

“…The row context iterates, but it does not filter…”

Doordat de row context iteratie met zich meebrengt, wordt de berekening rij voor rij – telkens in de op dat moment huidige row context – uitgevoerd. Daarom is het resultaat dat er voor elke rij een juiste SalesAmt wordt teruggegeven.

Context transitie

Context transitie wil zeggen dat de row context wordt vervangen door een vergelijkbare filter context.

***“Oke, en waarom is dat boeiend?”***

Laten we nog eens terug gaan naar ons voorbeeld en weer een nieuwe kolom aanmaken.

Hoe komt het dat we hier de som van elke regel zien, voor de kolom Sales Amount? Omdat SUM er voor zorgt dat voor elke rij de filter context ‘de hele kolom’ is. Dus in de eerste rij wordt de hele kolom bij elkaar opgeteld. Dan gaan we naar de tweede rij en doen we hetzelfde. Enzovoorts.

Laten we nu eens de wolf in schaapskleren er bij pakken: CALCULATE. Vaak lijkt het te doen wat we willen, maar is dat toeval, of begrijpen we echt wat CALCULATE doet? Misschien een treffend voorbeeld is het volgende:

Het lijkt hetzelfde wat we hier vragen, maar de uitkomst is toch heel anders. Hoe dan?

Context transitie!

Wat je geliefde CALCULATE nooit heeft verteld, is dat ze (het schijnt een vrouw te zijn) row context HAAT. Ze wil deze dan ook het liefst vernietigen. Maar voordat ze dat doet maakt ze een kopie van de row context en slaat die op in de filter context. # Context transitie.

Laten we er op inzoomen. CALCULATE ontdekt de row context, omdat we in een kolom werken (waar de row context standaard wordt ‘meegeleverd’). Ze vervangt deze door een identieke filter context en vernietigt vervolgens de row context. Dan wordt de berekening SUM([Sales Amount]) uitgevoerd… binnen de huidige filter context! Waar deze voorheen de hele kolom was, is er inmiddels iets veranderd: er is dankzij CALCULATE een filter context met een huidige rij geintroduceerd! Wanneer de berekening dus wordt uitgevoerd, worden alle zichtbare cellen binnen de huidige filter context, dus de rij, bij elkaar opgeteld.

Zo komt het dus, dat je soms met een op het oog zelfde berekening, een compleet andere uitkomst krijgt. Welke de juiste is? Dat mag jij zeggen. Ze zijn allebei goed, afhankelijk van wat je wilt berekenen.

Bonus

Zoals context transitie wordt afgedwongen door CALCULATE, wordt context transitie ook afgedwongen door een measure die in een row context wordt geplaatst. Kijk maar eens naar onderstaande vergelijking. Begrijp je inmiddels wat beter wat er écht gebeurt? Mooi! Dan weet je nu dat je ook niet willekeurig een measure wel of niet kunt aanroepen in een kolom😊

Measure:

Succes, en heb je vragen: floris.lemkes@inergy.nl

Geef een reactie

Gelieve met een van deze methodes in te loggen om je reactie te plaatsen:

WordPress.com logo

Je reageert onder je WordPress.com account. Log uit /  Bijwerken )

Google photo

Je reageert onder je Google account. Log uit /  Bijwerken )

Twitter-afbeelding

Je reageert onder je Twitter account. Log uit /  Bijwerken )

Facebook foto

Je reageert onder je Facebook account. Log uit /  Bijwerken )

Verbinden met %s