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)
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:
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])
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:
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])
)
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')
)
Tal y como vemos, ahora nuestra medida [Last Month] sí está devolviendo el valor que queremos.