Las transiciones de contexto, son una característica o fenómeno con el que cuenta el lenguaje DAX y es importante saber responder a las siguientes preguntas sobre el mismo “¿qué es? y ¿cómo se produce?“

¿Y por qué es importante saber responder a estas dos preguntas? Pues muy sencillo, para utilizarlo en aquellos casos en los que lo necesitemos y evitarlo en los casos en los que no sea necesario. Así de simple ¿a qué sí? J

Para ver qué es la transición de contexto, voy a explicarlo con un ejemplo práctico.  Tenemos la siguiente métrica:

 

 

 

Antes de seguir, otra pregunta (ya sabéis que me gusta preguntar…), la parte recuadrada en amarillo de la imagen inferior, que corresponde a la media (AVERAGE), ¿es una métrica o no?

 

  


No, no es una métrica, es una expresión. Y es la expresión que estamos utilizando para calcular el precio medio unitario. Apunte: Recordad que la métrica va entre corchetes [ … ] y tiene un nombre.

Y os estaréis preguntando, ¿por qué nos pregunta si es una métrica? ¿Qué tiene que ver con las transiciones de contexto?

Por lo siguiente, imaginar que yo cambio esa expresión por la medida que calcula la media del precio unitario tal que así:

 

 

¿El resultado de la medida final será el mismo? No, no será el mismo y lo vamos descubrir a continuación, pero ¿por qué no es el mismo resultado?

Principalmente pensar que cuando llamamos a una medida, es lo mismo que si copiásemos el código de esa medida dentro de un CALCULATE sin argumentos, es decir, la medida implícita sería la siguiente:

 

  

 

Ahora bien, cuando yo hago uso de la función CALCULATE en un contexto de fila se genera una transición de contexto. ¿Y qué es? Es ese fenómeno, en el que el contexto de filtro en el que la métrica se calcula, es equivalente o se iguala al contexto de fila actual. Como dice un buen amigo mío, “vamos a meternos en harina para verlo.”

 

Sin transición de contexto

 

Como hemos comentado, la parte del AVERAGE es una expresión, que se calcula o evalúa en el contexto de filtro, para el ejemplo que estamos siguiendo, es donde están todos los productos de la tabla DimProduct:


Y comparamos ese valor contra cada uno de los precios de la fila de la tabla de productos para ver si son mayores o menores. ¿Entendido? 


Vamos a verlo con valores:


Como vemos en la imagen superior, para el contexto de filtro (recuadro naranja), tengo todos los valores de la columna PrecioUnitario (UnitPrice), para este caso son 5 € y 10 €. ¿Qué calculo en la media? La media sobre esos dos valores de la columna UnitPrice. Para este caso 7,5 €


¿Y contra que lo comparo? Contra el primer valor que tengo en la primera fila de la tabla DimProduct en la columna UnitPrice correspondiente al contexto de fila (recuadro azul), que para este ejemplo es 5€: 


Y posteriormente lo calculo contra el siguiente valor, que es 10€: 

 

Es decir, como resultado está métrica nos devolverá un 1 correspondiente a la línea del producto cuyo precio unitario es 10€ y es mayor a la media del UnitPrice que es 7,5€.


Con transición de contexto


Volvamos la métrica vista hace un momento en la que el CALCULATE envolvía al AVERAGE: 


Como hemos comentado, nos es la misma métrica que la anterior ya que tenemos un CALCULATE que envuelve el AVERAGE. 


¿Entonces qué ocurre en esta métrica?   

 

¿Se evalúa dentro del contexto de filtro 1? Pues que con la acción de envolver el AVERAGE con la función CALCULATE, o bien, si invocásemos a la métrica directamente que contendría ese código del AVERAGE, se está creando otro contexto de filtro que es equivalente al contexto de fila: 


 

¿Qué valor nos devolverá la métrica? .... BLANK(). ¿Por qué? Vamos analizarlo paso a paso.


Para el contexto de filtro 1, tenemos los dos valores (5€ y 10€). Pero con el CALCULATE que estoy envolviendo el AVERAGE, en lugar de calcular la media sobre los dos valores de la tabla, se está generando una transición de contexto. ¿Qué quiere decir? Que el contexto de filtro donde se evalúa el AVERAGE, es equivalente al contexto de fila actual. Es decir, voy a calcular la media sobre el mismo producto. Por tanto al ser una comparación, nunca va a encontrar un valor, de ahí que nos devuelva BLANK(). 


 

Conclusión

 

Por resumir un poco lo que he intentado explicar, si llamamos a una medida dentro de una expresión en vez de generar la expresión en sí, es lo mismo que si copiásemos el código de la medida dentro de la función CALCULATE.

 

La función CALCULATE en un contexto de fila genera una transición de contexto donde el contexto de filtro del CALCULATE se convierte en el equivalente del contexto de fila.

 

La transición de contexto no es un tema complejo como tal y no hay que tenerle miedo, pero desde mi punto de vista lo complejo es detectar esas medidas implícitas que genera DAX automáticamente. ¿Y cómo las detectamos más facilmente? ¡Trabajando sin miedo con DAX!

 

¡Nos vemos en los datos!