Seguimos con la transición de contextos, os prometo que aunque se podría hacer, no haré tantas entradas como películas de Fast & Furious J

Si no has leído la entrada anterior sobre la transición de contexto en medidas, te recomiendo que la leas antes de continuar. Te dejo el link aquí

Por resumir, antes de empezar, la función CALCULATE transforma un contexto de fila en un contexto de filtro. Es lo que conocemos como transición de contexto. Su definición en la conocida biblia de DAX (The Definitive Guide to DAX) dice así:

“La función CALCULATE invalida cualquier contexto de fila. Agrega automáticamente como argumentos de filtros todas las columnas que se están iterando actualmente en cualquier contexto de fila, filtrando su valor real en la fila que se está iterando”

¿Todo claro ya no? Pues nada, nos vemos en el siguiente post J  Ahora en serio, voy a intentar desgranar la definición mediante ejemplos.

Algunas veces el ver la transición de contexto a la primera no es una tarea sencilla ni mucho menos. 

Disponemos del siguiente modelo:


Vamos crear inicialmente una medida con el total de las ventas de mi tabla FactOnlineSales mediante el iterador SUMX y con el producto de la cantidad vendida y el precio unitario:

 

  


Ahora, vamos a la tabla Clientes y creamos una columna calculada con el total de las ventas calculado en el paso anterior:

 

 

Como podemos ver en la tabla, se ha creado una columna con el total de las ventas y con valores distintos por cada fila como podemos ver en la imagen inferior:

 

  


¿Qué está ocurriendo? ¿Hay un contexto de fila? Sí, sí hay un contexto de fila ya que las columnas calculadas de evalúan en un contexto de fila y no sólo de una única columna en este caso, sino que se evalúa entre todas las columnas de la tabla que contenga. Esto puede llevar que sea una evaluación costosa y pueda penalizar el rendimiento del modelo si la tabla es muy ancha y larga. Aprovecho a comentar una buena práctica:

Las tablas y columnas calculadas se calculan en tiempo de actualización. Es decir, se van a materializar al final del procesamiento. Hasta que no dispongamos de todo el modelo cargado, estas no se van a cargar. Esto es uno de los motivos por lo que no es recomendable abusar de este tipo de datos. Además, tienen peor ratio de compresión por lo que hacen que nuestro modelo engorde y ocupe más espacio.

Las métricas, van en el modelo, sí, pero estas se calculan cuando hacemos uso de ellas.

Por lo que si ante la duda de si crear una columna calculada o una medida, elegir siempre que se pueda una medida. Pero ¡OJO! Con esta buena práctica, no quiero induciros a que no creéis nunca ninguna columna calculada ya que puede darse el caso que, si no tengo una determinada columna, mi calculo en DAX se vuelve muy complejo.

Volviendo al tema que nos atañe en este post, ¿está ocurriendo una transición de contexto?

Sí, está ocurriendo una transición de contexto ya que, si recordáis del anterior post, cuando “llamamos” a una medida es lo mismo que si copiásemos el código de esa medida dentro de un CALCULATE sin argumentos (CALCULATE implícito). O lo que es lo mismo que si escribiésemos la medida de la siguiente manera:

 

 


 

Ahora, vamos a crear la columna calculada del total de ventas, pero sin invocar a la medida, directamente escribiéndola:

 

 

 

Y como podemos observar en el resultado de la columna:

 

 

 

El resultado es siempre el mismo, es decir, no está ocurriendo la transición de contexto y por tanto, no está calculando correctamente el total de ventas para cada cliente. 

 

¡Nos vemos en los datos!