El Contexto de Filtro en el Lenguaje DAX.
En este artículo con cara de minilibro online, te hablaré del Contexto de Filtro en el Lenguaje DAX, uno de los dos conceptos más importantes en la modelación tabular, de hecho, la acción más inteligente que puede realizar cualquier persona que desee aprender y dominar DAX bien sea a nivel básico o avanzado consiste en indagar y profundizar en el contexto de filtro (aparte de aprender sobre modelado).
— TABLA DE CONTENIDO DE ESTE ARTÍCULO
1. Conceptos Básicos Previos
a. Teoría de Conjuntos
b. Teoría de Filtros
i. ¿Qué es un Filtro?
ii. Semántica de un Filtro
iii. Filtro = Tabla en DAX
2. Entendiendo el Contexto de Filtro
a. Definición del Contexto de Filtro
i. Contexto de Filtro Vacío
ii. Propiedad 0: El Contexto de Filtro es Invisible
b. «Generación» del Contexto de Filtro
i. El Contexto de Filtro Original o Automático
A. Objetos Visuales (Inyección)
B. Panel de Filtros (Inyección)
C. Interacciones Visuales(Remoción)
D. RLS (Remoción)
ii. El Contexto de Filtro Copia o Programable
c. Propiedades del Contexto de Filtro
i. Propiedad 1: Aplicación Automática
ii. Propiedad 2: Intersección de Elementos
iii. Propiedad 3: Copia del Contexto de Filtro
iv. Propiedad 4: Sobreescritura de Filtros
3. Topología de Filtros
a. Filtros Simples
b. Filtros Arbitrarios
Antes de iniciar de te voy a decir cuatro cosas:
En primer lugar, este es un artículo supremamente teórico, poblado de conceptos y estudio semántico, esto no quiere decir que no sea algo aplicado, puesto que si deseas crear medidas medianamente complejas y aplicables es imperativo conocer estos detalles del contexto de filtro.
En segundo lugar, como prerrequisito es importante que conozcas cómo funciona la propagación de filtros aproximada, mejor dicho, que te hayas leído este artículo: Propagación de filtros, lo que nadie te cuenta sobre DAX, en consecuencia, también haber leído y tener claro el artículo: El Peldaño que te Llevará a Dominar DAX. incluso, un estudio de la miniserie de vídeos de introducción real a CALCULATE en DAX en nuestro canal de YouTube es altamente recomendable.
En tercer lugar, este artículo es por mucho el más extenso que se ha escrito en esta página web, con un total de 5872 palabras, algo así como 60 páginas de un archivo de Word en tamaño carta, así es, es un artículo supremamente extenso.
Por lo comentado no te recomiendo que te afanes a leerlo todo de una sola vista, sino que lo leas progresivamente, si me permites el símil musical: en 3 o 4 tiempos sería ideal, puesto que así tendrás la posibilidad de reflexionar e interiorizar lo que se comentará a lo largo de todo este manuscrito.
En cuarto y último lugar, tengo que decirte que en varias partes de este artículo voy a parecer pedante, explicando cosas que parecen demasiados obvias e incluso como si las quisiera complicar, a pesar de ello, tener 100% cristalino estos conceptos derivará en un entendimiento de la temática más compleja y avanzada de una manera más fácil.
Conceptos Básicos
Para entender plenamente qué es el contexto de filtro en el lenguaje DAX, no es mala idea aterrizar un par de conceptos súper básicos, pero esenciales brevemente: ellos vienen de la teoría de conjuntos y filtros en informática.
Teoría de Conjuntos
De la teoría de conjuntos sólo debemos extraer la definición más básica y es la de conjunto:
¿Qué es un Conjunto?
Un conjunto es una colección de objetos con características similares, donde se consideran todos los elementos del conjunto como un mismo objeto, el cual cumple ciertas propiedades y siguen un mismo comportamiento.
Ejemplo: Un conjunto formado por los tipos de triángulos de acuerdo con la longitud de sus lados.
Algunas de las propiedades que cumple el anterior conjunto es que
- Siempre son polígonos de tres lados.
- La suma de los ángulos interiores miden180º.
.
Conjunto Vacío
Una característica, por llamarlo de alguna manera, que tienen los conjuntos es que alberga la posibilidad de la existencia de conjuntos vacíos, es decir, sin elementos:
Esto jugará un papel importante más adelante, puesto que nos permitirá dilucidar una consecuencia vital.
Teoría de Filtros
Nuestro segundo componente de los conceptos básicos:
¿Qué es un Filtro?
Se refiere a un objeto diseñado para controlar el contenido que se permite mostrar en una interfaz u otro objeto.
Semántica de un Filtro
Si lo vemos desde la perspectiva de Excel, de lo anterior podemos entrever que el significado de un filtro deriva en que: lista todos los elementos que son visibles para una columna
«!»: Un filtro lista todos los elementos que pueden ser visibles para una columna, claro en el filtro se listan los elementos una única vez, pero en la columna puede aparecer el elemento más de una vez, o no puede aparecer si es el caso, puesto que el filtro lista los elementos permitidos que pueden aparecer, más no indica que tenga que existir obligatoriamente.
Aterricemos qué es un filtro ya directamente en el universo del lenguaje DAX.
Filtro = Tabla (En DAX)
Como reza el título
Los filtros en DAX son tablas
Así de simple, los filtros son tablas representados por un conjunto de filas.
• Ejemplo 1 de Filtro en DAX:
Los filtros pueden estar compuestos por más de una fila
• Ejemplo 2 de Filtro en DAX
Incluso un filtro puede estar compuesto por más de una columna
• Ejemplo 3 de Filtro en DAX
Como podemos entrever existen diferentes formas de filtros, es decir, filtros que listan de una manera u otra las distintas posibilidades a ser mostradas.
Más adelante en este artículo entraremos en detalle del estudio de las formas de filtros o su topología.
Por el momento, quedémonos con que el siguiente mantra: UN FILTRO ES UNA TABLA, con lo cual construir uno es fácil con cualquier función de tipo tabular del lenguaje DAX, por ejemplo, con funciones como: FILTER, ALL, VALUES, CROSSJOIN, SUMMARIZE, etc.
Entendiendo el Contexto de Filtro
El equipo de Microsoft, específicamente el equipo de SQL Server cuando creo el lenguaje DAX luego de que sabía que tendría tablas en el modelo, lo que hizo de manera inicial fue crear el contexto: un objeto que consiste en un conjunto de filtros que en comunión actúan como un ente único.
Pero brindemos una definición más formal:
Definición del Contexto de Filtro
«Definición»: El contexto de filtro es un conjunto de filtros.
No es más, por increíble que parezca, el contexto de filtro es tan sólo: un conjunto de filtros.
Contexto de Filtro Vacío
Adicionalmente, como cualquier conjunto es viable tener un contexto de filtro vacío, es decir, sin ningún filtro que lo habite, así:
El contexto de filtro vacío juega su rol más evidente en el total general, empero, algo no tan evidente es que el contexto de filtro siempre existe y podemos añadir filtros allí, con lo cual podemos hacer actividades inimaginables sin importar si es una medida, columna calculada, tabla calculada, filtro RLS o una consulta.
Propiedad 0: El Contexto de Filtro es Invisible
Más adelante en este minilibro online, tendremos una sección dedicada a estudiar las propiedades del contexto de filtro, a pesar ello, hay una que debemos documentar desde ya:
«Propiedad 0»: El Contexto de Filtro es un ente intangible o más bien invisible, es decir, no se visualiza en ninguna parte de la interfaz, pero sí que existe, no obstante, tan sólo de manera interna, por lo que las representaciones de este son tan sólo esquemas visuales educativos de apoyo para comprenderlo mejor.
Es una propiedad que puede ser demasiado obvia para los ya iniciados, pero eso no quiere decir que dejemos pasar por alto algo básico.
Las propiedades del contexto de filtro es lo que le va a conferir complejidad a este concepto, logrando que su definición puede llegar a ser de una página entera.
Eso sí, antes de entrar en esas minucias: …
Generación del Contexto de Filtro
Ya entendemos conceptualmente que es el contexto de filtro, adicionalmente, debemos recordar de nuestra definición de conjuntos que: un conjunto cumple con ciertas propiedades y comportamientos.
No obstante, antes de pasar a estudiar en detalle las propiedades del contexto de filtro, es imperativo estudiar cómo se «genera» un contexto de filtro en primer lugar.
El Contexto de Filtro Original, Automático o Explícito
Existen varios tipos de contextos de filtros, pero el que primero debemos conocer por excelencia es el «generado» o «creado» por el reporte.
«Contexto de Filtro Original, Automático o Explícito»: El contexto de filtro original es generado de forma automática por componentes del reporte, sin necesidad de demandarlo explícitamente mediante funciones, por lo anterior a este contexto también se le conoce como: Contexto de Filtro Automático.
— ¿Cómo así?
Cuando digo reporte hago referencia a elementos u objetos de la interfaz gráfica, en este artículo tomaremos la interfaz de Power BI que es la más utilizada.
En general, tenemos 4 elementos del reporte que añaden o remueven filtros del contexto de filtro, estos elementos son:
- Objetos visuales
- Panel de Filtros
- Interacciones Visuales
- Administración de Roles (RLS) — Este es un caso especial
.
Objetos Visuales
Los objetos visuales son todos aquellos objetos que nos ayudan a construir el reporte mediante comunicación e interacción visual, ejemplos:
- Matrices
- Segmentaciones de datos
- Gráficos de barras
- Gráficos Circulares
- Embudos
- Etc.
.
Mejor dicho, estos:
Esto incluye todo objeto visual personalizado que encontremos en la app source de Microsoft con la habilidad de filtrar.
Para entender plenamente cómo estos objetos visuales generan el contexto de filtro, realicemos una serie de ejemplos para comprender, honestamente, de qué se trata:
○ Ejemplo 1 – Matriz
El caso clásico viene atado con las matrices de Power BI, que vendrían a ser el equivalente de una tabla dinámica en Excel.
Además:
Cada vez que analicemos una matriz o cualquier objeto visual que represente múltiples valores, debemos por amor a la cordura, seleccionar una casilla o valor en específico para determinar su contexto de filtro.
Ejemplo:
Como se puede apreciar en la imagen el valor o casilla a analizar es el encerrado en verde, ahora debemos realizar el siguiente paso primordial:
«!»: — Identificar filtros
— ¿Cuáles serían los filtros para la casilla encerrada en verde?
Los filtros serían todo aquello que restringe el valor que estamos analizando, dicho en otras palabras, nosotros lo leeríamos como los ingresos para Colombia.
Esa restricción que le dimos en la oración: para Colombia es un filtro.
Pero como sabemos que un filtro es una tabla, debemos señalar también a cuál columna corresponde:
• Pedidos[País] = «Colombia»
Con lo anterior podemos representar de manera gráfica el contexto de filtro para la casilla de interés:
Fácil, ¿No? …
○ Ejemplo 2 – Matriz y Segmentación de Datos
Imaginemos que ahora añadimos una segmentación de datos con el año y decidimos analizar la casilla en verde de Colombia, así:
Como la segmentación de datos afecta a los valores de la matriz, para la casilla en estudio, entonces el valor 372.727,32 lo leeríamos de la siguiente forma:
Ingresos del país Colombia para el año 2012
Esas restricciones que le dimos en la oración previa: país Colombia para el año 2012 son nuestros filtros.
Por lo que nuestra representación visual sería:
○ Ejemplo 3 – Matriz, Segmentación de Datos y Gráfico
En este ejemplo evaluemos tu compresión antes de ver la solución:
— ¿Cuál sería el contexto de filtro para la casilla de Colombia en el siguiente esquema?
Si nos fijamos el gráfico de barras esta seleccionado sólo para la Categoría de Producto Libro, por lo que la matriz se ve influenciada por el mismo.
Por lo anterior, la casilla encerrada la leeríamos como:
Los ingresos del país Colombia para el año 2012 y la categoría de producto Libros.
Por lo tanto, las restricciones en la oración son: país Colombia, año 2012 y categoría de producto Libros.
La representación visual quedaría:
Otro aspecto que merece que le dediquemos un par de párrafos son los contextos de filtros de los subtotales y totales.
○ Ejemplo 4 – Subtotales y Total General
Identificar los filtros de los subtotales no tiene nada de extraño, porque al final sólo se está omitiendo uno o más campos en el área de colocación del objeto visual, me explico, tomemos la siguiente matriz y veamos el contexto de filtro de la casilla redondeada en verde:
Si observamos el panel de campos veremos que estamos utilizando todos los campos en las áreas de colocación, claro exceptuando el área de valores que es el cálculo de análisis →
Pues bien, el análisis de una casilla para el total de filas simplemente no tendría en cuenta un filtro, para el caso de la matriz anterior, no tendría en consideración el filtro de categoría de descuento, por ejemplo:
Para el total a nivel de columnas sería algo similar, sólo que en lugar de no incluir el filtro de categoría de descuento no incluiría el filtro de país, así:
— ¿Qué sucedería para el total general?
Para el caso de la matriz que estamos analizando el contexto de filtro estaría completamente vacío.
«Acerca del Contexto del Total General»: No siempre el contexto de filtro del total general será vacío, puesto que una segmentación de datos u otro elemento puede restringir la casilla del objeto visual en análisis.
○ Ejemplo 5 – Mismo Campo en Varios Objetos Visuales
Un caso especial se presenta cuando un campo determinado es utilizado no sólo en el objeto visual de análisis, sino también por otros objetos visuales externo, el caso clásico es como sigue:
Nótese que la casilla en análisis es la de Colombia que esta encerrada en verde, sin embargo, la segmentación de datos afecta a el mismo campo país, listando aquellos países que pueden ser visibles.
— ¿Cómo leeríamos la casilla?
Nada raro verdad, puesto que seguiría siendo los ingresos para Colombia, por lo tanto, el contexto de filtro tendría sólo un filtro que corresponde a País Colombia, por lo tanto el contexto de filtro sería como sigue:
Por otra parte, el contexto de filtro del total general no sería vacío, sino el dictado por la segmentación de datos:
Como puedes ver es algo sencillo también, de todas maneras, es un caso especial que vale la pena documentar aquí, puesto que cobra especial importancia cuando estudiamos en una primera instancia la función ALLSELECTED y una importancia vital cuando estudiamos la misma función de manera avanzada.
Panel de Filtros
El segundo elemento de la interfaz de Power BI que tenemos en nuestro arsenal para añadir filtros al contexto de filtro es el: panel de filtros, la siguiente imagen lo muestra:
Para un objeto visual seleccionado todas las secciones agregan filtros al contexto de filtro, por ejemplo:
.
- Filtros de Objeto Visual / La sección azul: Al tener un objeto visual seleccionado vamos a ver los campos que tiene dicho objeto (encerrados en rojo) que son los mismos campos que hemos añadidos a las áreas de colocación, así como la medida, pero además vemos resaltado en morado un nuevo campo que hemos arrastrado manualmente y que corresponde al campo Categoría de Descuento para Cyber Monday.
- Filtros de Página / La sección verde: muestra nuevos campos que fue arrastrado manualmente para afectar a cualquier objeto visual en la página, en este caso que es el Mes Nombre sea enero.
- Filtros de Todas las Páginas / Sección Amarilla: Los mismo corre aquí, sólo que este filtro afecta a todas las páginas en todo el archivo de Power BI, para nuestro ejemplo hemos arrastrado el campo SKU y seleccionado CB01.
.
Seleccionemos una casilla en estudio para determinar el contexto de filtro con todos estos elementos
— ¿Para el valor 5.506,34 encerrado en la casilla verde cuál sería el contexto de filtro?
En la matriz sólo esta seleccionado Colombia, sin embargo, todos los filtros en el panel de filtros influyen en lo que leemos en dicha casilla.
Mejor dicho, la casilla en análisis corresponde a los ingresos de Colombia para la Categoría de Descuento Cyber Monday, para el Mes de Enero y para el SKU CB01.
La representación visual quedaría:
Interacción Visual
La interacción visual nos brinda la opción de indicar cómo influye cierto objeto visual en otros determinados, una de esas opciones es decir que no lo afecte.
Por ejemplo, si tenemos una segmentación de datos y una matriz, podemos seleccionar la segmentación de datos y en la pestaña Formato ubicar el comando: Editar interacciones, para luego indicar en la matriz Ninguno, que es representado por un icono pequeño de pie chart:
Lo que sucede es que la interacción remueve el filtro del año como si fuera REMOVEFILTERS o la función ALL.
Ejemplo:
RLS (Row Level Security)
Nuestro cuarto elemento es la administración de rol, en este artículo no me detendré en ello, ya que tiene características únicas, empero, puedes estudiar la temática en la siguiente serie de vídeos en nuestro canal de YouTube: Seguridad en Power BI (Row Level Security).
Por último y antes de pasar a la siguiente sección:
«Sinónimos del contexto de filtro original»: El contexto de filtro original o contexto de filtro automático también se le conoce como contexto de consulta (query context).
El termino Query Context o Contexto de consulta es presentado en la documentación de Microsoft, terminología que el equipo de ExcelFreeBlog.Com también ha empleado, situación que se ve especialmente enmarcada en el libro: El ADN de Power Pivot.
Sin embargo, en la actualidad raramente utilizamos este término, ya que tan sólo lo denominamos contexto de filtro original o automático.
Por otra parte, algunas referencias, sobre todo en habla inglesas también denominas a este contexto, contexto de filtro implícito.
El Contexto de Filtro Copia o Programable
Si la historia del contexto de filtro tuviera su punto final aquí, no sería nada complejo, pero la realidad va muchos más allá.
Como describimos hasta la saciedad el contexto de filtro automático es generado por elementos y objetos de la interfaz, por eso decimos que es automático porque nosotros no lo creamos manualmente con código DAX.
Pues bien gracias a funciones como: CALCULATE, CALCULATETABLE, «SUMMARIZE», SUMMARIZECOLUMNS, entre otras funciones que al final son una syntax sugr que contiene alguna de las funcione previas señaladas, podemos generar nuevos filtros:
Esto filtros son creados por un mecanismo externo (Parámetros de filtro de las funciones señaladas en el párrafo anterior) respecto al de los filtros nativos del contexto de filtro en análisis, con lo cual estos nuevos filtros son generados de forma exógena o programablemente para luego ser inyectados al contexto de filtro.
Una definición:
«Contexto de Filtro Programable, Copia o Implícito»: Gracias a funciones específicas del lenguaje DAX podemos crear contextos de filtro manualmente, es por ello por lo que a este tipo de contextos se le conoce como contexto de filtro programable o contexto de filtro explicito.
El mecanismo o función más utilizada por mucho es CALCULATE, puesto que sus parámetros de filtros permiten crear filtros programables de forma externa para luego ser inyectados a una copia del contexto de filtro (original en la mayoría de los casos) y luego evaluar una expresión escalar en el contexto modificado.
Pongamos a la vista la sintaxis de la función CALCULATE para que se más claro:
La función CALCULATE por si sola requiere de su propio estudio y de su propia capacitación, nosotros en EFB e EIN hemos llegado a un entrenamiento virtual de alto impacto e interiorización denominado: Magíster en Lenguaje DAX – Nivel 1.
Donde nuestro estimado dicta que para entender CALCULATE honestamente necesitamos pasar de 9 a 12 horas estudiándola, más lo ejercicios y practica en casa.
Conocer más sobre la capacitación: aquí.
Sin embargo, destaquemos tres puntos esenciales que necesitamos para este post.
.
- Punto 1: El primer parámetro o argumento de CALCULATE (Expresión) es el último en ejecutarse, ya que del segundo en adelante (parámetros de filtros) se ejecutan primero.
- Punto 2: CALCULATE crea copias del contexto de filtro.
- Punto 3: Los parámetros de filtros inyectan nuevos filtros al contexto de filtro copiado.
.
De los puntos 2 y 3 damos un poco más de detalle enseguida:
Copia del Contexto de Filtro
Aquí hay un paso vital y es que la función CALCULATE siempre crea una copia del contexto de filtro, por ejemplo, si tenemos un contexto de filtro automático dictado por elementos de la interfaz del siguiente estilo:
Entonces la presencia de CALCULATE crea una copia, así:
Al ser una copia, o por el simple hecho de que este contexto surge porque nosotros implementamos CALCULATE de manera manual, decimos que es un contexto de filtro programable o explicito.
Adicionalmente, nótese que este contexto de filtro y sus filtros los representamos por un color azul para distinguirlo del contexto de filtro y original y sus filtros que se representa en verde.
Los pequeños círculos naranja con números romanos en la parte inferior de cada filtro son explicados más adelante. (Busca el guante de boxeo)
Parámetro o Argumentos de Filtro
Del segundo parámetro en adelante podemos utilizar expresiones de tipo tabla para crear nuevos filtros a ser inyectados a el contexto de filtro copiado.
Como CALCULATE es un mecanismo exógeno respecto a la generación de los filtros nativos del contexto de filtro, decimos que son filtros externos o programables.
Gráficamente los representamos con un encabezado de color rojo para distinguirlos fácilmente.
— Por ejemplo, la siguiente medida:
IngCol :=
CALCULATE ([Ing] ;
FILTER ( ALL ( Pedidos[País] ); Pedidos[País] = «Colombia» )
)
El segundo parámetro de CALCULATE el:
FILTER ( ALL( Pedidos[País] ) ; Pedidos[País] = «Colombia» )
Genera el siguiente filtro:
Por ser un filtro programable generado por un mecanismo diferente a los filtros del contexto de filtro en análisis, lo representamos con color rojo.
CALCULATE tiene la habilidad de inyectar ese filtro creado en su parámetro a el contexto de filtro:
Una vez inyectado el filtro, nos percatamos que tenemos un nuevo filtro en el contexto que añade una nueva restricción:
Es de resaltar que los colores de los filtros son distintos para subrayar que son filtros creado por mecanismo distintos (o por CALCULATEs distintos)
Es importante destacar que el filtro inyectado afecta a un campo que no existe en el contexto de filtro, por lo tanto, todos los filtros conviven en armonía, no obstante, si el campo país existiera previamente el contexto de filtro el comportamiento cambiaría.
Para entender esto, primero debemos estudiar algunas propiedades del contexto de filtro, para en la propiedad 4 aterrizar bien esto de qué se trata.
A pesar de ello, no quiero dejar esta sección sin discutir dos cosas:
Múltiples Filtros Inyectados
La función CALCULATE tiene un número indeterminado de parámetros, esto quiere decir, que podemos construir todos los filtros que necesitemos a ser inyectados al contexto de filtro copiado.
Por ejemplo, la siguiente expresión:
IngColCB01 :=
CALCULATE (
[Ing];
FILTER ( ALL ( Pedidos[País] ); Pedidos[País] = «Colombia» );
FILTER ( ALL ( Pedidos[Ciudad] ); Pedidos[Ciudad] = «Medellín» );
FILTER ( ALL ( SKUProductos[SKU] ); SKUProductos[SKU] = «CB01» )
)
Que es equivalente en syntax sugar a:
IngColCB01 :=
CALCULATE (
[Ing];
Pedidos[País] = «Colombia»;
Pedidos[Ciudad] = «Medellín»;
SKUProductos[SKU] = «CB01»
)
Gráficamente nuestro contexto de filtro después de la inyección de los filtros luciría:
Múltiples Copias del Contexto
Al tener la posibilidad de anidar CALCULATE(S) deducimos que pueden ir apareciendo muchos contextos de filtro, ya que para cada CALCULATE se va haciendo una copia.
Tomemos por ejemplo la siguiente expresión DAX:
IngColCB01 :=
CALCULATE (
CALCULATE ( [Ing]; SKUProductos[SKU] = «CB01» );
Pedidos[País] = «Colombia»
)
Y supongamos que el contexto de filtro dictado por la interfaz que tenemos es este:
El CALCULATE más externo crea una copia del contexto de filtro e inyecta el parámetro:
• Pedidos[País] = «Colombia»
Por lo que el contexto de filtro a este punto queda:
Empero, recordemos que el primer parámetro es el último en ejecutarse, con lo cual vemos que nuestra expresión tenemos otro CALCULATE en dicho parámetro expresión, por lo que se crea una copia del contexto de filtro anterior y allí se inyecta el filtro:
• Pedidos[SKU] = «CB01»
El más reciente contexto de filtro queda:
Si miramos todos los contextos tendríamos tres:
Esto puede parecer trivial, pero no lo es, porque si los campos inyectados coinciden con uno existente en el contexto de filtro tenemos un comportamiento de sobreescritura. (Véase propiedad 4 para más detalles)
Propiedades del Contexto de Filtro
A parte de la definición y de la generación de los diversos contextos, tenemos varias propiedades que le confieren más poder, comprenderlas ampliará nuestro entendimiento de DAX en general.
Propiedad 1: Aplicación Automática
La primera propiedad para interiorizar consiste en conocer que los filtros se aplican automáticamente al modelo de datos, es decir:
«Propiedad 1 | Parte 1»: Todo filtro que residan en el contexto de filtro siempre se aplica a la tabla correspondiente en el modelo de datos de manera automática.
— ¿Esto que significa?
Tomemos por ejemplo, el siguiente contexto de filtro:
Además, supongamos que tenemos la siguiente tabla cargada en el modelo de datos:
Lo que va a suceder de forma automática es que el filtro de País en el contexto de filtro se va a aplicar al campo País de la tabla Pedidos de forma automática, así:
En consecuencia, la tabla Pedidos va a dejar visible sólo aquellas filas que en el campo País corresponde al elemento Colombia, puesto que el filtro señala cuáles son aquellos elementos que se deben mostrar, y para este caso sólo sería Colombia.
Hay algo aquí que debemos tener presente, esto es, que el filtro sabe que se debe aplicar a la columna País de la taba Pedidos porque tiene la información del identificador único interno que ubica exactamente esa columna en el modelo de datos, nostros en EFB ilustramos esto con pequeños circulos con número romanos debajo de cada columna, así:
«Data Lineage»: A esta etiqueta de posición que identifica cada campo y tabla en el modelo de datos de manera única, es lo que se conoce como el Data Lineage.
Es por ello que el filtro de País en el contexto de filtro filtra el Campos País en la tabla Pedidos, porque tienen el mismo data lienage, dicho de otro modo, porque tanto filtro como columna tienen en la parte inferior el mismo número en la etiqueta naranja.
Lo previo es especialmente importante porque, puesto que, si su data lineage no se corresponde con ninguna tabla del modelo, entonces este se aplica a una tabla anónima, visto de otro modo a una tabla invisible:
Podemos argüir que es una explicación algo enrevesada para algo que parece muy simple, de hecho, así lo es. No obstante, como es la precisión del funcionamiento interno nos brinda una comprensión muchísimo más amplia del contexto de filtro y de otras cosas que de allí se deprende.
Por ejemplo, existen funciones que heredan el data lineage, mientras que hay otras que crean un nuevo, incluso hay funciones que dependiendo de cómo implementos su sintaxis puede o no heredar un data lineage nativo del modelo de datos, como si fuera poco, contamos con la función TREATAS la cual nos permite manipular a voluntad estas etiquetas.
Dado que la función TREATAS se utiliza para reasignar etiquetas anónimas a una ya existente, es por ello que en las cartas DAX la representamos un justiciero anónimo para el data lienage.
Conociendo estos detalles ya tenemos la habilidad de describir de forma completa la propiedad número uno del contexto de filtro.
«Propiedad 1 |Completa»: Todo filtro que residan en el contexto de filtro siempre se aplica a la tabla correspondiente en el modelo de datos de manera automática; sin importar si tiene un data lineage heredado no, puesto que, si su data lineage no se corresponde con ninguna campo o tabla en el modelo de datos, entonces: este se aplica a una tabla anónima.
Contexto de Filtro Vacío
Retomando la discusión del contexto de filtro vacío, con el estudio de esta propiedad podemos ver porque decimos que un contexto de filtro vacío no afecta en absolutamente nada, debido a que no restringe ninguna tabla de ninguna manera, dejándolas completamente intactas con todos su registros 100% visibles/disponibles.
Propiedad 2: Intersección de Elementos
La propiedad dos estable que:
«Propiedad 2»: El contexto de filtro realiza la intersección de los elementos de filtros que afectan a la misma columna antes de aplicarse al modelo de datos.
Para dilucidar esta propiedad veamos el siguiente contexto de filtro:
— ¿Cuál de los dos filtro se aplica?
Bien, antes de esta explicación quiero aclarar algo, hasta aquí estamos hablando de filtros del mismo contexto de filtro, con lo cual propiedad de sobreescritura que es la más hablada en la comunidad aún no aplica, puesto que aún no estamos inyectando o generando filtros.
Continuemos …
La respuesta que es ninguno de los dos filtros se aplica, ya que en realidad lo primero que va a suceder es que al ser filtros que afectan a la misma columna, es decir, comparten el mismo data lienage, entonces, se genera único filtro con los elementos comunes ambos:
Por consiguiente, el filtro único generado sólo contiene: «Brasil» y «Colombia», por lo que el contexto de filtro luce así:
La intersección de elementos no sólo aplica a dos filtros sino también a: 3 filtros, 4 filtros, 5 filtros, etc. etc. N-Filtros.
Existe un caso particular que debemos resaltar en rojo y mayúscula o una sub-propiedad o Colorario mega vital, esto es que:
→ COLORARIO 1: FILTRO VACÍO ←
Si los filtros no comparten elementos comunes, entonces, el filtro resultante da vacío, esto signifia que al ser aplicado a la tabla correspondiente esta queda sin ningún fila visible, es decir, 100% vacía.
Por ejemplo:
Como podemos observar el contexto de filtro de la imagen anterior tiene dos filtros que afectan a la misma columna, fácilmente identificable porque tienen el mismo data lienage, conociendo eso, sabemos que lo primero que va suceder es que se hace la intersección de sus elementos, sin embargo, los filtros no comparten ningún elemento, generando un filtro vacío, visualmente:
Si hacemos memoria de nuestro conceptos básicos del princpipo del artículo, vimos que: Un filtro lista todos los elementos que pueden ser visibles para la columna, por lo que deducimos que el filtro de País está diciendo que ningún elemento debe ser visible, por lo tanto la tabla queda vacía.
Filtro No Funcional
La otra vía también es posible, es decir, que la tabla a filtrar quede intacta, dicho de otro modo, con todos sus registros visibles a pesar de que se aplicó un filtro en algunos de sus campos.
→ COLORARIO 2: FILTRO NO FUNCIONAL ←
Esto quiere decir que el filtro lista todos los elementos posibles del campo involucrado, con lo cual, si bien el filtro se activa, la tabla sigue mostrando o dejando visible todas sus filas.
Ejemplo:
Es por el motivo previo que la implementación de las funciones ISFILTERED e ISCROSSFILTERED no es garantía para conocer si todos los registros de una o más tabla están visibles.
El caso comentado puede sonar extraño, pero es más frecuente de lo que parece a primera vista.
Propiedad 3: Copia del Contexto de Filtro
«Propiedad 3»: El contexto de filtro no se crea ni se destruye sólo se copia.
En el apartado anterior vimos cómo se «generan» contextos de filtros, pero lo que debemos saber por ahora es que podemos ir haciendo copias sucesivas del contexto de filtro.
Me explico, en un momento determinado podemos tener el siguiente contexto de filtro:
Lugo gracias a una expresión DAX bien sea en una medida, columna calculada, tabla calculada o consulta que contenga CALCULATE o «similares» creamos un copia del contexto de filtro, con lo cual sería:
Lo que podemos entrever es que, si siempre hacemos copias del contexto de filtro, por lo que podemos plantear la hipótesis de que: el contexto de filtro siempre ha existido (más de esto en otro artículo).
Propiedad 4: Sobreescritura de Filtros
Repasemos lo que sabemos de la generación de contexto de filtro programable, tomando la siguiente medida:
IngCol :=
CALCULATE (
[Ing] ;
FILTER ( ALL ( Pedidos[País] ); Pedidos[País] = «Colombia» )
)
Sabemos que CALCULATE tiene la habilidad de inyectar ese filtro creado en su parámetro a el contexto de filtro luego de crear una copia:
La naturaleza o mecanismos que generaron estos filtros son distintos.
Los filtros azules vienen de un contexto de filtro previo copiado luego de que la presencia de CALCULATE, mientras que el filtro rojo se generó de manera más reciente por los parámetros de filtros para luego ser inyectado
Como vemos son filtros de mecanismos o momentos diferentes, por lo que la propiedad 2 aquí no aplica, sino que aplica una nueva:
«Propiedad 4»: Si dos o más filtros afectan a la misma columna y además fueron generados por mecanismos diferentes, entonces, el filtro inyectado más reciente sobrescribe en su totalidad, visto de otro modo, los filtros del CALCULATE más reciente se imponen sobre los filtros nativos sobrescribiéndolos.
El contexto de filtro pasaría por un borrado del filtro azul, así:
Quedando finalmente:
→ Colorario: Anulación de Sobreescritura de Filtros ←
Es viable evitar la sobreescritura de filtros, en consecuencia, los campos que afecten a la misma columna se intercepten en sus elementos como indica la propiedad 2 antes de aplicarse al modelo de datos.
Para lograrlo debemos encerrar el parámetro de filtro en la función KEEPFILTERS, así:
IngCol :=
CALCULATE (
[Ing];
KEEPFILTERS ( FILTER ( ALL ( Pedidos[País] ); Pedidos[País] = «Colombia» ) )
)
La expresión también se puede escribir en syntax sugar así:
IngCol :=
CALCULATE ( [Ing]; KEEPFILTERS ( Pedidos[País] = «Colombia» ) )
Podemos imaginar como si el filtro inyectado al estar encerrado en un KEEPFILTERS cambia la semántica del filtro transformándolo a un filtro azul, esto quiere decir que realiza la intersección de sus elementos:
Finalmente:
«!»: Es decir, el comportamiento por defecto de los parámetros de filtros es de: Sobreescritura.
Es como si siempre fueran encerradas en una pseudo función OVERWRITEFILTERS.
IngCol :=
CALCULATE ( [Ing]; OVERWRITEFILTERS ( Pedidos[País] = «Colombia» ) )
La historia aún no ha acabado, puesto que nos hace falta entrar a ver con lupa un poco más los filtros en el contexto.
Topología de Filtros
Nos queda una temática pendiente, sin embargo, este artículo ya está demasiado largo por lo que lo dejaré para otro post en otro momento.
Eso es todo por ahora de un largo artículo, mi recomendación, es que lo leas varis veces: para interiorizar todo lo comentado y precisar en los detalles.
Por favor, comenta y regálame tus comentarios, feedback y correcciones; la verdad no me quiero sentir sólo en este minilibro online. Estaré leyendo y respondiendo todos los comentarios activamente.
— Miguel Caballero