Obtención del último mes de un calendario

En este escenario partimos de un calendario y queremos obtener el último mes incluido en él, con independencia de los filtros que puedan estar aplicándose al modelo de datos. Este calendario, en nuestro ejemplo, va a incluir -además del campo de fecha- un campo con el año, el mes... y un campo de texto en el que se ha concatenado el año y el mes de cada fecha (con formato de texto), asegurándonos de que el resultado tiene 6 caracteres de longitud (o, dicho con otras palabras, asegurándonos de que el mes aparece representado con dos cifras). Esto lo podemos hacer en el editor de consultas, creando una columna personalizada con el siguiente código M:

Number.ToText([Year]) &
Text.End(
    "0" &
    Number.ToText([Month])
, 2)

Creación de una columna personalizada con el mes y el año

De vuelta al editor de informes, comprobamos que nuestro último mes es -en el dataset que se está usando- el correspondiente a diciembre de 2019, lo que podemos confirmar de múltiples maneras, por ejemplo, en la vista de datos ordenando el calendario según el campo YearMonth:

Calendario

Nuestro objetivo es obtener ese último mes (o, más exactamente, el valor del campo 'Calendar'[YearMonth] mediante una medida.

Tratándose el campo 'Calendar'[YearMonth] de un campo de texto y estando formado por el año y el mes -en ese orden-, podemos recurrir a la función MAX para obtener el valor máximo que buscamos:

Last Month = MAX('Calendar'[YearMonth])

Valor máximo del campo

En la imagen anterior se ha llevado la medida [Last Month] a una tarjeta.

El problema es que nuestra medida [Last Month], tal y como está definida, se va a contextualizar, lo que supone que, en cuanto filtremos algo en alguna parte, el resultado devuelto no será el esperado. Por ejemplo, si llevamos el campo Calendar[Year] al lienzo con forma de segmentador y seleccionamos un año, nuestra medida va a devolver el último mes de dicho año:

Valor máximo del campo tras filtrar por año

Necesitamos asegurar que nuestro cálculo (el valor máximo del campo que nos interesa) se realiza en un contexto de filtro modificado: aquel que asegura que la columna 'Calendar'[YearMonth] incluye todos los valores. Para esto podemos recurrir a la función CALCULATE añadiendo como argumento la función ALL. Sin embargo, un error que podemos cometer es aplicar como filtro la expresión ALL('Calendar'[YearMonth]):

Last Month = 
CALCULATE(
    MAX('Calendar'[YearMonth]),
    ALL('Calendar'[YearMonth])
)

Valor máximo del campo considerando todos los valores del campo 'Calendar'[Month & Year]

Como vemos en la imagen anterior, la medida [Last Month] sigue devolviendo el último mes del año por el que estamos filtrando. Y esto es así porque cuando se considera el filtro ALL('Calendar'[YearMonth]), la tabla Calendar ya está siendo filtrada por la segmentación que hemos llevado a nuestro informe, que filtra el campo Calendar[Year]. Lo que necesitamos es asegurarnos de que toda la tabla Calendar se incluye en nuestro cálculo, para lo que basta con añadir como argumento de la función ALL el nombre de esta tabla:

Last Month =  
CALCULATE(
    MAX('Calendar'[YearMonth]),
    ALL('Calendar')
)

Valor máximo del campo considerando todos los valores de la tabla Calendar

Tal y como vemos, ahora nuestra medida [Last Month] sí está devolviendo el valor que queremos.

Funciones DAX involucradas
Dificultad
Baja
Enviado por admin el Mar, 19/05/2020 - 09:26