Support Formation DAX

Transition de contexte

Fichier Excel PBIX

Présentation

Transition_de_contexte_DAX

Schéma

La transition de contexte en DAX

L'idée en une phrase

  • La transition de contexte transforme un contexte de ligne (« je suis sur la ligne d'Alice ») en contexte de filtre (« ne garder que les données d'Alice »).
  • Elle est déclenchée par CALCULATE (ou CALCULATETABLE), et aussi, de façon invisible, à chaque fois qu'on appelle une mesure à l'intérieur d'un contexte de ligne.
  • Source (Microsoft Learn)

Rappel : les deux contextes

  • Contexte de ligne : DAX sait sur quelle ligne il se trouve (colonne calculée, fonctions itératives comme SUMX, FILTER, ADDCOLUMNS). Il permet de lire la valeur d'une colonne de la ligne courante, mais il ne filtre rien.
  • Contexte de filtre : l'ensemble des filtres appliqués au modèle (segments, lignes et colonnes d'un visuel, filtres de CALCULATE). C'est lui qui restreint les données prises en compte par SUM, COUNTROWS, etc.
  • Source (Microsoft Learn)

Le jeu de données d'exemple

Table Clients

Client
Alice
Bruno
Chloé

Table Ventes (relation un-à-plusieurs Clients[Client] vers Ventes[Client])

ClientMontant
Alice100
Alice50
Bruno200
Chloé30

Mesure de base :

Total Ventes = SUM ( Ventes[Montant] )

Démonstration avec trois colonnes calculées dans Clients

Col SUM        = SUM ( Ventes[Montant] )
Col CALCULATE  = CALCULATE ( SUM ( Ventes[Montant] ) )
Col Mesure     = [Total Ventes]
Clients.ClientCol SUMCol CALCULATECol Mesure
Alice380150150
Bruno380200200
Chloé3803030
  • Col SUM : le contexte de ligne existe (on est sur la ligne d'Alice), mais il ne filtre pas la table Ventes. Résultat : le total général, 380, sur chaque ligne.
  • Col CALCULATE : CALCULATE convertit la ligne courante en filtre Clients[Client] = "Alice", qui se propage à Ventes par la relation. Résultat : 150 pour Alice.
  • Col Mesure : même résultat que CALCULATE, car toute mesure est automatiquement enveloppée dans un CALCULATE implicite. C'est là que la transition de contexte devient « invisible ».

Le même mécanisme dans une mesure

Objectif : compter les clients ayant acheté plus de 100 €.

Clients > 100 (correct)   = COUNTROWS ( FILTER ( Clients, [Total Ventes] > 100 ) )
Clients > 100 (incorrect) = COUNTROWS ( FILTER ( Clients, SUM ( Ventes[Montant] ) > 100 ) )
  • Version correcte : pour chaque client parcouru par FILTER, la mesure déclenche la transition de contexte, donc 150, 200, 30 sont comparés à 100. Résultat : 2 (Alice et Bruno).
  • Version incorrecte : SUM sans CALCULATE renvoie 380 pour chaque client. Résultat : 3.
  • Seule différence entre les deux formules : une mesure à la place d'une expression. C'est exactement ce qui déroute.

Pourquoi cela paraît complexe

  • C'est invisible : la formule [Total Ventes] ne contient aucun CALCULATE visible, pourtant elle se comporte autrement que SUM ( Ventes[Montant] ) qui est pourtant son code exact.
  • Deux contextes coexistent et ont des rôles différents : on « est » sur une ligne sans pour autant « filtrer » sur cette ligne. Cette nuance n'existe pas dans Excel, où une formule de ligne ne voit que sa ligne.
  • Le résultat dépend de l'endroit où la formule est évaluée : la même mesure donne 380 dans une carte, 150 sur la ligne Alice d'un tableau, et sert de test ligne à ligne dans un FILTER.
  • Toutes les colonnes de la ligne deviennent des filtres, pas seulement la clé. Dans une table sans clé unique, cela produit des surprises (voir le piège ci-dessous).
  • La propagation passe par les relations : il faut en même temps comprendre le modèle (sens du filtre, cardinalité) pour prévoir le résultat.
  • Le coût en performance : dans un itérateur sur une grande table, la transition est exécutée à chaque ligne, ce qui peut ralentir fortement un rapport.
  • Source (SQLBI)

Piège classique : les lignes en double

  • Si Ventes contenait deux lignes strictement identiques (Bruno, 200), une colonne calculée = [Total Ventes] dans Ventes afficherait 400 sur chacune d'elles.
  • Raison : la transition crée le filtre Client = "Bruno" ET Montant = 200, qui laisse passer les deux lignes identiques.
  • Conseil : réserver la transition de contexte aux tables qui possèdent une clé unique (tables de dimension comme Clients, Produits, Dates).
  • Source (SQLBI)

Formulation à retenir

  • « Un contexte de ligne ne filtre pas. CALCULATE le transforme en filtre. Une mesure contient toujours un CALCULATE caché. »
  • Réflexe de vérification : dans un itérateur ou une colonne calculée, se demander « est-ce que j'appelle une mesure ou une expression nue ? ».