Partager via


Utiliser SELECTEDVALUE au lieu de VALUES

En tant que modélisateur de données, vous devrez peut-être parfois écrire une expression DAX qui teste si une colonne est filtrée par une valeur spécifique.

Dans les versions antérieures de DAX, cette exigence a été obtenue en toute sécurité à l’aide d’un modèle impliquant trois fonctions DAX ; IF, HASONEVALUE et VALUES. La définition de mesure suivante présente un exemple. Il calcule le montant de la taxe de vente, mais uniquement pour les ventes effectuées aux clients australiens.

Australian Sales Tax =
IF(
    HASONEVALUE(Customer[Country-Region]),
    IF(
        VALUES(Customer[Country-Region]) = "Australia",
        [Sales] * 0.10
    )
)

Dans l’exemple, la fonction HASONEVALUE retourne TRUE uniquement lorsqu’une seule valeur de la colonne Pays-Région est visible dans le contexte de filtre actuel. Lorsqu’il est TRUE, la fonction VALUES est comparée au texte littéral « Australie ». Lorsque la fonction VALUES retourne TRUE, la mesure Sales est multipliée par 0,10 (représentant 10%). Si la fonction HASONEVALUE retourne FALSE( car plusieurs valeurs filtrent la colonne), la première fonction IF retourne BLANK.

L’utilisation du HASONEVALUE est une technique défensive. Il est nécessaire, car il est possible que plusieurs valeurs filtrent la colonne Pays-Région. Dans ce cas, la fonction VALUES retourne une table de plusieurs lignes. La comparaison d’une table de plusieurs lignes à une valeur scalaire entraîne une erreur.

Recommandation

Il est recommandé d’utiliser la fonction SELECTEDVALUE. Il obtient le même résultat que le modèle décrit dans cet article, mais de façon plus efficace et élégante.

À l’aide de la fonction SELECTEDVALUE, l’exemple de définition de mesure est maintenant réécrit.

Australian Sales Tax =
IF(
    SELECTEDVALUE(Customer[Country-Region]) = "Australia",
    [Sales] * 0.10
)

Conseil

Il est possible de transmettre une valeur de résultat alternatif dans la fonction SELECTEDVALUE. La valeur de résultat alternative est retournée lorsqu’aucun filtre (ou plusieurs filtres) ne sont appliqués à la colonne.