Les fonctions DAX définies par l’utilisateur
En septembre 2025, une nouvelle fonctionnalité en prévision a été introduite dans Power BI : les Fonctions DAX définies par l’utilisateur (UDF). Cette introduction représente une réelle révolution dans l’utilisation du langage DAX. Les développeurs ne sont plus limités aux fonctions natives du DAX et n’ont plus besoin de créer des mesures aux logiques redondantes et difficiles à maintenir. Avec les UDF, ils sont capables de définir leurs propres fonctions leur permettant ainsi d’avoir une grande flexibilité dans le développement.
1. Les avantages pour le développement DAX
- Centralisation et réutilisabilité : Une règle métier est définie une seule fois et peut être utilisée dans plusieurs mesures, colonnes calculées, calculs visuels ou dans d’autres fonctions définies par l’utilisateur.
- Évolution et maintenance simplifiée : La modification d’une fonction met à jour automatiquement tous les calculs dépendants.
- Portabilité : Les fonctions peuvent être regroupées dans des bibliothèques et être partagées entre différents modèles sémantiques.
- Lisibilité : Les mesures sont plus lisibles en remplaçant les blocs complexes par des appels à des fonctions.
- Moins d’erreurs : L’utilisation d’indicateurs de type et de fonctions de vérification rend la fonction plus résistante aux erreurs.
2. Définition et intégration dans le modèle
Avant de pouvoir essayer les fonctions définies par l’utilisateur, il faut les activer dans la rubrique « fonctionnalités en prévision » dans les options de Power BI desktop.

Les fonctions peuvent être définies, soit dans la vue de requête DAX (DQV) avec la commande DEFINE, ou dans la vue TDML (Tabular Model Definition Language) avec la commande createOrReplace.

La syntaxe d’une fonction définie par l’utilisateur se présente de la manière suivante :
FUNCTION <NomFonction> = ( [NomParamètre] : [Type] [SousType] [Mode], … ) =>
<Corps de la fonction>

Le nom de la fonction doit être unique dans le modèle, il peut contenir des points, mais pas d’espaces ou de caractères spéciaux. Il ne doit pas être le nom d’une fonction intégrée DAX ou un mot réservé.
Une fonction définie par l’utilisateur peut accepter zéro ou plusieurs paramètres. Le nom d’un paramètre peut contenir des caractères alphanumériques ou des traits de soulignement « _ ». Il ne doit pas être un mot réservé.
Pour chaque paramètre défini dans la fonction, les indicateurs [Type] [SousType] [Mode] peuvent être spécifiés. S’ils ne le sont pas, la valeur par défaut « anyval val » sera utilisée.
Ces indicateurs sont résumés dans le tableau suivant :
| Type | Sous-type | Mode | Remarques |
|---|---|---|---|
| anyval | val | Accepte tout type de donnée scalaire ou une table. C’est le type par défaut. | |
| scalar | val / expr | Accepte une valeur scalaire. | |
| variant | val / expr | Accepte une valeur scalaire. | |
| Int64 | val / expr | Accepte un nombre entier. | |
| Decimal | val / expr | Accepte une décimale avec précision fixe. | |
| Double | val / expr | Accepte une décimale à virgule flottante. | |
| String | val / expr | Accepte un texte. | |
| Datetime | val / expr | Accepte une date/heure. | |
| Boolean | val / expr | Accepte True/False. | |
| Numeric | val / expr | Accepte une valeur numérique. | |
| Table | val / expr | Accepte uniquement une table. | |
| Anyref | expr | Accepte une référence à une table, colonne, mesure ou calendrier. |
L’indicateur « mode » définit la manière de passage des paramètres et influence le comportement de la fonction.
Si le mode est « val », le paramètre est évalué immédiatement avant l’appel de la fonction et sa valeur est figée. En revanche, s’il est « expr », il est évalué à l’intérieur du corps de la fonction et change selon le contexte interne.
Une fonction définie par l’utilisateur peut comporter une documentation intégrée. L’utilisation de « /// » juste au-dessus de la fonction, permet d’afficher une description dans l’infobulle lors de son utilisation. Contrairement à « // » ou « /**/ » qui servent pour les commentaires.
Une fois qu’une fonction définie par l’utilisateur est enregistrée dans le modèle, son appel se fait de la même façon que les fonctions intégrées DAX.
Toutes les fonctions définies par l’utilisateur peuvent être affichées à partir de l’explorateur de modèles sous le nœud « Fonctions » ou via la requête DMV (Dynamic Management Views) « EVALUATE INFO.FUNCTIONS(« ORIGIN », « 2 ») »


3. Limitations actuelles
- Pas de récursivité : Une fonction ne peut pas s’appeler elle-même.
- Pas de paramètres optionnels : Tous les arguments d’une fonction sont obligatoires.
- Sécurité OLS : Les fonctions définies par l’utilisateur n’héritent pas de la sécurité au niveau de l’objet.
- Refactoring : Renommer un objet utilisé dans une UDF ne met pas à jour automatiquement le code de la fonction.
4. Conclusion
Avec l’arrivée des fonctions définies par l’utilisateur dans Power BI, le DAX passe d’un langage d’expression de formules vers un outil de programmation flexible et modulaire qui permet de séparer la logique métier de la couche de présentation.
Référence :
https://learn.microsoft.com/en-us/dax/best-practices/dax-user-defined-functions