Le budget qui n'a pas de jour
Le réel est saisi au jour, le budget est construit au mois. Comment les comparer dans Power BI sans inventer de date : le raccordement par TREATAS, une convention d'écart qui ne se lit pas à l'envers, et deux contrôles chiffrés avant de dessiner le moindre visuel.

Dans le cadre de la rubrique « Je partage mes connaissances », je vous propose de construire un reporting de gestion Réel contre Budget dans Power BI, sur janvier à avril 2026. Les écritures sont celles de la série précédente, déjà réconciliées. Une seule chose est nouvelle : un budget. Et ce budget ne vit pas à la même échelle que le réel.
Le brief, traduit avant d'ouvrir Power BI
La demande tient en trois lignes. Un reporting mensuel de l'exercice 2026, de janvier à avril. Trois pages : une synthèse lisible en dix secondes, une page d'écarts compte par compte, une page par centre de coûts. La comparaison Réel contre Budget sur chaque indicateur, livrée en fichier .pbix et en PDF.
Ces trois lignes contiennent déjà la structure du travail. La période est un filtre. La maille de comparaison est le compte, puis le centre de coûts. L'indicateur de tête est le résultat net et son écart.
Avant le premier clic, on fixe donc six indicateurs : chiffre d'affaires, charges d'exploitation, charges de personnel, résultat d'exploitation, résultat financier, résultat net. Chacun en réel, en budget, en écart en valeur, et en écart en pourcentage quand le pourcentage a un sens. Un rapport que l'on commence par dessiner à l'écran, sans cette traduction, est presque toujours à refaire.
Deux tables de faits, deux horloges
Le grand livre compte 54 lignes d'écriture sur 2025 et 2026, datées au jour. Le budget compte 11 lignes, une par compte et par mois, pour 2026 seulement. Le même modèle porte donc deux tables de faits qui ne battent pas au même rythme.
Voici le budget en entier. Chaque montant est le réel 2025 du même compte et du même mois, multiplié par une hypothèse propre au poste : +10 % sur les ventes de produits, +20 % sur les prestations, +8 % sur la masse salariale, -5 % sur les intérêts.
| Compte | Libellé | Mois | Budget |
|---|---|---|---|
| 601000 | Achats de matières premières | 2026-01 | 2 688,42 |
| 606100 | Fournitures non stockables | 2026-02 | 1 377,50 |
| 613000 | Locations | 2026-04 | 2 966,40 |
| 627000 | Services bancaires et assimilés | 2026-03 | 222,00 |
| 641000 | Rémunérations du personnel | 2026-01 | 19 440,00 |
| 641000 | Rémunérations du personnel | 2026-02 | 23 085,00 |
| 645000 | Charges de sécurité sociale | 2026-01 | 8 294,40 |
| 661000 | Charges d'intérêts | 2026-04 | 726,75 |
| 701000 | Ventes de produits finis | 2026-01 | 11 000,00 |
| 701000 | Ventes de produits finis | 2026-02 | 4 598,00 |
| 706000 | Prestations de services | 2026-03 | 9 936,00 |
| Total | 84 334,47 | ||
Le réflexe est de relier ce budget à la table de dates, par une date de fin de mois. Cela semble fonctionner tant qu'on filtre des mois entiers. Dès qu'un filtre ne contient pas le dernier jour du mois (une quinzaine, une semaine, une coupure au 30), le budget disparaît. Et sur un graphique au jour, tout le budget de janvier se retrouve posé sur le 31.
La bonne réponse est de ne pas créer cette relation du tout. Le modèle en compte quatre :
| De | Vers | Cardinalité | Sens du filtre |
|---|---|---|---|
| Fait_Ecritures[Compte] | Dim_PlanComptable[Compte] | plusieurs à un | unique |
| Fait_Ecritures[Journal] | Dim_CentreCouts[Journal] | plusieurs à un | unique |
| Fait_Ecritures[Date] | Dim_Calendrier[Date] | plusieurs à un | unique |
| Fait_Budget[Compte] | Dim_PlanComptable[Compte] | plusieurs à un | unique |
Aucune relation entre Fait_Budget et Dim_Calendrier. Ce n'est pas un oubli : c'est la décision de conception qui rend le reste possible.
Raccorder au moment du calcul
Énoncé
Écrire une mesure Budget qui répond juste quel que soit le filtre de période du rapport (un mois, un trimestre, l'année), sans relation avec la table de dates. En déduire le budget de chaque indicateur.
Solution
- Dans la table de dates, prévoir une colonne AnneeMois au format texte « 2026-01 », identique à celle du fichier budget :
"AnneeMois" ; FORMAT ( [Date] ; "YYYY-MM" )dans l'ADDCOLUMNS qui construit Dim_Calendrier. Côté budget, la colonne AnneeMois reste en Texte dans Power Query. - Accueil, Nouvelle mesure, puis :
Budget =
VAR MoisSelectionnes = VALUES ( Dim_Calendrier[AnneeMois] )
RETURN
CALCULATE (
SUM ( Fait_Budget[Budget] ) ;
TREATAS ( MoisSelectionnes ; Fait_Budget[AnneeMois] )
)
VALUES récupère la liste des mois présents dans le filtre courant, sous la forme « 2026-01 », « 2026-02 ». TREATAS applique cette liste comme si c'était un filtre natif de la colonne Fait_Budget[AnneeMois]. Le raccordement se fait à la maille du mois, au moment du calcul, sans relation physique. C'est le motif standard dès que deux tables de faits n'ont pas le même grain.
- Décliner le budget sur les mêmes axes que le réel, quatre nouvelles mesures :
Budget produits = CALCULATE ( [Budget] ; Dim_PlanComptable[CategoriePL] = "Produits" )
Budget charges d'exploitation = CALCULATE ( [Budget] ; Dim_PlanComptable[CategoriePL] = "Charges" ; Dim_PlanComptable[Niveau2] = "Resultat d'exploitation" )
Budget charges financieres = CALCULATE ( [Budget] ; Dim_PlanComptable[CategoriePL] = "Charges" ; Dim_PlanComptable[Niveau2] = "Resultat financier" )
Budget resultat net = [Budget produits] - CALCULATE ( [Budget] ; Dim_PlanComptable[CategoriePL] = "Charges" )
Les filtres sur le plan comptable passent, eux, par la relation ordinaire entre Fait_Budget et Dim_PlanComptable. Seule la date est raccordée à la main.
Résultat attendu
Une matrice avec Dim_Calendrier[AnneeMois] en lignes, filtrée sur l'année 2026 :
| Mois | CA réel | CA budget | Résultat réel | Résultat budget | Écart |
|---|---|---|---|---|---|
| 2026-01 | 12 500,00 | 11 000,00 | -22 800,50 | -19 422,82 | -3 377,68 |
| 2026-02 | 4 400,00 | 4 598,00 | -19 550,00 | -19 864,50 | +314,50 |
| 2026-03 | 6 900,00 | 9 936,00 | 4 615,00 | 9 714,00 | -5 099,00 |
| 2026-04 | -4 050,00 | -3 693,15 | -356,85 | ||
| Total | 23 800,00 | 25 534,00 | -41 785,50 | -33 266,47 | -8 519,03 |
Le total n'est pas la somme de quatre calculs séparés : c'est la même mesure, évaluée avec les quatre mois dans le filtre. TREATAS reçoit alors quatre valeurs au lieu d'une, et le résultat tombe juste. Avril n'a ni vente réelle ni vente budgétée : la cellule reste vide, et c'est la bonne réponse.
Limite à connaître : dès qu'un seul jour d'un mois est sélectionné, TREATAS rend le budget du mois entier. Un filtre « du 1er au 15 janvier » compare donc une demi-période de réel à un mois complet de budget. Un rapport budgétaire se filtre au mois, jamais au jour.
Une convention d'écart, posée une fois
L'écart est toujours Réel moins Budget. Son interprétation dépend de la nature du compte : un écart positif est favorable sur un produit, défavorable sur une charge. On écrit la convention une fois pour toutes, et on ne la retourne jamais d'une mesure à l'autre.
Ecart CA = [Chiffre d'affaires] - CALCULATE ( [Budget] ; Dim_PlanComptable[Niveau3] = "Chiffre d'affaires" )
Ecart charges d'exploitation = [Charges d'exploitation] - [Budget charges d'exploitation]
Ecart resultat net = [Resultat net] - [Budget resultat net]
Pour les pourcentages, DIVIDE plutôt que l'opérateur de division. DIVIDE rend un vide au lieu d'une erreur quand le dénominateur est nul, ce qui arrive dès qu'un compte n'a pas de ligne de budget.
Ecart charges d'exploitation % = DIVIDE ( [Ecart charges d'exploitation] ; [Budget charges d'exploitation] )
Pas de pourcentage d'écart sur un résultat. Le résultat budgété est ici négatif, -33 266,47. Rapporté à cette base, un écart de -8 519,03 donne +25,61 % : un pourcentage positif pour une dégradation. Sur un résultat, on publie l'écart en valeur.
Deux contrôles avant de dessiner
- Le budget total, toutes catégories confondues, sur 2026 : 84 334,47. C'est exactement la somme des 11 lignes du fichier. Un montant inférieur signale un TREATAS qui perd des mois, en général parce que AnneeMois n'a pas le même type des deux côtés.
- Le chiffre d'affaires 2025 : 22 460,00. Ajouté aux 23 800,00 de 2026, il redonne les 46 260,00 déjà réconciliés avec l'export de contrôle dans L'écart que le modèle ne voit pas. Sur 2025, la colonne budget reste vide : il n'existe pas de budget 2025, et le rapport ne doit pas en inventer un.
Si l'un des deux ne tombe pas, le problème est dans la mesure ou dans le type de la colonne, jamais dans les données.
Ce que le tableau raconte déjà
| Indicateur | Réel | Budget | Écart | Écart % |
|---|---|---|---|---|
| Chiffre d'affaires | 23 800,00 | 25 534,00 | -1 734,00 | -6,79 % |
| Charges d'exploitation | 64 735,50 | 58 073,72 | +6 661,78 | +11,47 % |
| dont charges de personnel | 54 600,00 | 50 819,40 | +3 780,60 | +7,44 % |
| Résultat d'exploitation | -40 935,50 | -32 539,72 | -8 395,78 | sans objet |
| Charges financières | 850,00 | 726,75 | +123,25 | +16,96 % |
| Résultat net | -41 785,50 | -33 266,47 | -8 519,03 | sans objet |
Le chiffre d'affaires est en retrait de 6,79 %, soit 1 734,00. Le résultat, lui, se dégrade de 8 519,03. L'essentiel de la dégradation vient donc des charges, pas des ventes : la masse salariale pèse à elle seule 3 780,60 d'écart.
Mars le montre mois par mois. 3 036,00 de prestations budgétées ne sont pas réalisées, et 2 100,00 de dotation aux amortissements sont passés sans que le budget ait rien prévu pour ce compte. Cette dernière ligne pose une question que le tableau, tel qu'il est construit, ne pose pas tout seul : que devient un réel qui n'a pas de budget ?
La réponse est moins évidente qu'il n'y paraît, et elle se cache dans le choix de l'axe d'analyse : La ligne que le budget a oubliée.
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 (CALCULATE, SUM, DIVIDE, TREATAS, VALUES, FORMAT) sont disponibles dans les versions actuelles ; les noms de menus peuvent changer au fil des mises à jour mensuelles.