DAX Contexte d’évaluation (Partie 2)


La plupart des modèles de données contiennent plusieurs tables en relation les unes avec les autres.

 

Nous allons étudier l’impact de ces relations sur les deux contextes.

 

Contexte de ligne et relations.

 

C’est le plus simple à comprendre : il n’y a pas d’interactions.

 

Supposons une table des Ventes en relation avec une table Articles.

 

Si l’on crée une colonne visant à calculer la différence entre le prix  unitaire réellement appliqué et le prix de vente standard, prévu dans la table articles :

 

Différence=

Ventes[PU Vente]-Articles[PU Vente]

 

Retournera une erreur.

 

En effet, la colonne calculée crée une itération sur la table Ventes et elle seule !

 

Pour accéder à la valeur en relation dans la table Articles il faudra utiliser la fonction RELATED.

 

Différence=

Ventes[PU Vente]-RELATED(Articles[PU Vente])

 

Dans le sens inverse (colonne calculée dans la table Articles), il faudra utiliser RELATEDTABLE imbriquée dans une fonction d’aggrégation :

 

AVERAGE(RELATEDTABLE(Ventes[PU Vente]))

 

Ce mécanisme fonctionne, quel que soit le nombre de niveaux de la relation (Par exemple Famille->Sous-Famille->Articles->Ventes), sous réserve que les relations soient du même type et de même direction.

 

Par exemple, dans le cas ci-dessous, il n’est pas possible d’utiliser RELATED pour récupérer une information dans la table Clients, depuis Articles.

 

 

Contexte de Filtres et relations.

 

Les contextes de filtres interagissent automatiquement avec les relations.

 

Pour la même mesure :

Si un filtre est appliqué sur la table Clients, il se propagera à la table vente, mais pas à la table Article.

Si un filtre est appliqué sur la table Article, il se propagera à la table Ventes, mais pas à la table Clients.

 

Par exemple pour ces mesures :

 

Nbre Articles = countrows(Articles)

Nbre clients = COUNTROWS(Clients)

Nbre vtes = countrows(Ventes)

 

Filtre de contexte sur la table Article :

 

Filtre de contexte sur la table Clients :

 

Le sens de la flèche de la relation est donc très important, pour pouvair filtrer une table en relation dans un modèle.

 

Modifier le contexte d’évaluation.

 

Comme nous l’avons vu, toute expression est évaluée dans deux contextes qui coexistent en permanence : le contexte de ligne et le contexte de filtres.

 

Pour réaliser des mesures complexes, nous allons devoir altérer le contexte d’évaluation.

 

Prenons une mesure simple sur la table Articles :

 

Nombre d’articles Fournisseur DEPOT = COUNTROWS(FILTER(Articles;Articles[Fournisseur]= »DEPOT »))

 

Si l’on place cette mesure dans un rapport avec le champs Rayon, on obtient le nombre d’articles par Rayon, ayant pour fournisseur « DEPOT »

 

 

Dans cet exemple nous voyons parfaitement la coexistence des deux types de contextes :

 

Contexte de filtre dans le rapport : par Rayon.

Contexte de ligne :

Chaque ligne de la table article est passée en revue et seules les lignes contenant le fournisseur DEPOT sont retenues.

 

A ce niveau nous pouvons souhaiter connaitre le nombre total de produits ayant pour fournisseur « DEPOT » quel que soit le filtre du rapport, par exemple pour calculer un pourcentage.

 

Il va falloir utiliser la fonction ALL qui ignore le contexte de filtres :

 

Nombre TOUS Article DEPOT = COUNTROWS(FILTER(ALL(Articles);Articles[Fournisseur]= »DEPOT »))

 

 

ALL a supprimé TOUS les filtres sur TOUTES les colonnes de la table Articles, avant que la mesure n’applique un nouveau filtre sur la colonne [Fournisseur].

Le résultat est donc identique à celui du grand total de la mesure précédente.

 

Le fait que ALL supprime TOUS les filtres de la table peut avoir des effets indésirables dans le cas ou d’autres filtres existeraient dans le rapport (filtres par Années, Familles, Rayon…) car ils seront supprimés eux-aussi dans le calcul.

 

 

Par exemple, si l’on place un nouveau filtre dans le rapport, sur la colonne [Fournisseur] de la table Article.

On s’aperçoit que comme prévu , la mesure retourne le même chiffre, car le filtre sur le fournisseur a été supprimé du contexte d’évaluation, par ALL.

 

Mais aussi que le nombre de Rayons a diminué dans le rapport, puisque le filtre sur [Fournisseur] agit toujours sur le rapport lui-même (même si il n’agit plus sur la mesure.)

 

N’apparaissent alors que les Rayon qui ont pour Fournisseur ACCESS DECO, la mesure retournant toujours le total des articles ayant pour fournisseur DEPOT, ce qui ne présente aucun intérêt.

 

Vérifier l’existence de filtres.

 

Il y a deux fonctions qui permettent de vérifier si toutes les valeurs d’une colonne sont visibles dans le contexte de filtre :

 

ISFILTERED : Retourne TRUE ou FALSE selon que la colonne passée en argument est DIRECTEMENT filtrée ou non.

 

Num Rayon filtré ?? = ISFILTERED(Articles[Num Rayon])

 

 

Il faut qu’il existe un filtre DIRECT (ligne, colonne, slicer…) sur la colonne pour que la mesure retourne TRUE.

Si l’on place une autre colonne en filtre, la mesure retournera FALSE.

 

 

ISCROSSFILTERED : Retourne TRUE si il existe un filtre DIRECT ou INDIRECT sur la colonne.

 

Num Rayon CROSSFILTERED ?? = ISCROSSFILTERED(Articles[Num Rayon])

 

 

Laissez un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *