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 . 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 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
Modes de passage des paramètres
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]) )
)
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. 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
- guide complet sur les UDF DAX - article approfondi de Marco Russo et Alberto Ferrari - bibliothèque open source de fonctions UDF réutilisables - guide pratique avec Tabular Editor - exemple concret avec simulation d’inflation