txfrazier
Necesito ayuda para calcular X días hacia atrás, excluyendo fines de semana y días festivos en Power BI Dax (columna calculada). Puedo llegar a una solución cuando necesito contar X días hacia adelante, excluyendo fines de semana y días festivos. Es la cuenta atrás donde me encuentro con problemas. Especialmente si los períodos de tiempo se cruzan tanto los fines de semana como los días festivos. Tengo una tabla de fechas que incluye las siguientes columnas:
- Fecha
- HolidayFlag (Verdadero/Falso)
- WorkdayFlag (Verdadero/Falso)
- Indicador de fin de semana (verdadero/falso)
- EsWorkday (1=Verdadero, 0=Falso)
También tengo una tabla que incluye fecha de vencimiento.
Si tuviera que calcular 2 días hábiles antes de la fecha de vencimiento, regresaría:
Fecha de vencimiento 2 días hábiles antes
26/11/2019 22/11/2019
27/11/2019 25/11/2019
28/11/2019 26/11/2019
29/11/2019 26/11/2019
30/11/2019 26/11/2019
1/12/2019 26/11/2019
2/12/2019 26/11/2019
3/12/2019 27/11/2019
4/12/2019 2/12/2019
Tabla de fechas
Tabla de fechas
Gracias
martynramsden
Hola @txfrazier
Esta solución se basa en que existe una relación entre su tabla de hechos y su tabla de fechas.
Intente crear una columna calculada de WorkingDayIndex en su tabla de fechas:
WorkingDayIndex =
VAR RowDate="Date"[Date]
VAR RowWD = 'Date'[IsWorkingDay]
VAR Index =
CALCULATE (
COUNTROWS ( 'Date' ),
'Date'[Date] <= RowDate,
'Date'[IsWorkingDay] = 1
) + 1
VAR Result =
IF (
RowWD = 0,
Index + 1,
Index
)
RETURN Result
Luego, en su tabla de hechos, cree una columna calculada de la siguiente manera:
Date -2 Working Days =
VAR SelDateWDIndex = RELATED ( 'Date'[WorkingDayIndex] )
VAR Result =
CALCULATE (
MAX ( 'Date'[Date] ),
FILTER (
ALL ( 'Date' ),
'Date'[WorkingDayIndex] = SelDateWDIndex -2
)
)
RETURN Result
Si necesita esto como una medida en lugar de una columna calculada, puede reemplazar la función RELACIONADA con VALOR SELECCIONADO.
Atentamente,
Martín
Si respondí a su pregunta, ayude a otros aceptándola como una solución.
txfrazier
En respuesta a martynramsden
Hola martyn,
Gracias por tu sugerencia. Todavía no lo he probado. Sin embargo, encontré una solución que funcionó para mí usando RANKX y LOOKUPVALUE. Probablemente haga lo mismo que tu sugerencia. 😀
Primero, en mi tabla de fechas, necesito determinar el «rango» para «días laborables» (excluyendo fines de semana y días festivos):
Clasificación del día de trabajo =
IF(‘Tabla de Fechas’ [WorkdayFlag]=VERDADERO,RANGOX(FILTRO(‘Tabla de fechas’, ‘Tabla de fechas'[WorkdayFlag]=VERDADERO),’Tabla de Fechas'[DateValue],,ASC))
Ahora puedo usar el «Rango» resultante para calcular mi Fecha de vencimiento menos 2 días hábiles sin hacer ningún cambio en mi «Tabla de fechas» usando LOOKUPVALUE en mi Tabla de hechos. Al hacer N Variable, puedo cambiar rápidamente la cantidad de días para contar hacia atrás.
Fecha de vencimiento menos N días laborables =
Var N = 2
Regreso
CALCULAR(MAX(‘Tabla de Fechas'[DateValue]), FILTRO (‘Tabla de fechas’, ‘Tabla de fechas'[WorkDayRank]=VALOR DE BUSQUEDA(‘Tabla de Fechas'[WorkDayRank],[DateValue]’Tabla de hechos'[DueDate])-NORTE))
Con suerte, esto será útil para otros y también tendré la oportunidad de experimentar con su solución. (Pero ya sabes cómo funciona, una vez que encuentras una solución que funciona…)
Saludos,
Tomás