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!