Support formation Rapports Power BI

User-defined functions (UDF)

Ressources

model-independent function ou model-dependent function

Les fonctions DAX définies par l’utilisateur (UDF)

Guide complet avec exemples pratiques

1. Qu’est-ce qu’une UDF DAX ?

Les fonctions définies par l’utilisateur (UDF) sont une nouvelle fonctionnalité introduite en septembre 2025 dans Power BI. Elles permettent de créer des expressions DAX paramétrées et réutilisables dans tout le modèle sémantique.

Avantages des UDF

  • Centralisation de la logique métier : définir une règle une seule fois et la réutiliser partout.
  • Maintenance simplifiée : modifier une formule à un seul endroit pour impacter toutes les mesures qui l’utilisent.
  • Code plus lisible : abstraire la complexité derrière des noms de fonctions explicites.
  • Réutilisation entre modèles : partager des fonctions via TMDL ou des bibliothèques comme daxlib.org.

2. Activer les UDF dans Power BI Desktop

Les UDF sont actuellement en preview. Pour les activer :

  1. Aller dans Fichier > Options et paramètres > Options
  2. Sélectionner Fonctionnalités en preview
  3. Cocher DAX user-defined functions
  4. Redémarrer Power BI Desktop

3. Syntaxe d’une UDF

La structure générale d’une UDF est la suivante :

DEFINE
    /// Description de la fonction
    FUNCTION NomFonction = (
        parametre1 : TYPE MODE,
        parametre2 : TYPE MODE
    ) => <Corps de la fonction>

Types de paramètres disponibles

TypeSous-typesDescription
ANYVAL-Accepte scalaire ou table (défaut)
SCALARINT64, DECIMAL, DOUBLE, STRING, DATETIME, BOOLEAN, NUMERICValeur scalaire uniquement
TABLE-Expression de table
ANYREF-Référence (colonne, table, mesure, calendrier)

Modes de passage des paramètres

ModeComportementCas d’usage
VALÉvalué une seule fois avant l’appel de la fonction (eager evaluation)Valeurs fixes, paramètres simples
EXPRÉvalué à chaque utilisation dans le contexte actuel (lazy evaluation)Calculs dépendants du contexte de filtre

4. Exemples comparatifs : avec et sans UDF

Exemple 1 : calcul de taxe

Scénario : appliquer une taxe de 10% sur différents montants dans plusieurs mesures.

Sans UDF (code répété dans chaque mesure) :

-- Mesure 1
Total Ventes TTC = [Total Ventes] * 1.1


-- Mesure 2
Total Achats TTC = [Total Achats] * 1.1


-- Mesure 3
Marge TTC = [Marge] * 1.1

Avec UDF (logique centralisée) :

-- Définition de l'UDF
FUNCTION AjouterTaxe = ( montant : NUMERIC ) =>
    montant * 1.1


-- Utilisation simplifiée
Total Ventes TTC = AjouterTaxe( [Total Ventes] )
Total Achats TTC = AjouterTaxe( [Total Achats] )
Marge TTC = AjouterTaxe( [Marge] )

Avantage : si le taux de taxe change (ex: 12%), modifier uniquement la fonction suffit.

Exemple 2 : calcul de croissance

Scénario : calculer le pourcentage de croissance entre deux périodes.

Sans UDF :

Croissance Ventes = 
VAR ValeurActuelle = [Total Ventes]
VAR ValeurPrecedente = CALCULATE( [Total Ventes], SAMEPERIODLASTYEAR('Date'[Date]) )
RETURN DIVIDE( ValeurActuelle - ValeurPrecedente, ValeurPrecedente, 0 )


-- Même logique répétée pour d'autres mesures...

Avec UDF :

-- Définition de l'UDF
FUNCTION CalculerCroissance = (
    valeurActuelle : DECIMAL VAL,
    valeurPrecedente : DECIMAL VAL
) => DIVIDE( valeurActuelle - valeurPrecedente, valeurPrecedente, 0 )


-- Utilisation
Croissance Ventes = 
    CalculerCroissance(
        [Total Ventes],
        CALCULATE( [Total Ventes], SAMEPERIODLASTYEAR('Date'[Date]) )
    )

Sources : SQLBI | Medium

Exemple 3 : fonction de filtrage avec paramètre EXPR

Scénario : calculer une métrique uniquement pour les produits d’une couleur spécifique.

Sans UDF :

Ventes Rouge = CALCULATE( [Total Ventes], 'Produit'[Couleur] = "Rouge" )
Quantite Rouge = CALCULATE( [Total Quantite], 'Produit'[Couleur] = "Rouge" )
Marge Rouge = CALCULATE( [Marge], 'Produit'[Couleur] = "Rouge" )

Avec UDF (utilisant EXPR pour le contexte) :

-- Définition avec paramètre EXPR
FUNCTION CalculerPourRouge = ( metrique : EXPR ) =>
    CALCULATE( metrique, 'Produit'[Couleur] = "Rouge" )


-- Utilisation élégante
Ventes Rouge = CalculerPourRouge( [Total Ventes] )
Quantite Rouge = CalculerPourRouge( [Total Quantite] )
Marge Rouge = CalculerPourRouge( [Marge] )

Point clé : le mode EXPR permet d’évaluer la métrique dans le contexte de filtre modifié par CALCULATE.

Exemple 4 : conversion de devise flexible

Scénario : convertir des montants dans une devise cible en utilisant des taux de change.

FUNCTION ConvertirDevise = (
    codeDevise : SCALAR VARIANT,
    dateConversion : SCALAR VARIANT,
    montant : SCALAR DECIMAL
) =>
VAR CleDevise = 
    IF( ISINT64( codeDevise ), codeDevise,
        CALCULATE( MAX( 'Devise'[CleDevise] ), 'Devise'[Code] = codeDevise ) )
VAR TauxChange = 
    CALCULATE( MAX( 'TauxChange'[Taux] ),
        'TauxChange'[Date] = dateConversion,
        'TauxChange'[CleDevise] = CleDevise )
RETURN IF( ISBLANK( TauxChange ), BLANK(), TauxChange * montant )

5. Bonnes pratiques

  • Nommage en PascalCase : utiliser des noms comme CalculerMarge, AjouterTaxe pour distinguer les UDF des fonctions natives DAX (en majuscules).
  • Documenter avec /// : ajouter des descriptions au-dessus de la fonction pour l’IntelliSense.
  • Utiliser CALCULATE explicitement : avec les paramètres EXPR, forcer la transition de contexte avec CALCULATE pour garantir un comportement cohérent.
  • Optimiser le code : les fonctions étant appelées fréquemment, écrire du code performant a un impact significatif sur le modèle.
  • Tester avant déploiement : utiliser EVALUATE dans la vue de requête DAX pour valider le comportement de la fonction.

Sources : SQLBI | Tabular Editor

6. Limitations actuelles (preview)

  • La récursivité n’est pas supportée
  • La surcharge de fonctions n’est pas possible
  • Les paramètres optionnels ne sont pas disponibles
  • Impossible de créer des UDF dans le service Power BI (uniquement Desktop)
  • La sécurité au niveau de l’objet (OLS) ne se propage pas automatiquement aux fonctions

7. Ressources complémentaires