Al introducir en el modelo de Power Pivot, varias tablas y las relaciones entre ellas, el Evaluation Context (Contexto de Evaluación), se comporta de forma totalmente diferente a lo esperado.

Es muy importante, saber que ocurre con los cálculos cuando hay varias tablas y relaciones implicadas en el modelo de Power Pivot.

Row Context con Múltiples Tablas

Vamos a añadir una nueva tabla a nuestro modelo de ejemplo llamada Canales, en la cual hay una campo Porcentaje de descuento que se aplica a cada canal, sería la siguiente:

Contexto de Evaluación con Power BI

Tabla Canales de Power Pivot

Añadimos una nueva tabla a nuestro modelo llamada Órdenes, la cual tiene una relación con la tabla Canales a través del campo Canal de ambas tablas.

La tabla tiene estos valores:

Modelo Power Pivot

Tabla órdenes de Power Pivot

Tenemos una relación one-to-many (uno a muchos) entre la tabla Canales y la tabla Órdenes, por cada fila en la tabla Canales habrá cero, uno o más Órdenes en la tabla Órdenes. Por cada fila en la tabla Órdenes habrá cero o una fila correspondiente en la tabla Canales. Si una fila en Órdenes no tiene su correspondiente canal en la tabla Canales, se añade una fila virtual o lo que se llama un blank member en la tabla Canales o tabla de lookup para simular la zero correspondencia. Es lo que en términos de SQL se llama outer join entre dos tablas.

Se puede utilizar la función ALLNOBLANKROW en lugar de ALL para retornar todos los valores de una tabla o column excepto el blanco virtual en el caso de que existiera.

Relación tablas Power Pivot Órdenes - Canales

Relación Órdenes – Canales

 

 

 

Lo primero que se nos viene a la cabeza es crear una medida que calcule la cantidad descontada para cada transacción en la tabla Órdenes. Así que lo primero que hacemos es definir la fórmula:

Ordenes[CantidadDescontada] = Ordenes[Cantidad] * (1 - Canales[Descuento])

Error de Row Context entre tablas de Power BI

Error de Contexto entre tablas de Power Pivot.

 

 

 

 

Este error se produce cuando intentas crear una nueva columna en la tabla Órdenes, bajo el contexto de fila de ésta tabla, con una columna que se encuentra en la tabla Canales. El contexto de fila se encuentra en la tabla Ordenes y la medida que se crea utiliza una columna de la tabla Canales. Si queremos leer el valor de una columna de la tabla Canales (la cual no tiene el row context, contexto de fila y además existe una relación uno a muchos con la tabla Ordenes), debemos utilizar la función RELATED.

Desde un punto de vista conceptual, al utilizar la función RELATED, estamos creando una tabla virtual con los campos de ambas tablas desnormalizada, como si fuese un JOIN de SQL.

El resultado después de utilizar la función RELATED es el siguiente:

Función related

Resultado después de aplicar la función related entre dos tablas.

 

 

 

 

 

La función RELATED recibe una columna de la tabla de lookup o maestra atravesando la relación entre ambas tablas. La función RELATED, evalua la columna pasada como parámetro y le aplica el contexto de fila siguiendo la relación existen, es decir, evalúa la columna atravesando la relación, esto lo hace en un lado de la relación, en la tabla de lookup.

Nota:

El contexto de fila, está limitado a una fila única, las relaciones entre dos tablas, por defecto, no propagan el contexto de fila entre tablas. La función RELATED, se utiliza para propagar el efecto de Row Context a la tabla de lookup, siempre que exista una relación válida entre tablas.

Por otra parte, en el otro lado de la relación, podríamos querer calcular el conjunto de filas de la tabla Órdenes relacionadas con cada uno de los canales de la tabla Canales. Es decir, cuantas filas u órdenes tiene cada uno de los canales.

En la tabla de lookup podemos añadir la siguiente medida o fórmula:

Cuenta-Ordenes-Canales = COUNTROWS(  RELATEDTABLE( Ordenes ) )

Función RELATEDTABLE

Función RELATEDTABLE, opuesta a la relación