ES
ERVIS SEFERI
Finance · Business · Technologie
← Retour · Je partage mes connaissances
IA & Automatisation · Power BI

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.

Deux listes d'écarts défavorables 2026 : l'axe pris dans le budget montre 9 lignes et 6 419,03, l'axe pris dans le plan comptable montre 10 lignes dont les dotations aux amortissements, et 8 519,03
Mêmes mesures, même période. Seul l'axe change, et avec lui 2 100,00 de charges.

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.

  1. Nouvelle page, nommée Ecarts. Insérer une Matrice.
  2. Lignes : Fait_Budget[Libelle]. Valeurs : Reel ligne, Budget, Ecart defavorable.
  3. 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.

Schéma du sens des filtres : le plan comptable filtre le réel et le budget, un filtre posé sur le budget ne remonte pas vers le plan comptable
Un filtre suit la relation du côté « un » vers le côté « plusieurs ». Posé sur la table budget, il ne remonte nulle part.

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éelBudgetÉcart défavorable
Achats de matières premières3 200,502 688,42+512,08
Fournitures non stockables1 450,001 377,50+72,50
Locations3 200,002 966,40+233,60
Services bancaires et assimilés185,00222,00-37,00
Rémunérations du personnel45 000,0042 525,00+2 475,00
Charges de sécurité sociale9 600,008 294,40+1 305,60
Charges d'intérêts850,00726,75+123,25
Ventes de produits finis16 900,0015 598,00-1 302,00
Prestations de services6 900,009 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

  1. Remettre la relation entre Fait_Budget et Dim_PlanComptable en Direction du filtre croisé : Unique.
  2. 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ôleOù le lireValeur attendue
Additivité par centre de coûtstotal d'une table Résultat net par centre de coûts, 2026-41 785,50
Exhaustivité du budgetcarte Budget, 2026, sans filtre de compte84 334,47
Continuité avec l'historiquechiffre d'affaires 2025, puis 2025 et 2026 ensemble22 460,00 puis 46 260,00
Comptes non budgétéscarte Controle comptes non budgetes, 20261

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.