Transition de contexte
Fichier Excel PBIX
Présentation
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(ouCALCULATETABLE), 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 parSUM,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])
| Client | Montant |
| Alice | 100 |
| Alice | 50 |
| Bruno | 200 |
| 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.Client | Col SUM | Col CALCULATE | Col Mesure |
| Alice | 380 | 150 | 150 |
| Bruno | 380 | 200 | 200 |
| Chloé | 380 | 30 | 30 |
- 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 :
CALCULATEconvertit la ligne courante en filtreClients[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 unCALCULATEimplicite. 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 :
SUMsansCALCULATErenvoie 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 aucunCALCULATEvisible, pourtant elle se comporte autrement queSUM ( 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"ETMontant = 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.
CALCULATEle transforme en filtre. Une mesure contient toujours unCALCULATEcaché. » - 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 ? ».







