Aperçu
Il est difficile de demander à PowerBI de le faire, donc une approche bien rangée peut être difficile à trouver.
Le plus gros problème est que le modèle de données de PowerBI ne prend pas en charge le concept d'un décompte en cours d'exécution - du moins pas comme nous le faisons dans Excel. Dans Excel, une colonne peut référencer des valeurs qui se produisent dans la `` ligne précédente '' de cette même colonne, puis être ajustée par certains `` changements quotidiens '' répertoriés dans une autre colonne.
PowerBI ne peut imiter cela qu'en additionnant toutes les modifications quotidiennes sur un sous-ensemble de lignes. Nous prenons la valeur de date dans notre ligne actuelle et créons un tableau filtré où toutes les dates sont inférieures à la date de cette ligne actuelle, puis résumons toutes les modifications quotidiennes de ce sous-ensemble. Cela peut sembler être une différence subtile, mais elle est assez significative:
Cela signifie qu'il n'y a aucun moyen de «remplacer» notre total cumulé. Le seul calcul en cours se produit sur la colonne contenant les modifications quotidiennes - la colonne contenant le «total cumulé» n'est qu'un résultat - elle n'est jamais utilisée dans le calcul d'une ligne ultérieure.
Nous devons abandonner le concept de «réinitialisation» et imaginer à la place de créer une colonne contenant une valeur «d'ajustement». Notre ajustement sera une valeur qui peut être incluse de sorte que lorsque les conditions décrites sont remplies, le total des soldes et ajustements quotidiens sera égal à 1.
Si nous regardons le calcul calculé donné par OP, nous voyons que la valeur de notre total cumulé un jour «non ouvrable» juste avant un jour «ouvrable» nous donne le montant nécessaire qui, s'il était inversé, serait égal à zéro et faire augmenter le total cumulé de chaque jour ouvrable suivant. C'est notre comportement souhaité (avec un problème qui sera décrit plus loin).
Résultat
Most Recent Date Prior to Work =
CALCULATE(
Max(Leave[Date]),
FILTER(
ALLEXCEPT(Leave, Leave[Id]),
Leave[Date] = EARLIER(Leave[Date]) -1 && Leave[Type] <> "Working" && Earlier(Leave[Type]) = "Working"
))
Il permet de connaître la différence entre les contextes de ligne et de filtre et comment EARLIER fonctionne pour suivre ce calcul. Dans ce scénario, vous pouvez penser à «EARLIER» comme signifiant «cette référence pointe vers la valeur de la ligne actuelle» et sinon une référence pointe vers la table entière renvoyée par «ALLEXCEPT (Leave, Leave [Id])». façon, nous trouvons les endroits où la ligne actuelle a le type "Working" et la ligne de la veille a un autre type.
Most Recent Date Prior to Work Complete =
CALCULATE(
Max(Leave[Most Recent Date Prior to Work]),
FILTER(
ALLEXCEPT(Leave, Leave[Id]),
Leave[Date] <= EARLIER(Leave[Date])
))
Ce calcul imite un type d'opération de «remplissage vers le bas». Il indique: «Lorsque vous examinez toutes les lignes dont la date est antérieure à la date sur CETTE ligne, renvoyez la plus grande valeur dans« Date la plus récente avant le travail ».
Daily Balance Adjustment =
CALCULATE(
SUM(Leave[Running Daily Balance]),
FILTER(
ALLEXCEPT(Leave, Leave[Id]),
Leave[Date] = EARLIER(Leave[Most Recent Date Prior to Work Complete])
))
Maintenant que chaque ligne a un champ expliquant où aller pour trouver le solde quotidien à utiliser comme ajustement, nous pouvons simplement le rechercher dans le tableau.
Adjusted Daily Balance = Leave[Running Daily Balance] - Leave[Daily Balance Adjustment]
Et enfin, nous appliquons l'ajustement à notre total cumulé pour le résultat final.
Le problème
Cette approche ne tient pas compte du fait que le décompte ne doit pas être réinitialisé à moins que le solde quotidien en cours soit inférieur à zéro. J'ai déjà eu tort, mais je dirais que cela ne peut pas être accompli uniquement dans DAX car cela crée une dépendance circulaire. Essentiellement, vous faites une exigence: utilisez la valeur agrégée pour déterminer ce qui doit être inclus dans l'agrégation.
Voilà pour autant que je puisse vous amener. J'espère que cela aide.