Visualización de los días de ocupación de un recurso

Un interesante escenario es aquel que implica una tabla de datos que incluye la "ocupación" de unos ciertos recursos indicando la fecha de comienzo y la de finalización de la ocupación, teniendo como objetivo la visualización de una gráfica en la que se muestre el calendario y los días en los que cada recurso está ocupado o disponible.

Para resolver este escenario partimos de una tabla ("Allocations") en la que se muestra el recurso en cuestión (1, 2 o 3 en nuestro ejemplo), y las fechas de inicio y fin de la ocupación:

Datos de ocupación de los recursos

Partimos también de un calendario ("Calendar") que, en este ejemplo, está limitado a la quincena dentro de la cual se producen las ocupaciones de cada recurso:

Calendario

Si generamos un gráfico a mano -usando Excel, por ejemplo-, la visualización de las ocupaciones de cada recurso tendría el siguiente aspecto:

Gráfico de ocupación

El objetivo es llegar a una visualización semejante que se genere de forma automática.

Obsérvese que si cruzamos la tabla "Allocations" (que incluye los períodos en los que cada recurso está reservado) y el calendario mediante la función GENERATE, por ejemplo (también valdría la función CROSSJOIN pues, en este caso, no estamos haciendo uso del contexto de fila generado por las filas de la primera tabla), tendremos todas las posibles combinaciones entre las filas de ambas:

Table = 
    GENERATE(
        Allocations;
        'Calendar'
    )

Cruce de la tabla de reserva de recursos y del calendario

Y de esta tabla, es sencillo quedarnos solo con los días en los que el recurso está reservado si seleccionamos apenas aquellas filas en las que el campo Date sea mayor o igual a Start y menor o igual a End, para lo que recurrimos a la función FILTER:

Table = 
    FILTER(
        GENERATE(
            Allocations;
            'Calendar'
        );
        'Calendar'[Date] >= Allocations[Start] && 'Calendar'[Date] <= Allocations[End]
    )

Tabla de reserva de recursos por día

En este punto podríamos obviar los campos Start y End, que ya no aportan nada, para lo que podemos recurrir a la función SELECTCOLUMNS que nos permite escoger qué campos queremos seleccionar:

Table = 
    SELECTCOLUMNS(
        FILTER(
            GENERATE(
                Allocations;
                'Calendar'
            );
            'Calendar'[Date] >= Allocations[Start] && 'Calendar'[Date] <= Allocations[End]
        );
        "Id"; Allocations[Id];
        "Resource"; Allocations[Resource];
        "Date"; 'Calendar'[Date]
    )

Tabla de reserva de recursos por día

Para visualizar el resultado vamos a recurrir a la visualización "as Timeline" descargable desde el marketplace. Una vez llevada al lienzo su configuración es la siguiente:

Configuración de la visualización "as Timeline"

Y la visualización queda de la siguiente forma:

Visualización mostrando las reservas por día

Podemos comparar el resultado con el esquema realizado a mano:

Gráfico de ocupación

También habríamos podido aprovechar el contexto de fila creado por la función GENERATE para incluir el filtro dentro de la propia función, de la siguiente manera:

Table = 
    SELECTCOLUMNS(
        GENERATE(
            Allocations;
            FILTER(
                'Calendar';
                'Calendar'[Date] >= Allocations[Start] && 'Calendar'[Date] <= Allocations[End]
            )
        );
        "Id"; Allocations[Id];
        "Resource"; Allocations[Resource];
        "Date"; 'Calendar'[Date]
    )

Funciones DAX involucradas
Enviado por admin el Lun, 01/07/2019 - 18:38