Requête DAX - calcul

Bonjour à tous

Je viens chercher un peu d'aide sur une requête DAX dans PowerPivot.

Je suis un total débutant en DAX, mais c'est la suite logique à maitriser lorsqu'on fait déjà du VBA et du Power Query...

J'ai donc une requête, qui calcul mes consommations mensuelles pour des compteurs d'eau.

Mais j'ai des compteurs particuliers.

Certains ont une consommation forcée, la requête va donc me chercher ces compteurs dans une table dédiée et copie colle la conso forcée depuis ce tableau

D'autre ont une consommation égale à leur index mensuelle (car ma donnée d'entrée est déjà une consommation)

Et ces 2 là fonctionnent.

Ce sont les 2 types de compteurs suivants qui ne remontent pas.

La 1ère étape est de calculer les consommations des ces compteurs, via la 1ère partie de la requête qui calcul les conso mensuelles.

Puis :

J'ai un compteur qui a exactement la même conso qu'un autre, j'appel cette table T_COMPTEURS_COLLES car je veux que la requête me colle la conso d'un autre compteur sur lui.

C'est la partie VAR ConsommationCollees de la requête.

J'ai aussi un compteur qui est la différence entre les consommations de 2 autres compteurs (qui auront été calculées par la 1ère partie de la requête là aussi)
Après avoir calculé les conso, prendre les 2 consos des 2 compteurs concernés, effectuer la soustraction et me coller le résultat pour le compteur souhaité.

J'appelle cette table T_COMPTEURS_CALCULES

C'est la partie VAR ConsommationCalcPrincipal de la requête.

Les compteurs concernant donc VAR ConsommationCollees et VAR ConsommationCalcPrincipal ne remontent pas, pourtant les compteurs dont ils dépendent pour les valeurs ont bien été calculés et sont disponibles.

=VAR CurrentDate = T_DATAS_RELEVE[DATE MOIS RELEVE]
VAR CompteurPhysique = T_DATAS_RELEVE[N° COMPTEUR PHYSIQUE]

-- Calcul des consommations mensuelles pour les compteurs standards
VAR PreviousIndex =
    CALCULATE(
        MAX(T_DATAS_RELEVE[INDEX]);
        FILTER(
            T_DATAS_RELEVE;
            T_DATAS_RELEVE[N° COMPTEUR PHYSIQUE] = CompteurPhysique &&
            T_DATAS_RELEVE[DATE MOIS RELEVE] < CurrentDate
        )
    )

VAR ConsommationCalc = IF(
    ISBLANK(PreviousIndex);
    BLANK();
    T_DATAS_RELEVE[INDEX] - PreviousIndex
)

-- Remplacer les consommations par les index pour les compteurs de T_COMPTEURS_VOLUMES
VAR ConsommationVolumes =
    IF(
        NOT(ISBLANK(
            CALCULATE(
                MAX(T_DATAS_RELEVE[INDEX]);
                FILTER(
                    T_COMPTEURS_VOLUMES;
                    T_COMPTEURS_VOLUMES[N° COMPTEUR PHYSIQUE] = CompteurPhysique
                )
            )
        ));
        T_DATAS_RELEVE[INDEX];
        BLANK()
    )

-- Remplacer les consommations par les valeurs forcées pour les compteurs de T_COMPTEURS_FORCES
VAR ConsommationForces =
    CALCULATE(
        MAX(T_COMPTEURS_FORCES[CONSO FORCEE]);
        FILTER(
            T_COMPTEURS_FORCES;
            T_COMPTEURS_FORCES[N° COMPTEUR PHYSIQUE] = CompteurPhysique
        )
    )

-- Calcul des consommations principales et collées après les remplacements
VAR ConsommationFinale =
    SWITCH(
        TRUE();
        NOT(ISBLANK(ConsommationForces)); ConsommationForces;
        NOT(ISBLANK(ConsommationVolumes)); ConsommationVolumes;
        ConsommationCalc
    )

-- Utiliser les nouvelles valeurs pour calculer les consommations principales et collées
VAR ConsommationCalcPrincipal =
    SUMX(
        FILTER(
            T_COMPTEURS_CALCULES;
            T_COMPTEURS_CALCULES[N° COMPTEUR PHYSIQUE] = CompteurPhysique
        );
        CALCULATE(
            ConsommationFinale;
            FILTER(
                T_DATAS_RELEVE;
                T_DATAS_RELEVE[N° COMPTEUR PHYSIQUE] = T_COMPTEURS_CALCULES[CONSO principal] &&
                T_DATAS_RELEVE[DATE MOIS RELEVE] = CurrentDate
            )
        ) -
        CALCULATE(
            ConsommationFinale;
            FILTER(
                T_DATAS_RELEVE;
                T_DATAS_RELEVE[N° COMPTEUR PHYSIQUE] = T_COMPTEURS_CALCULES[CONSO à soustraire] &&
                T_DATAS_RELEVE[DATE MOIS RELEVE] = CurrentDate
            )
        )
    )

    VAR ConsommationCollees =
    SUMX(
        FILTER(
            T_COMPTEURS_COLLES;
            T_COMPTEURS_COLLES[N° COMPTEUR PHYSIQUE] = CompteurPhysique
        );
        CALCULATE(
            ConsommationFinale;
            FILTER(
                T_DATAS_RELEVE;
                T_DATAS_RELEVE[N° COMPTEUR PHYSIQUE] = T_COMPTEURS_COLLES[CONSO A COLLER] &&
                T_DATAS_RELEVE[DATE MOIS RELEVE] = CurrentDate
            )
        )
    )

RETURN
SWITCH(
    TRUE();
    NOT(ISBLANK(ConsommationForces)); ConsommationForces;
    NOT(ISBLANK(ConsommationCalcPrincipal)); ConsommationCalcPrincipal;
    NOT(ISBLANK(ConsommationCollees)); ConsommationCollees;
    NOT(ISBLANK(ConsommationVolumes)); ConsommationVolumes;
    ConsommationCalc
)

Je veux bien un peu d'aide là dessus, c'est peut être juste un problème de FILTER qui ne retrouve pas les bons compteurs mais je ne comprends pas pourquoi.

Merci beaucoup d'avance à ceux qui m'aideront en jetant un petit coup d'oeil

Hello,

Plutôt que de faire des formules DAX "compliquées" pourquoi ne pas faire les traitements via PowerQuery ? Puis après tu as juste à appeler tes données sans mesures complexes ? Et ça permettrait de ne pas alourdir ton modèle sur la restitution avec le recalcul de ces mesures.

@+

Bonjour Baroute78,
Merci pour ta réponse.

J'ai pris note de ta remarque et j'ai essayé milles choses sur powerquery, et bien que j'ai pu traiter le cas de certains compteurs particuliers en passant par plusieurs colonnes et des fusions de requêtes, je ne suis pas arrivé à avoir mes consommations "classiques", car ne sachant coder le langage M je dois utiliser les outils fournis par Power Query...

Enfin "simple" déjà faut savoir que le code DAX que j'ai fourni a été trouvé en utilisant des AI (ChatGPT et Mistral), que j'ai consciencieusement guidé dans leur écriture du code en leur fournissant de bonnes données d'entrées, un contexte et en les aiguillant parfois sur bouts de code à corriger. C'est pas encore parfait mais ça dégrossi pas mal !

Du coup même si c'est formateur, je reste débutant. Pourtant je suis sûr que le code en DAX est proche de la fin, si j'avais pu faire mes consommations sur powerquery, nul doute que j'aurais pu finir mes 2 compteurs qui ne fonctionnent pas en DAX car je suis quasi sûr que si cette partie ne fonctionne pas c'est parce que le code tel qu'il est là ne retrouve pas les valeurs dont il a besoin pour effectuer son calcul dans la "VAR ConsommationFinale", car les FILTER me semblent ok.
Si les valeurs étaient calculées en amont il les trouverait effectivement sans problème.

En tout cas je reste bloqué...

Rechercher des sujets similaires à "requete dax calcul"