Support formation Rapports Power BI

Fonctions définies par l'utilisateur (UDF)

En bref

  • Objectifs : écrire une fonction DAX réutilisable ; choisir le type et le mode de passage de ses paramètres ; l'enregistrer dans le modèle et l'appeler depuis une mesure.
  • Prérequis : « Vue de requête DAX », « Itérateurs et variables ».
  • Niveau : avancé.
  • Disponibilité : fonctionnalité en disponibilité générale dans Power BI Desktop et le service Power BI depuis la version de juin 2026 ; niveau de compatibilité du modèle 1702 ou supérieur.

Pourquoi ?

Dans un modèle réel, la même logique revient dans des dizaines de mesures : une part protégée contre la division par zéro, un calcul de taxe, un filtre sur une période. Copier la formule dans chaque mesure multiplie les risques d'erreur et les corrections. Une fonction définie par l'utilisateur (UDF, User-Defined Function) écrit cette logique une seule fois, avec des paramètres, et chaque mesure l'appelle comme une fonction DAX native.

Notions clés

Syntaxe

DEFINE
    /// Description de la fonction
    FUNCTION <NomFonction> = ( [<parametre> [: <type>] [<sous-type>] [<mode>] [= <valeur par défaut>], ...] ) => <corps de la fonction>
  • Le nom ne contient que des lettres, des chiffres et des tirets bas ; il peut contenir des points pour créer un espace de noms (Ventes.Part), mais ne peut ni commencer ni finir par un point. Il ne doit pas reprendre le nom d'une fonction DAX native ni un mot réservé.
  • Une fonction accepte de 0 à 256 paramètres ; une valeur par défaut rend un paramètre facultatif.
  • Les commentaires /// placés au-dessus de la fonction deviennent sa description dans IntelliSense.

Types et modes de passage

ÉlémentValeurs
Type de valeur (évalué avant l'appel)AnyVal (par défaut), Scalar, Table
Type de référence (évalué dans la fonction)AnyRef, ColumnRef, MeasureRef, TableRef, CalendarRef
Sous-type (valeurs scalaires)Variant, Int64, Decimal, Double, String, DateTime, Boolean, Numeric
Mode de passageVAL : l'argument est évalué une fois, avant l'appel, dans le contexte de l'appelant ; EXPR : l'argument est évalué à l'intérieur de la fonction, éventuellement dans un autre contexte de filtre et plusieurs fois

Le mode EXPR est indispensable quand la fonction modifie le contexte de filtre de l'argument, par exemple avec CALCULATE : en mode VAL, l'argument serait déjà calculé, comme une variable (voir « Itérateurs et variables »).

Où créer une UDF

  • Dans la vue de requête DAX : définissez et testez la fonction, puis cliquez sur Mettre à jour le modèle : Ajouter une nouvelle fonction (ou Mettre à jour le modèle avec les modifications).
  • Dans la vue TMDL : écrivez la fonction avec le mot-clé function, puis appliquez.
  • Dans le service Power BI, avec l'édition web des modèles sémantiques.

Les fonctions apparaissent dans l'Explorateur de modèles, sous le nœud Fonctions. Dans un projet PBIP, elles sont enregistrées dans le fichier functions.tmdl du dossier definition.

Pas à pas

1. Ouvrez la vue de requête DAX et saisissez la définition de la fonction, suivie d'un EVALUATE de test :

DEFINE
    /// Renvoie la part du numérateur dans le dénominateur, vide si le dénominateur est nul
    FUNCTION Part = ( numerateur : NUMERIC, denominateur : NUMERIC ) =>
        DIVIDE ( numerateur, denominateur )

EVALUATE
{ Part ( 25, 200 ) }
// Renvoie 0,125

2. Exécutez la requête, puis cliquez sur Mettre à jour le modèle : Ajouter une nouvelle fonction, au-dessus de la définition.

[Capture : vue de requête DAX avec la définition de la fonction Part, le lien Mettre à jour le modèle : Ajouter une nouvelle fonction et le résultat 0,125]

3. Créez une mesure qui appelle la fonction :

% ALL Produit = Part ( [Montant vente], CALCULATE ( [Montant vente], ALL ( Produit ) ) )

4. Vérifiez dans l'Explorateur de modèles que la fonction figure sous le nœud Fonctions.

[Capture : volet Explorateur de modèles, nœud Fonctions déplié avec la fonction Part]

Exemple

Une fonction qui reçoit une mesure en mode EXPR et la calcule pour une couleur donnée :

DEFINE
    /// Calcule une expression pour une seule couleur de produit
    FUNCTION PourCouleur = ( expression : EXPR, couleur : STRING ) =>
        CALCULATE ( expression, Produit[Couleur] = couleur )

EVALUATE
SUMMARIZECOLUMNS (
    Geographie[Pays],
    "Montant", [Montant vente],
    "Montant rouge", PourCouleur ( [Montant vente], "Rouge" )
)

En mode EXPR, [Montant vente] est évalué dans la fonction, après le filtre Couleur : le montant rouge est correct. En mode VAL, l'argument serait calculé avant l'appel et CALCULATE n'aurait aucun effet.

Une fonction peut en appeler une autre (sans récursivité) :

DEFINE
    FUNCTION AjouterTaxe = ( montant : NUMERIC, taux : NUMERIC = 0.2 ) => montant * ( 1 + taux )

    FUNCTION PrixRemiseTTC = ( montant : NUMERIC, remise : NUMERIC ) => AjouterTaxe ( montant * ( 1 - remise ) )

EVALUATE
{ PrixRemiseTTC ( 100, 0.1 ) }
// Renvoie 108

Pièges et bonnes pratiques

  • Choisissez le mode de passage : VAL pour une valeur déjà calculée, EXPR dès que la fonction applique un filtre ou un itérateur à l'argument.
  • Pas de récursivité ni de surcharge : une fonction ne peut pas s'appeler elle-même, et deux fonctions ne peuvent pas porter le même nom avec des paramètres différents.
  • Pas de dossier d'affichage ni de masquage pour les fonctions ; pas de type de retour explicite.
  • Sécurité : la sécurité au niveau objet (OLS) ne s'applique pas aux fonctions ; évitez de révéler le nom d'objets protégés dans le nom ou la description d'une fonction.
  • IntelliSense : il n'y a pas d'IntelliSense pour les UDF dans la barre de formule des calculs visuels.
  • Documentez chaque fonction avec des commentaires /// : ils s'affichent quand vous l'utilisez dans une mesure.
  • Préfixez vos fonctions par un espace de noms (GD.Part, Ventes.Part) pour les distinguer des fonctions natives et des bibliothèques partagées.

À retenir

  • Une UDF se définit avec FUNCTION Nom = ( paramètres ) => corps, puis s'enregistre dans le modèle.
  • Elle s'appelle dans une mesure, une colonne calculée ou un calcul visuel comme une fonction native.
  • VAL évalue l'argument avant l'appel, EXPR le réévalue dans la fonction.
  • Les UDF sont en disponibilité générale depuis juin 2026 (niveau de compatibilité 1702).

Pour aller plus loin

Exercice

Après le thème 3 | Parts et contributions, créez une fonction Part et réécrivez vos trois mesures de pourcentage (questions 3.1 à 3.3) en l'appelant.