Skip to content

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 .
Sources : |

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 :

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)
There are no rows in this table

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
There are no rows in this table
Sources : |

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 : |

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 : |

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
Want to print your doc?
This is not the way.
Try clicking the ··· in the right corner or using a keyboard shortcut (
CtrlP
) instead.