La ligne que le budget a oubliée
Un reporting Réel contre Budget peut perdre 2 100 euros de charges sans afficher la moindre erreur. La cause tient au choix de l'axe d'analyse, pas à une formule. Comment reproduire l'écart, le corriger, et écrire la recette qui l'aurait détecté avant l'envoi.

Le rapport part chez le directeur financier. Il revient avec une remarque : la dégradation du résultat est de 8 519,03 euros, et la page des écarts n'en montre que 6 419,03. Il manque 2 100,00. Aucune cellule vide, aucun message d'erreur, aucun total qui clignote. Le rapport est faux, et il a l'air juste.
Le modèle et les mesures sont ceux de Le budget qui n'a pas de jour : un grand livre au jour, un budget au mois raccordé par TREATAS, une convention d'écart Réel moins Budget. Il manque trois mesures, pour lire les écarts ligne par ligne :
Reel ligne = [Produits] + [Charges]
Ecart ligne = [Reel ligne] - [Budget]
Ecart defavorable =
VAR Signe = SELECTEDVALUE ( Dim_PlanComptable[SigneAttendu] )
RETURN [Ecart ligne] * IF ( Signe = -1 ; -1 ; 1 )
Sur une ligne de compte, un seul des deux termes de Reel ligne est non vide : la somme donne le montant du compte. Ecart defavorable retourne le signe des produits, pour qu'un chiffre positif veuille toujours dire la même chose : un écart qui coûte.
Reproduire l'écart
La page des écarts doit lister chaque ligne budgétaire avec son réel, son budget et son écart. Le chemin le plus court semble évident : le fichier budget contient déjà les libellés, on les prend.
- Nouvelle page, nommée Ecarts. Insérer une Matrice.
- Lignes : Fait_Budget[Libelle]. Valeurs : Reel ligne, Budget, Ecart defavorable.
- Volet Filtres : Dim_Calendrier[Annee] égal à 2026.
Premier constat : la colonne Reel ligne affiche 89 385,50 sur chacune des neuf lignes. Le budget, lui, change d'une ligne à l'autre. La relation entre Fait_Budget et Dim_PlanComptable va du plan comptable vers le budget, pas l'inverse. Un libellé pris dans le budget filtre le budget, et rien d'autre. Le réel ne reçoit aucun filtre et affiche partout le même total, produits et charges de 2026 additionnés.
Cette erreur-là est bruyante : personne ne l'envoie. C'est la correction qui suit qui est dangereuse.
La correction qui cache le problème
Pour que le réel suive les lignes, la tentation est d'ouvrir la relation dans les deux sens. Vue Modèle, double-clic sur la relation entre Fait_Budget et Dim_PlanComptable, Direction du filtre croisé : Les deux. Le visuel se met à répondre. Chaque ligne affiche son réel, son budget et son écart :
| Libellé (axe pris dans le budget) | Réel | Budget | Écart défavorable |
|---|---|---|---|
| Achats de matières premières | 3 200,50 | 2 688,42 | +512,08 |
| Fournitures non stockables | 1 450,00 | 1 377,50 | +72,50 |
| Locations | 3 200,00 | 2 966,40 | +233,60 |
| Services bancaires et assimilés | 185,00 | 222,00 | -37,00 |
| Rémunérations du personnel | 45 000,00 | 42 525,00 | +2 475,00 |
| Charges de sécurité sociale | 9 600,00 | 8 294,40 | +1 305,60 |
| Charges d'intérêts | 850,00 | 726,75 | +123,25 |
| Ventes de produits finis | 16 900,00 | 15 598,00 | -1 302,00 |
| Prestations de services | 6 900,00 | 9 936,00 | +3 036,00 |
Tout a l'air juste. Additionnez pourtant la dernière colonne : 6 419,03. Il en manque 2 100,00.
Le compte 681000, Dotations aux amortissements, porte 2 100,00 de réel en mars 2026 et aucune ligne de budget. Il n'a donc aucune place sur un axe construit à partir du budget. Il ne s'affiche pas en vide : il n'existe pas. Et la ligne de total de la matrice n'aide pas davantage. Au niveau du total, aucun compte n'est sélectionné, le signe n'est plus déterminé, et Ecart defavorable additionne produits et charges sans distinction : 5 051,03, un nombre qui ne correspond à rien. La seule addition qui a un sens, celle des lignes, personne ne la fait à la main.
Un axe pris dans une table de faits ne montre que ce que cette table contient. Tout ce qui existe ailleurs sort de l'analyse, sans prévenir.
La relation dans les deux sens a un second coût : elle laisse le budget filtrer le plan comptable, puis le réel, sur toutes les pages du rapport. Un filtre que personne n'a demandé peut alors changer un chiffre que personne ne regardait.
La vraie correction : l'axe vient de la dimension
- Remettre la relation entre Fait_Budget et Dim_PlanComptable en Direction du filtre croisé : Unique.
- Dans la matrice, remplacer Fait_Budget[Libelle] par Dim_PlanComptable[Libelle].
La dimension contient les 17 comptes du plan comptable, quel que soit le contenu de l'une ou l'autre table de faits. Les deux mesures la suivent par des relations ordinaires. Dix lignes s'affichent pour 2026 : les neuf comptes budgétés, et Dotations aux amortissements, avec 2 100,00 de réel, un budget vide et un écart défavorable de 2 100,00. La somme des écarts défavorables remonte à 8 519,03 et réconcilie avec la synthèse.
Un budget vide n'est pas un budget à zéro
La ligne des amortissements affiche maintenant un budget vide. La tentation suivante est de le remplacer par un zéro, pour que le tableau soit propre. Ce serait une affirmation fausse : un zéro dit que le poste a été budgété à rien, un vide dit qu'il n'a pas été budgété du tout.
Budget affiche = IF ( ISBLANK ( [Budget] ) ; "Non budgete" ; FORMAT ( [Budget] ; "#,##0.00" ) )
Cette mesure sert à l'affichage de la matrice. Les calculs d'écart continuent d'utiliser Budget.
Le contrôle qui l'aurait vu tout seul
Controle comptes non budgetes =
COUNTROWS (
FILTER (
VALUES ( Dim_PlanComptable[Compte] ) ;
NOT ISBLANK ( [Reel ligne] ) && ISBLANK ( [Budget] )
)
)
La mesure parcourt les comptes de la dimension et compte ceux qui ont du réel sans budget. Sur 2026, elle vaut 1. Posée dans une carte discrète en pied de page, avec une mise en forme conditionnelle qui la passe en rouge au-delà de zéro, elle signale l'anomalie sans que personne ait à la chercher. Ce 1 est connu et assumé : il se documente, il ne se désactive pas.
La recette, avant d'envoyer
Le rapport n'était pas faux par manque de DAX. Il était faux parce que rien ne l'obligeait à prouver ses totaux avant de partir. Quatre contrôles suffisent ici, chacun avec sa valeur attendue et l'endroit où la lire :
| Contrôle | Où le lire | Valeur attendue |
|---|---|---|
| Additivité par centre de coûts | total d'une table Résultat net par centre de coûts, 2026 | -41 785,50 |
| Exhaustivité du budget | carte Budget, 2026, sans filtre de compte | 84 334,47 |
| Continuité avec l'historique | chiffre d'affaires 2025, puis 2025 et 2026 ensemble | 22 460,00 puis 46 260,00 |
| Comptes non budgétés | carte Controle comptes non budgetes, 2026 | 1 |
Le premier se lit sur une table par centre de coûts : Commercial +23 800,00, Production -8 035,50, Siège -57 550,00, Trésorerie vide. La somme redonne exactement le résultat net global. Un écart signifierait qu'une écriture porte un journal absent de la table des centres de coûts.
Ces quatre valeurs se consignent sur une page Recette, masquée et datée. C'est elle qui permet de reprendre le rapport six mois plus tard sans le refaire.
Un rapport livré sans recette écrite n'est pas un livrable, c'est une maquette.
Le modèle est juste, et il sait le prouver. Reste à en faire un rapport qu'un directeur financier peut lire en dix secondes et interroger seul : Le rapport qui répond à la question suivante.
Versions : article rédigé d'après Power BI Desktop, mise à jour d'août 2026 (interface en français). Les fonctions DAX utilisées (FILTER, COUNTROWS, SELECTEDVALUE, ISBLANK, VALUES, FORMAT) sont disponibles dans les versions actuelles ; les noms de menus peuvent changer au fil des mises à jour mensuelles.