Cálculo hacia atrás de X días, excluyendo fines de semana y días festivos en Power BI Dax (columna calculada)

Un usuario Pregunto ✅

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 fechasTabla 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))

2019-12-31_13-53-38.jpg

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))

2019-12-31_14-16-23.jpg

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

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *