Visión general
Es un desafío pedirle a PowerBI que haga, por lo que un enfoque ordenado puede ser difícil de encontrar.
El mayor problema es que el modelo de datos de PowerBI no admite el concepto de una cuenta corriente, al menos no de la forma en que lo hacemos en Excel. En Excel, una columna puede hacer referencia a valores que ocurren en la 'fila anterior' de esa misma columna y luego ser ajustados por algún 'cambio diario' que aparece en una columna diferente.
PowerBI solo puede imitar esto sumando todos los cambios diarios en algún subconjunto de filas. Tomamos el valor de la fecha en nuestra fila actual y creamos una tabla filtrada donde todas las fechas son menores que la fecha de esta fila actual, y luego resumimos todos los cambios diarios de ese subconjunto. Esto puede parecer una sutil diferencia, pero es bastante significativo:
Esto significa que no hay forma de 'anular' nuestro total acumulado. La única matemática que se está haciendo está sucediendo en la columna que contiene cambios diarios: la columna que contiene 'total acumulado' es solo un resultado, nunca se usa en el cálculo de una fila posterior.
Debemos abandonar el concepto de 'reinicio' y, en su lugar, imaginar hacer una columna que contenga un valor de 'ajuste'. Nuestro ajuste será un valor que se puede incluir para que cuando se cumplan las condiciones descritas, el total de los saldos diarios y los ajustes sumen 1.
Si observamos la ejecución calculada dada por OP, vemos que el valor de nuestro total acumulado en un día 'no laborable' justo antes de un día 'laborable' nos da esa cantidad necesaria que, si se invierte, sumaría cero y hacer que el total acumulado en cada día hábil siguiente aumente en uno. Este es nuestro comportamiento deseado (con un problema que se describirá más adelante).
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"
))
Ayuda a conocer la diferencia entre los contextos de fila y filtro y cómo opera EARLIER para seguir este cálculo. En este escenario, puede pensar que "ANTERIOR" significa 'esta referencia apunta al valor en la fila actual "y, de lo contrario, una referencia apunta a toda la tabla devuelta por" ALLEXCEPT (Leave, Leave [Id]) ". De esta manera, encontramos los lugares donde la fila actual tiene el tipo "Working" y la fila del día anterior tiene otro 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 un tipo de operación de "relleno". Dice: "Al mirar todas las filas cuya fecha es anterior a la fecha en ESTA fila, devuelve el valor más grande en 'Fecha más reciente antes del trabajo".
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])
))
Ahora que cada fila tiene un campo que explica a dónde ir para encontrar el saldo diario para usar como nuestro ajuste, podemos ir a buscarlo desde la tabla.
Adjusted Daily Balance = Leave[Running Daily Balance] - Leave[Daily Balance Adjustment]
Y finalmente aplicamos el ajuste a nuestro total acumulado para el resultado final.
La cuestión
Este enfoque no aborda que el recuento no se debe restablecer a menos que el saldo diario en ejecución sea inferior a cero. Se me demostró que estaba equivocado antes, pero diría que esto no se puede lograr solo en DAX porque crea una dependencia circular. Esencialmente, usted hace un requisito: use el valor agregado para determinar qué debe incluirse en la agregación.
Así que hasta aquí puedo llevarte. Espero eso ayude.