Marcado de días como laborables o no laborables

La adición de esta información a nuestra tabla de calendario -si cada uno de los días es o no laborable- puede resultar de gran utilidad de muchos casos. Planteémonos, en primer lugar, el caso más sencillo: el marcado de cada uno de los días en función del día de la semana de que se trate. Es decir, marquemos como laborables los días entre el lunes y el viernes, ambos incluidos, y como no laborables el sábado y el domingo. Para ello vamos a utilizar la función WEEKDAY que acepta como argumento una fecha y devuelve un número identificando el día de la semana correspondiente.

Partimos de una tabla "Calendar" que incluye únicamente una columna con las fechas:

Tabla calendario

Creamos una nueva columna calculada en la que extraemos el número de día de la semana:

Nº de día de la semana =
    WEEKDAY('Calendar'[Date];2)

En este caso se ha optado por la opción 2 (de las tres que se ofrecen), opción que asigna el valor 1 al lunes y el 7 al domingo:

Calendario incluyendo el número de día de la semana

Podemos comparar los nombres de los días de la semana que se muestran en la función Date con el valor mostrado en la columna recién creada para confirmar que el criterio es el comentado. Así, por ejemplo, la primera fecha mostrada en la del jueves 1 de enero de 2015, día al que se asigna correctamente el valor 4 en la recién creada columna calculada.

En realidad no hubiera sido necesario crear esta columna, apenas nos sirve para confirmar los valores que reciben cada uno de los días. Lo que sí es necesario en la creación de una columna -a la que podemos llamar Día laboral- que, por ejemplo, contenga el booleano TRUE cuando el día sea laboral, y el booleano FALSE cuando no lo sea. Y para esta asignación vamos a comparar el valor numérico asignado por la función WEEKDAY a cada uno de los días: cuando tome los valores 1, 2, 3, 4 o 5, se asignará el valor TRUE, y cuando tome los valores 6 o 7, FALSE. Lógicamente estos valores son los correctos solo si estamos usando la función WEEKDAY con la mencionada opción 2. Si escogiésemos otra opción, habría que escoger las cifras adecuadamente:

Día laboral = 
    IF(
        WEEKDAY('Calendar'[Date]; 2) < 6;
        TRUE();
        FALSE()
    )

Calendario con los días marcados como laborables o no laborables

En un segundo paso, si quisiéramos añadir como días no laborables otras festividades, podríamos recurrir a mantener otra tabla con este listado. Por ejemplo, supongamos que las fechas no laborables adicionales son las mostradas en la siguiente tabla ("Festivos"):

Tabla de festivos

Relacionamos ambas tablas:

Tablas relacionadas

Y, a continuación, modificamos el código que hemos creado de forma que asigne el valor TRUE si y solo si el número de día es menor que 6 y no aparece en la tabla de festivos. Esta última condición puede ser escrita de diversas maneras. Por ejemplo, contando el número de filas de la tabla Festivos asociada a cada fecha del calendario: cuando la fecha en cuestión no esté incluida en Festivos, esta tabla no contendrá ningún registro. Y cuando esté, tendrá uno:

Día laboral = 
    IF(
        WEEKDAY('Calendar'[Date]; 2) < 6 && COUNTROWS(RELATEDTABLE(Festivos)) = 0;
        TRUE();
        FALSE()
    )

El resultado es el mostrado en la siguiente imagen:

Calendario considerando los festivos

Podemos ver que los días 6 y 13 de enero han sido marcados como "no laborables", tal y como esperábamos.

Por supuesto, este escenario podría hacerse más complejo para mostrar diferentes columnas para diferentes localidades o países, etc.

DAX functions involved
Submitted by admin on Sun, 07/14/2019 - 09:20