Contexto de filas en DAX

Veamos hoy el primero de los tres contextos que analizaremos en DAX, el contexto de fila, que se puede entender como “la fila actual”.

Si hemos creado una columna calculada, el contexto de fila está formado por los valores de cada fila individual y los valores de las columnas que están relacionadas con la fila actual. Hay también algunas funciones como EARLIER() y EARLIEST(), que reciben un valor de la fila actual y, a continuación, usan ese valor al realizar una operación en una tabla completa. Aunque veremos un ejemplo en otro momento, les adelanto un enlace con un caso muy interesante escrito en el blog sobre PowerPivot de SolidQ. Se trata del trabajo con la función EARLIER(). Esta función es bastante especial y muy útil ya que almacena en memoria dos conjuntos de contexto: un conjunto de contexto representa la fila actual para el bucle interno de la fórmula y el otro conjunto de contexto representa la fila actual para el bucle externo de la fórmula. DAX alimenta automáticamente los valores entre los dos bucles de forma que puede crear agregados complejos. Las funciones EARLIER y EARLIEST nos permiten recorrer las tablas y realizar cálculos, haciendo referencia a un valor de un bucle interno. Partiendo del concepto de recursividad y los bucles internos y externos, podemos apreciar la eficacia que proporcionan estas funciones. No se pierdan el artículo de Sergio Carrillo 🙂

Volvamos a nuestro ejemplo. Días atrás, cuando creamos una columna calculada, lo que vimos fue que, a partir de la fórmula, DAX determinó los valores de la columna nueva a partir de los valores encontrados fila a fila. Era un ejemplo muy sencillo, para iniciarnos; pero sea cual sea la complejidad de la expresión DAX utilizada para obtener la columna calculada, el contexto de fila para esa fórmula incluye los valores de todas las columnas en la fila actual. Si la tabla se relaciona con otra tabla, el contenido también incluye todos los valores de esa otra tabla que están relacionados con la fila actual. De relaciones y contextos hablamos antes y continuaremos hablando pronto.

Si, por otra parte, intentamos crear una medida con el mismo contenido que la fórmula, no podremos, porque no encuentra el contexto de fila que necesita, para ello tendríamos que aplicar otras condiciones. Veamos un ejemplo a partir del cálculo del Año, tal y como hicimos antes. Desde una celda del panel de valores escribimos la misma fórmula, que sabemos que es correcta.

En este caso, nos devuelve error, que dice que o la columna Fecha no existe o no existe una fila actual para esa columna, es decir, no es posible detectar el contexto de fila.

Aprovecho este ejemplo, para mostrar que cuando tenemos un error en la fórmula, en caso de que no sepamos cuál es concretamente la solución, y no queramos reescribirla en el futuro, podemos dejarla como comentario. Para ello, basta con que eliminemos los dos puntos (:), recibiremos un mensaje de advertencia y luego se mostrará en itálica, como comentario, sin tener ninguna implicación futura para el modelo, lo que puede resultar muy conveniente.

Estas situaciones son más interesantes cuando combinamos dos o más columnas, por ejemplo Cantidad * Precio, o Ingresos – (Costes + IVA), etc. Aquí el resultado seguiría mirando a cada columna; pero de la fila actual, no admite, como Excel un único valor de celda ni intervalos. Además, este contexto de la fila sigue automáticamente las relaciones entre las tablas para determinar qué filas de las tablas relacionadas están asociadas a la fila actual. Pronto veremos el efecto de las relaciones y las funciones RELATED(), RELATEDTABLE() y USERELATIONSHIP(). La función RELATED(), por ejemplo, expande el contexto de la fila actual para incluir los valores en una columna relacionada. Esto nos permite realizar búsquedas, entre otras cosas.

Otro aspecto interesante del contexto de fila, es el contexto de varias filas ya que DAX incluye funciones que iteran los cálculos sobre una tabla. Estas funciones pueden tener varias filas actuales y contextos de filas actuales. En términos de programación, podemos crear fórmulas que repitan un bucle interno y externo. Estamos hablando, por ejemplo de los agregados tipo X: SUMX, MAXX, etc. En término de Bases de datos relacionales y específicamente SQL Server, es como si estuviésemos tratando con subconsultas anidadas o en consultas con llamadas a funciones, o aplicando CROSS APPLY. Con DAX podemos compilar una fórmula única que devuelve el valor correcto y los resultados se actualizan automáticamente cada vez que agreguemos datos a las tablas. Ya lo veremos, de momento lo dejamos planteado, les puedo ir dejando otro ejemplo muy didáctico, escrito también en el blog sobre PowerPivot de SolidQ, que trata concretamente del uso de  SUMX dentro de una medida y además muestra el efecto del trabajo con contextos.

Hoy hemos mostrado el efecto del contexto de fila en DAX, su existencia, aplicación y posibles errores que puede generar. Como digo a veces, queda todo por ver, ha quedado introducido el primer tipo de contexto. En la próxima entrada hablaremos del contexto de consulta.

Tags: , , ,

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

A %d blogueros les gusta esto: