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.
Sources : Microsoft Learn | SQLBI
2. Activer les UDF dans Power BI Desktop
Les UDF sont actuellement en preview. Pour les activer :
- Aller dans Fichier > Options et paramètres > Options
- Sélectionner Fonctionnalités en preview
- Cocher DAX user-defined functions
- Redémarrer Power BI Desktop
Source : Microsoft Learn
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
| Type | Sous-types | Description |
| ANYVAL | - | Accepte scalaire ou table (défaut) |
| SCALAR | INT64, DECIMAL, DOUBLE, STRING, DATETIME, BOOLEAN, NUMERIC | Valeur scalaire uniquement |
| TABLE | - | Expression de table |
| ANYREF | - | Référence (colonne, table, mesure, calendrier) |
Modes de passage des paramètres
| Mode | Comportement | Cas 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 |
Sources : SQLBI | Microsoft Learn
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.1Avec 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]) )
)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
- Documentation officielle Microsoft - guide complet sur les UDF DAX
- SQLBI - Introducing user-defined functions in DAX - article approfondi de Marco Russo et Alberto Ferrari
- DAX Lib - bibliothèque open source de fonctions UDF réutilisables
- Tabular Editor - DAX UDF explained - guide pratique avec Tabular Editor
- Towards Data Science - Real-world UDF example - exemple concret avec simulation d’inflation