Visão geral
É algo difícil de pedir ao PowerBI, portanto, pode ser difícil encontrar uma abordagem organizada.
O maior problema é que o modelo de dados do PowerBI não suporta o conceito de contagem em execução - pelo menos não da maneira que fazemos no Excel. No Excel, uma coluna pode fazer referência a valores que ocorrem na 'linha anterior' da mesma coluna e, em seguida, ser ajustada por algumas 'alterações diárias' listadas em uma coluna diferente.
O PowerBI só pode imitar isso adicionando todas as alterações diárias em algum subconjunto de linhas. Pegamos o valor da data em nossa linha atual e criamos uma tabela filtrada em que todas as datas são inferiores à data dessa linha atual e, em seguida, resumimos todas as alterações diárias desse subconjunto. Isso pode parecer uma diferença sutil, mas é bastante significativa:
Isso significa que não há como "substituir" nosso total de rodadas. A única matemática que está sendo feita está acontecendo na coluna que contém alterações diárias - a coluna que contém 'total em execução' é apenas um resultado - nunca é usada no cálculo de nenhuma linha subsequente.
Devemos abandonar o conceito de 'reset' e, em vez disso, imaginar fazer uma coluna que contenha um valor de 'ajuste'. Nosso ajuste será um valor que pode ser incluído para que, quando as condições descritas forem atendidas, o total de saldos e ajustes diários totalize 1.
Se observarmos a execução calculada fornecida pelo OP, veremos que o valor de nossa execução total em um dia 'não útil', imediatamente antes de um dia 'útil', nos fornece a quantidade necessária que, se revertida, somará zero e aumentar o número de rodadas em cada dia útil seguinte em um. Este é o nosso comportamento desejado (com um problema a ser descrito posteriormente).
Resultado
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"
))
Ajuda a saber a diferença entre os contextos de linha e filtro e como o EARLIER opera para seguir esse cálculo. Nesse cenário, você pode pensar em "EARLIER" como significando 'esta referência aponta para o valor na linha atual "e, caso contrário, uma referência aponta para toda a tabela retornada por" ALLEXCEPT (Deixar, Deixar [Id]). " Dessa forma, encontramos os locais em que a linha atual tem o tipo "Working" e a linha do dia anterior tem outro tipo.
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])
))
Este cálculo imita um tipo de operação 'preenchimento'. Ele diz: "Ao examinar todas as linhas cuja data é anterior à data nesta linha, retorne o maior valor em 'Data mais recente antes do trabalho".
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])
))
Agora que todas as linhas têm um campo explicando para onde encontrar o saldo diário a ser usado como ajuste, podemos apenas procurar na tabela.
Adjusted Daily Balance = Leave[Running Daily Balance] - Leave[Daily Balance Adjustment]
E, finalmente, aplicamos o ajuste ao nosso total corrente para o resultado final.
O problema
Essa abordagem falha ao abordar que a contagem não deve ser redefinida, a menos que o saldo diário em execução esteja abaixo de zero. Eu já me provei errado antes, mas diria que isso não pode ser realizado apenas no DAX, porque cria uma dependência circular. Essencialmente, você faz um requisito: use o valor agregado para determinar o que deve ser incluído na agregação.
Então é isso que eu posso te trazer. Espero que ajude.