Deux contextes, deux rôles
DAX évalue chaque expression dans un contexte. Il en existe deux sortes, et la plupart des surprises viennent de leur confusion.
| Contexte de ligne | Contexte de filtre | |
|---|---|---|
| Où ? | colonnes calculées, itérateurs (SUMX, FILTER…) | cellules de visuel, segments, CALCULATE |
| Effet | « je suis sur cette ligne » : on peut lire ses colonnes | « seules ces lignes sont visibles » |
| Se propage par les relations ? | non (il faut RELATED) | oui, du côté un vers le côté plusieurs |
L’expérience qui éclaire tout
Ajoutez dans DimMagasin (2 lignes) deux colonnes calculées :
CA sans CALCULATE = SUM ( FaitVentes[Montant] )
CA avec CALCULATE = CALCULATE ( SUM ( FaitVentes[Montant] ) )
- La première affiche 3 925 sur les deux lignes. Le contexte de ligne sait que l’on est sur Lyon, mais il ne filtre pas FaitVentes : SUM voit toute la table.
- La seconde affiche 2 185 pour Lyon et 1 740 pour Lille. CALCULATE a pris la ligne courante (CodeMagasin = M1, Magasin = Lyon) et l’a transformée en filtre, qui se propage ensuite à FaitVentes par la relation.
C’est la transition de contexte : CALCULATE (et CALCULATETABLE) convertit tout le contexte de ligne actif en contexte de filtre (un filtre sur chaque colonne de la ligne).
La mesure cache un CALCULATE
Écrivez une troisième colonne :
CA via mesure = [Total ventes]
Résultat : 2 185 et 1 740. Toute référence à une mesure est implicitement entourée d’un CALCULATE : [Total ventes] équivaut à CALCULATE ( SUM ( FaitVentes[Montant] ) ). C’est pourquoi vos itérateurs sur des dimensions fonctionnaient dans le cours précédent :
Meilleur mois = MAXX ( VALUES ( Dates[Année-Mois] ), [Total ventes] )
Pour chaque mois, la mesure est évaluée avec le mois comme filtre ; MAXX garde le maximum : 290 (décembre 2025, tous magasins). Pour Lyon seul : 160 ; pour Lille : 130. Si vous remplacez [Total ventes] par SUM ( FaitVentes[Montant] ), il n’y a plus de transition : chaque mois renvoie le total du contexte, et le résultat est faux (3 925 sans filtre).
Compter des éléments selon une condition
Le même mécanisme permet de compter des mois :
Nb mois > 200 =
COUNTROWS ( FILTER ( VALUES ( Dates[Année-Mois] ), [Total ventes] > 200 ) )
Résultat : 13 mois (7 en 2025, 6 en 2026).
Les pièges de la transition
- Coût : dans
SUMX ( FaitVentes, [Total ventes] ), la transition est déclenchée pour chaque ligne de faits, ce qui peut être très lent sur des millions de lignes. Itérez sur une dimension ou une colonne à faible cardinalité. - Lignes en double : la transition filtre sur toutes les colonnes de la ligne. Si deux lignes de faits sont identiques, chacune « voit » les deux, et le résultat est doublé. Les itérateurs sur une table de faits sans clé unique avec une mesure sont donc dangereux.
- Lisibilité : en lisant une formule, repérez chaque mesure référencée dans un itérateur : elle signale une transition.
Méthode pour prévoir un résultat
Pour toute formule, posez-vous trois questions :
- Quel est le contexte de filtre de départ (cellule, segments) ?
- Y a-t-il un contexte de ligne (colonne calculée, itérateur) ?
- Y a-t-il un CALCULATE, explicite ou caché dans une mesure, qui transforme la ligne en filtre ?
Exercices
Les solutions et les tests restent sur le serveur. Dans l'espace étudiant, ton code est exécuté et corrigé, et le tuteur donne des indices avant la solution.
Mettre en évidence la transition de contexte
Jeu de données du cours. Créez
C:\Formation\ventes_mensuelles.csv(UTF-8) avec les 36 lignes ci-dessous (une vente agrégée par magasin et par mois, de janvier 2025 à juin 2026) :Date,CodeMagasin,Montant 2025-01-15,M1,100 2025-01-15,M2,80 2025-02-15,M1,110 2025-02-15,M2,85 2025-03-15,M1,120 2025-03-15,M2,90 2025-04-15,M1,105 2025-04-15,M2,95 2025-05-15,M1,115 2025-05-15,M2,100 2025-06-15,M1,130 2025-06-15,M2,105 2025-07-15,M1,90 2025-07-15,M2,70 2025-08-15,M1,80 2025-08-15,M2,60 2025-09-15,M1,125 2025-09-15,M2,95 2025-10-15,M1,135 2025-10-15,M2,100 2025-11-15,M1,140 2025-11-15,M2,110 2025-12-15,M1,160 2025-12-15,M2,130 2026-01-15,M1,120 2026-01-15,M2,90 2026-02-15,M1,115 2026-02-15,M2,100 2026-03-15,M1,130 2026-03-15,M2,95 2026-04-15,M1,125 2026-04-15,M2,105 2026-05-15,M1,135 2026-05-15,M2,110 2026-06-15,M1,150 2026-06-15,M2,120Puis : importez-le dans la table FaitVentes (Date en type Date, Montant en entier) ; créez DimMagasin avec Accueil > Entrer des données (CodeMagasin, Magasin :
M1, LyonetM2, Lille) ; créez la table Dates en DAX :Dates = ADDCOLUMNS ( CALENDAR ( DATE ( 2025, 1, 1 ), DATE ( 2026, 12, 31 ) ), "Année", YEAR ( [Date] ), "Numéro mois", MONTH ( [Date] ), "Année-Mois", FORMAT ( [Date], "yyyy-mm" ) )Marquez Dates comme table de dates, reliez Dates[Date] → FaitVentes[Date] et DimMagasin[CodeMagasin] → FaitVentes[CodeMagasin], et créez
Total ventes = SUM ( FaitVentes[Montant] ). Contrôle : Total ventes = 3 925.- Dans DimMagasin, créez les colonnes calculées
CA sans CALCULATE,CA avec CALCULATEetCA via mesure. - Créez les mesures
Meilleur mois(MAXX avec la mesure) etMeilleur mois (faux)(MAXX avec SUM ( FaitVentes[Montant] )). - Placez les deux mesures dans un tableau par magasin, avec une ligne de total.
- CA sans CALCULATE = 3 925 sur les deux lignes
- CA avec CALCULATE et CA via mesure = 2 185 (Lyon) et 1 740 (Lille)
- Meilleur mois : Lyon 160, Lille 130, total 290
- Meilleur mois (faux) : Lyon 2 185, Lille 1 740, total 3 925
- Dans DimMagasin, créez les colonnes calculées
Compter les mois au-dessus d'un seuil
Écrivez la mesure Nb mois > 200 qui compte les mois (colonne
Dates[Année-Mois]) dont[Total ventes]dépasse strictement 200.Nb mois > 200 = -- à compléterPrévoir le résultat
Dans une colonne calculée de DimMagasin, que renvoie
COUNTROWS ( FaitVentes )?- Le nombre de ventes du magasin de la ligne
- Le nombre total de lignes de FaitVentes (36) sur chaque ligne
- Une erreur
- BLANK
Quiz de fin de leçon
Qu’est-ce que la transition de contexte ?
- La conversion du contexte de ligne en contexte de filtre par CALCULATE
- Le passage d'une page à l'autre
- Le tri d'une colonne
Pourquoi [Total ventes] dans une colonne calculée de DimMagasin donne-t-il le CA du magasin ?
- Parce qu'une mesure est implicitement entourée de CALCULATE
- Parce que les colonnes calculées filtrent toujours
- Parce que la relation est bidirectionnelle
Quel est le risque de SUMX ( FaitVentes, [Total ventes] ) sur une grande table ?
- Aucun
- Une transition de contexte par ligne : lenteur et doublons possibles
- Une erreur de syntaxe
La suite du cours
- Les modificateurs de CALCULATE : ALL, ALLEXCEPT, ALLSELECTED, KEEPFILTERS20 min
- Time intelligence : cumuls annuels et comparaisons N-120 min
- Cumuls, moyennes mobiles, classements et fonctions de fenêtre20 min
- Groupes de calcul, performance et débogage20 min