Hemos visto en artículos anteriores que existen dos tipos de contexto para informes DAX, row contexts y filter contexts. El row contexts vimos que se puede crear a través de programación con iteraciones en fórmulas DAX y que el filter contexts se puede ignorar con las funciones ALL, he dicho bien, se puede ignorar no cambiar. ¿Que significa esto? lo vemos con un ejemplo. La siguiente expresión:

[Margen de Ventas] :=
SUMX (
    ALL ( Ventas );
Ventas[VentasTotales] * AVERAGE ( Ventas[PorcentajeVentas] )
)

La función ALL ignora el contexto de filtro actual pero no se ignora para el resto de las funciones de la fórmula. Aquí tenemos un problema, la función AVERAGE seguirá teniendo el contexto de filtro que se aplique desde el exterior. Es decir, si hemos filtrado el informe, este filtro se aplicará a la función AVERAGE, pero no a SUMX.

En este punto para que todas las partes de la fórmula utilicen el mismo contexto de filtro, tenemos las función CALCULATE (AQUÍ TENEMOS A NUESTRA SALVACIÓN) .

Con un ejemplo, vamos a utilizar la función CALCULATE y estudiar todas las posibilidades. Supongamos el siguiente informe, partiendo de otro informe anterior.

Uso de la función CALCULATE con DAX

 

 

El informe tiene una columna que calcula el porcentaje de ventas y el total de ventas. Si creamos la siguiente expresión DAX:

PorcentajeDeVentas =
DIVIDE (
    SUM ( ‘Ventas Productos'[Ventas] );
    SUMX ( ALL ( ‘Ventas Productos’ ); ‘Ventas Productos'[Ventas] )
)

 

El numerador, son las ventas de productos, el denominador ignora el contexto de filtro y suma todas las ventas de la tabla. Por este motivo, el porcentaje se hace sobre el total de ventas. La fórmula realiza un cálculo equivocado ya que aunque utilices algún filtro, siempre suma en el denominador por el porcentaje total de toda la tabla.

Comprendiendo el Filter Context – Contexto de Filtro

Antes de continuar con la explicación de la función CALCULATE, vamos a hacer un pequeño inciso para entender el concepto de Filter Context – Contexto de Filtro, es un concepto complejo al cual hay que dedicar varios párrafos y ejemplos. De forma progresiva, vamos a ir añadiendo datos y explicando el concepto para comprender del todo el concepto de Power BI Filter Context. Nos va a llevar bastante explicar el concepto por esto recomiendo que se leen todos los artículos que se publiquen cada día.

Hemos definido el concepto de filter context como: «un conjunto de filtros aplicados a un modelo, el cual cambia las filas visibles de la base de datos en los informes». Aunque es una buena definición, se queda corta ya que VertiPaq (el motor de base de datos con el que trabaja DAX) es una base de datos orientada a columnas. Por lo tanto, en lugar de pensar en tablas, tenemos que pensar en términos de columnas.

Por ejemplo, si tenemos un tabla llamada Clientes en nuestro modelo Power Pivot con cinco campos, VertiPaq en lugar de ver una tabla en el modelo, ve cinco campos individuales asociados a una tabla Clientes. Si creamos un segmentador o slicer sobre uno de los campos, se filtra el campo, sin embargo, vemos que todos los campos de la tabla se filtran esto ocurre porque los campos están asociados a la tabla.

Se puede considerar el filtro como un bitmap de valores de una columna o una lista de valores activos. Por tanto, tenemos dos puntos importantes a recordar:

  • Un filtro es un conjunto de valores activos sobre una columna.
  • Un filtro se aplica a una columna sólo.

No es la definición de Filter Context pero por ahora tenemos una definición parcial. Con esto en mente podemos iniciar la función CALCULATE y como puede modificar el filter context.