Si has programado o tienes nociones de programación, estarás acostumbrado a no tener en cuenta el orden de evaluación de los parámetros de una función. Sin embargo, en la funciones CALCULATE y CALCULATETABLE es importante tener en cuenta el orden de evaluación anidado de los parámetros de las funciones, hay que aplicar una cierta recursividad del nivel más profundo al nivel más visible.
Por ejemplo, en la siguiente expresión:
Medida :=
CALCULATETABLE (
‘Ventas por Internet’;
‘Ventas por Internet'[Precio Unitario] > 2
)
Con CALCULATETABLE, se evalúa primero la condición y la tabla Ventas por Internet es evaluada después de la condición, el contexto de filtro se modifica por la condición. El problema se complica cuando anidamos funciones unas dentro de otras, por ejemplo:
Medida := CALCULATETABLE( CALCULATETABLE( T; <condición interna> ); <condición-externa> )
En este caso, el contexto se evalúa comenzando por la condición más interna <condición-interna>. Por lo tanto, el contexto de la condición interna, modifica el contexto de la condición externa.
Por ejemplo, la siguiente consulta:
EVALUATE
CALCULATETABLE (
CALCULATETABLE (
‘Ventas por Territorio’;
‘Ventas por Territorio'[Ventas por Pais] = «España»
);
ALL ( ‘Ventas por Territorio'[Ventas por Pais] )
)
Podríamos pensar que la función ALL elimina el filtro del primer CALCULATETABLE, sin embargo, esto no es así. El filtro del primer CALCULATETABLE define el contexto de la fórmula. Es decir, la fórmula está condicionada por el filtro más interno.
Habría que reescribir la fórmula para eliminar el contexto del filtro y aplicarse a toda la tabla, es decir, sería de la siguiente forma:
EVALUATE
CALCULATETABLE (
CALCULATETABLE (
‘Ventas por Territorio’;
ALL ( ‘Ventas por Territorio'[Ventas por Pais] );
‘Ventas por Territorio'[Ventas por Pais] = «España»
)
)