Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Ficha Tecnica CALCULATE Mago de La Modificacion de Contextos 4
Ficha Tecnica CALCULATE Mago de La Modificacion de Contextos 4
Función
7n EE
Descripción
CALCULATE La función CALCULATE retorna la evaluación de una expresión escalar en un contexto
Compatibilidad modificado, este contexto es transformado programablemente mediante filtros
explícitos e implícitos, además, de los modificadores.
Microsoft Excel
Excel ≥ 2010
★★★★★
Sintaxis
Power BI Desktop
PBI ≥ Nov 2016
1 Primer Parámetro Segundo Parámetro (Opcional) 2
★★★★★
Int. Contexto
1 Expresión Tipo
Contexto de Filtro
Lo Tiene en Cuenta (al principio) Luego La expresión para evaluar en el contexto Obligatorio
Modifica el Contexto de Filtro modificado.
★★★★★
Atributo
Expresión Escalar de Cualquier Tipo No Repetible
Contexto de Fila
Lo Tiene en Cuenta (al principio) Luego
Invalida Contextos de Fila
Observaciones
Categorías I. Aunque la expresión es el primer parámetro de la función CALCULATE, en
Según Funcionamiento Interno realidad es el último en ejecutarse, dado que la modificación del contexto
Indeterminado
★★★★★
y/o el modelo lo llevan a cabo los parámetros del segundo en adelante.
Según Resultado
Escalar En el siguiente ejemplo, la suma de la columna ingresos: SUM (
Recursos de Aprendizaje Pedidos[Ingresos] ) es el segundo y último parámetro en calcularse, puesto
que, el segundo parámetro: ALL ( Pedidos ) es el primero.
1. IngColombia =
2. CALCULATE (
3. CALCULATE ( [Ingresos Tot] , Pedidos[País] = "Colombia" ) ,
4. Pedidos[País] = "Perú"
5. )
Otros Recursos de III. El primer parámetro de la función CALCULATE es el único obligatorio. Cuando
Aprendizaje se utiliza de esta manera se busca añadir filtros implícitos. Esta operación es
denominada: Transición de Contextos, la cual se activa siempre que exista un
contexto de fila generado en primer lugar.
• Ejemplo:
Capítulo número 17
Transición de Contextos
→ [Visitar Libro] ←
La transición de contextos consiste en inyectar filtros implícitos, moviendo
un contexto de fila a un contexto de filtro, mediante dos operaciones: (1)
invalidando cualquier contexto de fila existente, y luego, (2) agregando
como argumentos de filtros implícitos (fantasma) todas las columnas y
sus valores en la iteración actual. Por lo anterior, debe generarse un
Lección 6 contexto de fila automático o programable previamente.
→ [Visitar Curso] ←
CALCULATE1 IMPLICITO
Iniciación a CALCULATE – Máster en DAX Por este CALCULATE implícito es tan importante la convención para
distinguir siempre cuando se hace referencia a una medida y a una
El siguiente vídeo pertenece al curso Máster columna de una tabla, indicando una medida sin la tabla donde reside,
en DAX y Power Pivot. así: [Ingresos Tot] y una columna siempre indicando la columna donde
→ http://bit.ly/31513Cj ←
reside, así: Pedidos[Ingresos], para ser consientes en todo momento de
una medida, de tal manera que si se genera un contexto de fila previo
podamos notar la transición de contextos.
Observaciones
1. IngCB01 =
2. CALCULATE ( [Ingresos Tot] , Pedidos[SKU] = "CB01" )
1. IngCB01 =
2. CALCULATE ( [Ingresos Tot] ,
3. FILTER ( ALL ( Pedidos[SKU] ) ,
4. Pedidos[SKU] = "CB01" )
5. )
Nota Sobre Syntax Sugar La syntax sugar (azúcar sintáctico) no tiene ninguna diferencia entre
El orden en el azúcar sintáctico es permutable, rendimiento y procesamiento interno, es exactamente lo mismo, sin
con lo cual Pedidos[SKU]="CB01" es igual
que "CB01"= Pedidos[SKU].
embargo, es recomendable utilizar la syntax sugar siempre que sea posible
sin perder de vista en ningún momento la expresión de tabla (FILTER/ALL)
detrás que la compone.
Inyectar Varios Filtros
(Actúan como un Y) II. Si se desea inyectar varios filtros al contexto que actúen como una
conjunción lógica, dicho de otro modo, como un “y”, cada filtro se debe
indicar en su propio parámetro de filtro.
• Ejemplo:
1. IngCB01yColombia =
2. CALCULATE ( [Ingresos Tot] ,
3. Pedidos[SKU] = "CB01" ,
4. Pedidos[País] = "Colombia"
5. )
• Ejemplo:
1. IngVacío =
2. CALCULATE ( [Ingresos Tot] ,
3. Pedidos[SKU] = "CB01" ,
4. Pedidos[SKU] = "CC01"
5. )
No se debe asumir siempre que varios argumentos de filtros que afecten a la misma columna
van a retornar vacío, debido a que la operación que se realiza entre ellos es la intersección
de sus elementos antes de la aplicación al modelo, por lo tanto, si comparten elementos si
devuelven algún valor.
• Ejemplo:
1. IngCB01-Intersección =
2. CALCULATE ( [Ingresos Tot] ,
3. Pedidos[SKU] IN {"CB01" , "CC01"} ,
4. Pedidos[SKU] IN {"L07" , "CB01"} )
5. -- la intersección de los elementos de los dos filtros es CB01
• Ejemplo:
1. IngEntre30y50 =
NOTA CALCULATE ( [Ingresos Tot] ,
2.
3. Pedidos[Ingresos] >= 30 ,
4. Pedidos[Ingresos] <= 50
5. ) -- Especialmente útil para desigualdades
Inyectar un Filtro con III. Si se desea inyectar un filtro al contexto que actúen como una disyunción
Varios Elementos lógica, es decir, como un “O”, se debe indicar en un sólo parámetro donde
(Actúan como un O) el filtro tenga en sus elementos los valores que constituyen el O.
• Por ejemplo: Una medida que devuelva los ingresos para los productos:
CB01, CCO1 y L02; puede ser escrita:
1. IngCB01oCC01oL02 =
2. CALCULATE( [Ingresos Tot], Pedidos[SKU] IN {"CB01", "CC01", "L02" })
1. IngCB01oCC01oL02 =
2. CALCULATE (
3. [Ingresos Tot] ,
4. Pedidos[SKU] = "CB01"
5. || Pedidos[SKU] = "CC01"
6. || Pedidos[SKU] = "L02"
7. ) -- incluso puede ser escrita con dos OR anidados.
1. IngCB01oColombia =
2. CALCULATE ( [Ingresos Tot] ,
3. Pedidos[SKU] = "CB01"
4. || Pedidos[País] = "Colombia"
5. )
O de Columnas
Diferentes RETORNA ERROR PARA POWER BI ANTES DE MARZO DEL 2021 Y POWER PIVOT.
La expresión O de columnas diferentes en azúcar
sintáctico para tecnologías válidas: (Power, SSAS y En este caso, la expresión de tipo tabla debe ser redactada de forma explícita,
AZ posterior febrero 2021) se convierte
internamente en la versión de la primera medida una posibilidad puede ser:
presentada en la página siguiente.
1. IngCB01oColombia =
2. CALCULATE ( [Ingresos Tot] ,
Opción No. 1:
3. FILTER ( Pedidos , Pedidos[SKU] = "CB01"
PELIGORSA || Pedidos[País] = "Colombia" )
4.
5. ) -- Esta expresión es válida: pero NO RECOMENDABLE.
• Ejemplo:
1. IngCB01oColSMZ =
2. CALCULATE (
3. [Ingresos Tot] ,
4. FILTER (
5. SUMMARIZE ( Pedidos , Pedidos[Pais] ,
6. SKUProductos[NombreProducto] ) ,
7. Pedidos[Pais] = "Colombia"
8. || SKUProductos[NombreProducto] = "Batman Begins"
9. )
10. )
11. -- Cardinalidad menor al producto cartesiano, pero se escanea la tabla
12. -- completa en busca de las combinaciones, lo cual es
13. -- contraproducente para el rendimiento cuando las columnas tienen
14. -- baja cardinalidad y la tabla es de un número de registros alto.
• Ejemplo:
1. Ingresos Llegada =
2. CALCULATE (
3. [Ingresos Tot] ,
4. USERELATIONSHIP ( Pedidos[FechaLlegada] , Calendario[Fecha] )
5. ) -- En la función USERELATIONSHIP primero se indica la clave externa
6. -- Y en el segundo parámetro la clave primaria, empero, también
7. -- Se puede indicar viceversa.
• Ejemplo:
1. PrDtsVend =
2. CALCULATE (
3. COUNTROWS ( SKUProductos ) ,
4. CROSSFILTER ( Pedidos[SKU] , Productos[SKU] , BOTH )
5. ) -- Opción preferible siempre que sea posible.
• Ejemplo:
1. %Particiacion =
2. VAR Numerador =
3. SUM ( Pedidos[Ingresos] )
4. VAR Denominador =
5. CALCULATE ( SUM ( Pedidos[Ingresos] ) , ALL ( Pedidos ) )
6. VAR PctParticipacion =
7. DIVIDE ( Numerador , Denominador )
8. RETURN
9. PctParticipacion
1. %PartVisible =
2. DIVIDE ([Ingresos Tot], CALCULATE ([Ingresos Tot] , ALLSELECTED () ) )
OBSERVACIONES
1. IngresosDeAltaRentabilidadxProducto =
2. CALCULATE ( [Ingresos Tot] ,
3. Pedidos[Ingresos] > [Ing] * 0,8 ) -- Error!
1. IngresosDeAltaRentabilidadxProducto =
2. CALCULATE (
3. SUM ( Pedidos[Ingresos] ),
4. FILTER ( ALL ( Pedidos[Ingresos] ), Pedidos[Ingresos] > [Ing] * 0,8 )
5. )
Sin embargo, en la actualidad raramente IV. Si no se desea que un filtro programable sobrescriba a uno nativo, este se
utilizamos este término, ya que tan sólo debe encerrar en la función de modificación de parámetros: KEEPFILTERS, lo
lo denominamos contexto de filtro
mismo aplica si se desea que un filtro de un CALCULATE más interno no
original o automático, y los
posteriormente creados, contextos de sobrescriba a un filtro de un CALCULATE más externo.
filtro copia o programable.
V. La función KEEPFILTERS se puede emplear indistintamente en diversos
El término restricción o constrain
parámetros de filtros, por consiguiente, si se desea evitar la sobreescritura
utilizado ampliamente en el libro El
ADN de Power Pivot utilizado para de un parámetro específico se implementa KEEPFILTERS, mientras que en
referirnos a los filtros generados por los otro parámetro de filtro se puede omitir.
parámetros de filtros de CALCULATE en
la actualidad lo seguimos empleando.
VI. Los filtros que afectan a la misma columna y conviven gracias a KEEPFILTERS,
primero crean la intersección de sus elementos antes de ser aplicados al
modelo de datos.
No se debe confundir esta parte con la aplicación de filtros de columnas diferentes,
Que en conjunto se aplican como un Y.
CALCULATE: Mago de la Modificación de Contextos
VII. Si dos o más filtros afectan a la misma columna, pero son generados por
MECANISMOS un mismo mecanismo, entonces, la intersección de sus elementos ocurre sin
la necesidad de KEEPFILTERS, por ejemplo, al ser creados por distintos
Un MECANISMO es todo aquello que pude parámetros de filtros en un mismo CALCULATE, como es el caso de:
producir un filtro para ser inyectado al
contexto de filtro. En consecuencia,
tenemos los siguientes mecanismos:
1. IngCB01 =
2. CALCULATE ( [Ingresos Tot] ,
▪ Elementos de la Interfaz: objetos 3. Pedidos[SKU] IN {"CB01", "CC01"},
visuales y panel de filtros. (Todo
4. Pedidos[SKU] IN {"L07", "CB01"}" )
parte de un mismo mecanismo).
▪ Parámetros de filtros explícitos de 5. -- la intersección de los elementos de los dos filtros es CB01.
CALCULATE.
▪ Parámetros de filtros explícitos de Nótese que los dos filtros afectan a la misma columna y son generados por
CALCULATETABLE.
▪ Operación de generación de nuevas un mismo CALCULATE (mismo mecanismo), es por ello por lo que se realiza
columnas SUMMARIZE. la intersección de sus elementos antes de ser aplicado al modelo de datos,
NO RECOMEDADO, CONSIDERESE OBSOLETO! situación diferente si el filtro existe previamente por el reporte (contexto
▪ Parámetros de filtros de de filtro original) y luego llega uno de CALCULATE (contexto de filtro copia)
SUMMARIZECOLUMNS.
▪ La transición de contextos al que afecta a la misma columna (generados por mecanismos diferentes).
convertir un contexto de fila en
contexto de filtro que deriva en a. Este escenario también se puede dar por filtros creados por el
filtros implícitos. reporte (contexto de filtro original), por ejemplo, utilizando dos
ACLARACIÓN: Los filtros generados por segmentaciones de datos de la misma columna. Un evento poco
un mismo CALCULATE son considerados frecuente pero posible, a menos que sea con interacciones visuales.
de un mismo mecanismo, por lo tanto,
filtros en CALCULATE(s) distintos se
consideran diferentes mecanismos. Sin embargo, algo más frecuente es que sea un filtro creado por
una segmentación de datos y otro por un área de colocación.
Los filtros implícitos se consideran parte
de otro mecanismo, aunque se listen de
forma oculta en el mimo conjunto de VIII. La diferencia entre un contexto de filtro vacío y un filtro vacío, es bueno
parámetros de filtro para un mismo apuntarlo aquí, ya que se da con CALCULATE:
CALCULATE, dado que surgen del
contexto de fila (otro ente). a. Un contexto de filtro vacío significa que las tablas del modelo de
SOBREESCRITURA DE FILTROS datos quedan intactas y todos sus registros son visibles, por lo tanto,
DOS FILTROS QUE AFECTAN A LA MISMA una medida devolvería el cálculo general.
COLUMNA GENERADOS POR MECANISMOS
DIFERENTES, ENTONCES, EL ÚLTIMO EN
INGRESAS AL CONTEXTO SOBREESCRIBE. b. Un filtro vacío indica que para esa columna no hay ningún elemento
INTERSECCIÓN DE FILTROS
DOS FILTROS QUE AFECTAN A LA MISMA visible, por lo que la tabla en cuestión y todas las relacionadas
COLUMNA GENERADOS POR MISMO MECANISMO
OCURRE LA INTERSECCIÓN.
mediante el tipo 1 → * quedan completamente vacías, por lo
tanto, una medida de alguna de esas tablas devolvería BLANK.
CALCULATE: Mago de la Modificación de Contextos
▪ Productos = SKUProductos
▪ Ventas = Pedidos
1. =
2. CALCULATE (
3. [Ingresos Tot] ,
4. Pedidos[País] = "Colombia"
5. ) -- El filtro de SKUProductos se crea implícitamente por
6. -- La transición de contextos.
1. =
2. [Ingresos Tot] ( Pedidos[País] = "Colombia" )
1. =
2. [Ingresos Tot] (
3. Pedidos[País] = "Colombia" ,
4. Pedidos[Tipo de Compra] = "Normal"
5. )
ORDEN DE PRECEDENCIA1
i. Todos los parámetros de filtros explícitos son preparados individualmente en el contexto de evaluación original,
es decir, contexto de filtro original y contextos de fila si existen.
Aquí los filtros son preparados más no inyectados al contexto de filtro, esto quiere decir que no se aplican al modelo de datos aún, tan sólo se
construyeron respetando el contexto de evaluación original, por eso se dice que los filtros quedan latentes.
ii. Se crea una copia del contexto de filtro original, sin ningún contexto de fila, dado que en el siguiente paso (si
aplica) serán invalidados por la transición de contextos (entonces, por optimización no vale la pena copiarlos).
Propiedad Conmutativa: Los pasos 1 y 2 son “intercambiables”, empero, el orden exacto del algoritmo es el presentado aquí.
iii. Se ejecuta la operación de transición de contextos si previamente se ha generado un contexto de fila bien sea
automático o programable, con lo cual se invalidan los contextos de fila, y de allí, todos las columnas actuales
y sus valores son creados como parámetros de filtros implícitos e inyectados a la copia del contexto de filtro.
Es posible evitar la imposición de sobreescritura de filtros añadidos por transición de contextos (argumentos implícitos o fantasmas), encerrando
la expresión tabular donde se itera con KEEPFILTERS (especialmente útil para mantener la forma de filtro arbitrario)
iv. Se ejecutan los parámetros que actúen como modificadores de CALCULATE: USERELATIONSHIP, CROSSFILTER; ALL,
ALLEXCEPT, ALLNOBLANKROW, ALLCROSSFILTERED, REMOVEFILTERS y ALLSELECETED.
Gracias a este orden, se puede anular la transición de contextos con cualquier función ALLxxxx. (Especialmente útil para columnas calculadas)
v. CALCULATE inyecta todos los parámetros de filtros explícitos a la copia del contexto del filtro, haciendo que
convivan e intersequen aquellos que afecten la misma columna y vayan encerrados en KEEPFILTERS.
vi. Se aplican todos los filtros del nuevo y más reciente contexto de filtro a el modelo de datos: a todas las tablas
que corresponda, generando un nuevo subconjunto de datos visibles (contexto de evaluación).
vii. Se ejecuta el primer parámetro: Expresión escalar, en el nuevo y más reciente contexto de evaluación.
viii. Una vez finalizado el más reciente contexto de filtro es descartado regresando al contexto original.
Por ejemplo:
→ https://bit.ly/3aZiBqu ←
→ www.CartasDax.Com ←