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

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.

Frise janvier-avril 2026 : les écritures réelles tombent sur des jours précis, le budget est posé en quatre blocs mensuels, raccordés par TREATAS
Le réel vit au jour, le budget au mois. On ne les relie pas par une date : on les raccorde au moment du calcul, par le mois.

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.

CompteLibelléMoisBudget
601000Achats de matières premières2026-012 688,42
606100Fournitures non stockables2026-021 377,50
613000Locations2026-042 966,40
627000Services bancaires et assimilés2026-03222,00
641000Rémunérations du personnel2026-0119 440,00
641000Rémunérations du personnel2026-0223 085,00
645000Charges de sécurité sociale2026-018 294,40
661000Charges d'intérêts2026-04726,75
701000Ventes de produits finis2026-0111 000,00
701000Ventes de produits finis2026-024 598,00
706000Prestations de services2026-039 936,00
Total84 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 :

DeVersCardinalitéSens du filtre
Fait_Ecritures[Compte]Dim_PlanComptable[Compte]plusieurs à ununique
Fait_Ecritures[Journal]Dim_CentreCouts[Journal]plusieurs à ununique
Fait_Ecritures[Date]Dim_Calendrier[Date]plusieurs à ununique
Fait_Budget[Compte]Dim_PlanComptable[Compte]plusieurs à ununique
Schéma en étoile : Fait_Ecritures et Fait_Budget partagent Dim_PlanComptable, seule Fait_Ecritures est reliée à Dim_Calendrier
Deux tables de faits partagent le plan comptable. Une seule est reliée au calendrier, et c'est voulu.
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

  1. 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.
  2. 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.

  1. 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 :

MoisCA réelCA budgetRésultat réelRésultat budgetÉcart
2026-0112 500,0011 000,00-22 800,50-19 422,82-3 377,68
2026-024 400,004 598,00-19 550,00-19 864,50+314,50
2026-036 900,009 936,004 615,009 714,00-5 099,00
2026-04-4 050,00-3 693,15-356,85
Total23 800,0025 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

  1. 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.
  2. 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à

IndicateurRéelBudgetÉcartÉcart %
Chiffre d'affaires23 800,0025 534,00-1 734,00-6,79 %
Charges d'exploitation64 735,5058 073,72+6 661,78+11,47 %
dont charges de personnel54 600,0050 819,40+3 780,60+7,44 %
Résultat d'exploitation-40 935,50-32 539,72-8 395,78sans objet
Charges financières850,00726,75+123,25+16,96 %
Résultat net-41 785,50-33 266,47-8 519,03sans 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.