Génération DAX avec l’IA : Claude comme co-développeur Power BI

Série : Automatiser Power BI avec Claude AI — Épisode 7/12 Temps de lecture : 11 min Public cible : BI Engineers, Power BI Developers, Data Analysts
TL;DR : Claude génère des mesures DAX fonctionnelles en quelques secondes à partir d’une maquette visuelle et d’un dictionnaire KPI. Sur le projet client (27 mesures), le gain mesuré est de 12 à 15 heures — soit -75 % par page. Claude excelle sur la structure DAX standard (CALCULATE, DIVIDE, BLANK()) et les conventions de nommage, mais nécessite une review humaine sur les relations complexes, l’optimisation et la time intelligence avancée.

Pourquoi DAX est-il un goulot d’étranglement en développement Power BI ?

DAX est le langage de formules de Power BI. Il est puissant mais verbeux : un KPI simple en apparence peut nécessiter 20 lignes de code avec CALCULATE, FILTER, ALL, USERELATIONSHIP. Sur un projet de 27 mesures comme celui-ci, c’est 9 à 20 heures de travail — un goulot d’étranglement majeur que l’IA réduit de 75 %.
Pour “compter les projets en cours”, on pourrait écrire :
plain text
Projets En Cours = CALCULATE( COUNTROWS(Projets), Projets[Statut] = "En cours" )
Mais pour “calculer le taux d’économies en excluant les projets annulés et en gérant le cas où le montant AO est zéro”, ça devient :
plain text
Taux Economies % = VAR MontantAO = CALCULATE( SUM(Contrats[Montant_AO]), NOT(Projets[Statut] IN {"Annulé", "Suspendu"}) ) RETURN IF( MontantAO = 0, BLANK(), DIVIDE( MontantAO - CALCULATE( SUM(Contrats[Montant_Contractualise]), NOT(Projets[Statut] IN {"Annulé", "Suspendu"}) ), MontantAO, BLANK() ) )
27 mesures de ce niveau sur le projet client. À raison de 20 à 45 minutes par mesure, c’est 9 à 20 heures de travail.
Claude en génère la première version en quelques secondes. La review humaine prend 30 minutes par page.

Comment Claude raisonne-t-il pour générer du DAX depuis une maquette ?

La vraie innovation n’est pas que Claude “connaît DAX”. GPT-4 connaît DAX aussi. Ce qui change, c’est le point de départ : Claude raisonne depuis le résultat attendu vers le code, comme un BI Engineer expérimenté qui lit une maquette et “voit” immédiatement les mesures nécessaires.
Méthode traditionnelle : 1. Regarder le modèle de données 2. Comprendre ce que le visuel doit afficher 3. Écrire la mesure en partant du schéma
Méthode avec Claude sur ce projet : 1. Montrer la maquette visuelle 2. Fournir le dictionnaire KPI (définition + valeur de référence) 3. Fournir le schéma de données 4. Demander : “Génère les mesures DAX pour cette page”

Quel prompt utiliser pour générer les mesures DAX d’une page ?

Le prompt

plain text
Tu es un expert DAX Power BI. MAQUETTE PAGE ACHATS : 1. Scorecard "Montant AO Total" : somme des montants AO hors "Annulé". Valeur réf : 64 022 kEUR 2. Scorecard "Contractualisé" : montants contractualisés. Valeur réf : 46 836 kEUR 3. Scorecard "Économies %" : (AO - Contractualisé) / AO. Valeur réf : 26,84 % 4. Donut chart "Répartition fournisseurs" : TOP 5 par montant 5. Histogramme "Historique 5 ans" : montant AO par année 6. Table détaillée : contrats avec colonnes SCHÉMA DE DONNÉES : Table Contrats : - Contrats[ID_Contrat] (texte) - Contrats[Fournisseur] (texte) - Contrats[Montant_AO] (décimal) - Contrats[Montant_Contractualise] (décimal) - Contrats[Statut] (texte : "En cours", "Signé", "Annulé", "En attente") - Contrats[Date_AO] (date) - Contrats[Date_Signature] (date, peut être NULL) CONVENTIONS DE NOMMAGE : Format : [Catégorie] Nom Mesure Exemples : [Achats] Montant AO Total, [Achats] Taux Économies GÉNÈRE les mesures DAX pour les 6 visuels.

Les mesures générées

plain text
-- Somme des montants AO, hors contrats annulés [Achats] Montant AO Total = CALCULATE( SUM(Contrats[Montant_AO]), Contrats[Statut] <> "Annulé" ) -- Valeur attendue Mars 2025 : 64 022 kEUR
plain text
-- Somme des montants contractualisés (contrats signés uniquement) [Achats] Montant Contractualisé = CALCULATE( SUM(Contrats[Montant_Contractualise]), Contrats[Statut] = "Signé" ) -- Valeur attendue Mars 2025 : 46 836 kEUR
plain text
-- Ratio (AO - Contractualisé) / AO [Achats] Taux Économies = VAR MontantAO = [Achats] Montant AO Total RETURN IF( MontantAO = 0, BLANK(), DIVIDE( MontantAO - [Achats] Montant Contractualisé, MontantAO ) ) -- Valeur attendue Mars 2025 : 26,84 %
plain text
-- Label pour le donut chart : TOP 5 fournisseurs + "Autres" [Achats] TOP5 Fournisseur Label = VAR CurrentSupplier = MAX(Contrats[Fournisseur]) VAR Top5List = TOPN(5, ALL(Contrats[Fournisseur]), CALCULATE(SUM(Contrats[Montant_Contractualise])), DESC) RETURN IF(CurrentSupplier IN Top5List, CurrentSupplier, "Autres")

Que fait bien Claude en DAX — et que fait-il moins bien ?

Ce qu’il fait bien

  • La structure DAX standard (CALCULATE, FILTER, DIVIDE, BLANK())
  • Les conventions de nommage (si vous donnez des exemples)
  • Les cas limites courants (division par zéro, NULL, BLANK())
  • La documentation inline (commentaires DAX)

Ce qu’il fait moins bien

  • Les relations complexes (USERELATIONSHIP avec modèles en étoile compliqués)
  • L’optimisation (3 CALCULATE imbriqués quand 1 suffit)
  • L’inventivité sur les noms de colonnes (invente si le schéma est incomplet)
  • Les time intelligence avancées (calendriers fiscaux personnalisés)

Comment faire un quality check systématique du DAX généré ?

Après chaque génération DAX, un quality check en 4 points est indispensable. C’est l’essentiel du temps humain restant : 20 à 30 minutes par page.
1. Valeurs de référence — Les mesures retournent-elles les valeurs attendues pour Mars 2025 ?
2. Cohérence des filtres — Les mesures qui “excluent les annulés” l’excluent-elles vraiment ?
3. Comportement cross-filter — La mesure se comporte-t-elle correctement quand on filtre par pays, fournisseur, année ?
4. Cas limites — Que se passe-t-il si on filtre sur un pays sans données ?
Ce quality check est ce qui a permis de détecter 8 anomalies sur le projet client avant la mise en production — dont un écart de plusieurs dizaines de MEUR entre deux pages.

Quel gain de temps réel par type de mesure ?

Type de mesure
Temps sans Claude
Temps avec Claude
Mesure simple (COUNT, SUM)
15 min
2 min review
Mesure moyenne (CALCULATE + FILTER)
30 min
5 min review
Mesure complexe (TOPN, time intelligence)
60 min
15 min review
Page complète (6-8 mesures)
2-3h
30 min review
Sur 27 mesures DAX du projet client, le gain total est estimé à 12 à 15 heures. Coût en tokens : environ 0,03 EUR.

FAQ — Génération DAX avec l’IA

Claude peut-il générer du DAX optimal dès le premier essai ? Rarement. La première version est fonctionnelle mais pas optimisée. Claude a tendance à imbriquer plusieurs CALCULATE quand un seul suffit. La review humaine corrige ces inefficacités en 5 à 15 minutes par mesure complexe.
Faut-il fournir le schéma de données complet à Claude ? Oui. Sans schéma, Claude invente des noms de colonnes — c’est l’une des principales sources d’erreur. Sur ce projet, une mesure “Coût Réel” a été générée avec une colonne inexistante (Projets[Cout_Reel]), provoquant des BLANK() silencieux en production.
Claude gère-t-il les calendriers fiscaux personnalisés en DAX ? Difficilement. La time intelligence avancée (exercices décalés, semaines ISO, périodes comptables) nécessite un contexte métier précis que Claude ne possède pas sans documentation explicite.
Peut-on utiliser Claude pour optimiser du DAX existant ? Oui. Fournissez la mesure existante et demandez : “Optimise cette mesure DAX pour réduire le nombre de CALCULATE imbriqués tout en conservant le même résultat.”