Hoy vengo con una entrada diferente, haciendo un paréntesis
en la saga de los cálculos visuales. Y es sobre las nuevas funciones INFO.VIEW
que se han liberado este mes de Octubre y son:
- INFO.VIEW.COLUMNS()
- INFO.VIEW.RELATIONSHIPS()
- INFO.VIEW.MEASURES()
- INFO.VIEW.TABLES()
Estas cuatro funciones, sólo estas cuatro, nos van a dar la visión del modelo semántico de manera automática. Sí sí, habéis leído bien, de manera automática. ¿Cómo? Pues vamos a verlo.
Tenemos el siguiente modelo en Power BI, que no deja de ser el modelo de Contoso:
Con la salvedad que la tabla DimDate, en vez de estar en el DW o en un Dataflow, la tenemos creada mediante DAX con la función CALENDARAUTO() para la demo en cuestión.
El esquema del modelo es en estrella con dos salvedades:
- La dirección de filtro cruzado entre la tabla DimProduct y FactSales, esta marcada “Ambas”
- La relación entre la tabla DimDate y FactSales esta inactiva.
Bien, ahora vamos a la vista de consultas, y ejecutamos la primera función, la función INFO.VIEW.COLUMNS() y esta nos devuelve la siguiente información:
Una tabla con varias columnas, entre las cuales podemos destacar las siguientes:
Name, Table, DataType, Description, IsHidden, Type y Expression.
Por lo que vamos a crear una métrica que nos devuelva una tabla con únicamente esas columnas. Para ello escribimos la siguiente expresión:
Ahora ya tenemos una tabla con menos columnas pero las que consideramos relevantes para nuestro objetivo (qué menos ¿no? 😊 )
Bien,
si nos fijamos en la columna que hemos llamado “Tipo”, y bajamos hasta el final
de la tabla observamos lo siguiente:
¿Qué es lo que he recuadrado en rojo? Las columnas calculadas creadas en DAX en el modelo, algo que no se debe hacer salvo ser último recurso y necesidad, habiendo sopesado todos los escenarios. (En este caso, es irrelevante ya que son las columnas de la tabla calendario pero a modo ilustrativo es útil).
Sobre la métrica anterior, vamos a modificarla con el objetivo de que sólo nos muestre las columnas calculadas:
Y ¡tachán! Ya tenemos una tabla que nos muestra todas las columnas calculadas de nuestro modelo. Ahora, sólo tenemos que copiarla y llevarla a nuestro modelo creando una tabla en el mismo:
Y la materializamos en el informe mediante la visual de tabla:
Y vemos… ¿qué estamos viendo? ¡Han aparecido nuevas columnas calculadas! O eso, o estábamos haciendo mal la consulta… No, no estábamos haciendo mal la consulta, sino que han aparecido más columnas calculadas debido a que hemos materializado la tabla “Tabla_Columnas”. Como no nos interesan esas columnas, lo que debemos hacer es modificar la expresión de manera que sólo veamos las tablas que interfieren en el modelo. Y para ello:
Y nos arroja lo siguiente:
En resumen, ¿qué es lo que hemos hecho con la función INFO.VIEW.COLUMNS()? Hemos obtenido la información de las columnas calculadas del modelo semántico con una simple función DAX adaptada a nuestras necesidades.
¿Seguimos con la siguiente función? Adelante. Ahora vamos a ver la función INFO.VIEW.RELATIONSHIPS(). Para ello seguimos el mismo proceder que para la anterior función, ir a la vista de consultas y ejecutarla para ver qué información nos trae.
Y de la información que nos da, vamos a quedarnos con las siguientes columnas:
ToTable, FromTable, RelationShip, CrossFilteringBehavior, IsActive.
Si nos fijamos en la tabla que nos ha devuelto, podemos observar las 2 “anomalías” que he comentado al inicio en cuanto al esquema del modelo:
- La bidereccionalidad.
- Inactividad de una relación.
Esto ya nos da una pista de posibles cosas a revisar en nuestro informe ¿no lo creéis? Bien, ahora materializamos la tabla de la misma manera que con la función anterior y arrastramos al lienzo una tabla:
Y tenemos de un simple vistazo la arquitectura de las relaciones de nuestro modelo.
También podemos generar un filtro que nos ayude a visualizar los datos, como puede ser el “Sentido” y si la relación está “Activa”:
Ya tenemos casi casi nuestro modelo documentado… ¡Y sin salir de Power BI Desktop! Continuamos para bingo como se suele decir, y vamos a por la siguiente función, que es la INFO.VIEW.MEASURES().
Como hasta ahora, vamos a la vista de consultas, y lanzamos la consulta de la función:
Y nos ha devuelto…. Un segundo, aquí hay algo raro… ¿Lo veis? ¿Por qué el campo de la columna Description de la medida Cantidad está en blanco?
¡Por qué no tiene la descripción la medida! Y debemos introducirla como buena práctica de documentación de proyectos:
Generamos la descripción de la métrica y de las columnas que
nos está devolviendo, nos vamos a quedar con las siguientes:
Name, Table, Description y Expression.
Para ello, generamos la siguiente métrica:
Y ahora sí que sí tenemos una vista global de nuestras métricas. Materializamos la tabla en nuestro modelo:
Y ya tenemos nuestro reporte de métricas del modelo, que nos permite de un vistazo ver la expresión, la ubicación de la misma así como su descripción. ¿Qué os parece? A mi espectacular… no digo más.
Seguimos con la última función, que no es otra que la función INFO.VIEW.TABLES().
¿Qué nos da esta función? Lo vemos en la vista de consultas:
Nos devuelve una tabla con todas las tablas de modelo semántico, pero hay un detalle a tener en cuenta… ¿Lo veis?
También nos está devolviendo las tablas que hemos creado previamente:
Y no tiene sentido que estas aparezcan… esto es como en la primera función, que si vamos al informe creado…
¿Se nos ha ido al traste? ¡No! No entremos en pánico, lo que está pasando es que está teniendo en cuenta las tablas que hemos ido creando y tiene fácil solución y no es otra que añadirlas a la cláusula IN del NOT:
De la siguiente manera:
Y volvemos a tener nuestro informe limpio y elegante:
Volviendo a la vista de consultas, estábamos con la función INFO.VIEW.TABLES() Y nos devolvía las tablas calculadas para la documentación del proyecto, bien, basta con que modifiquemos un poquito la métrica de la misma manera que la función COLUMNS.
Pero antes de hacerlo, nos vamos a quedar con las columnas:
Name, StorageMode, Expression
Y obtenemos lo siguiente:
Por lo que ya podemos materializar la tabla que nos hace el resumen del estado de nuestras tablas (nunca mejor dicho)
Si por ejemplo, nos conectamos al servicio a una tabla de algún modelo semántico, en este caso es la tabla DimCustomer, esta conexión se realiza mediante DQ, y por tanto se verá reflejada en nuestra tabla:
Y en la vista de la tabla que acabamos de crear, vemos que se ha actualizado:
Pero aún hay más, sí en vez de querer tener la información la queremos tener toda en una única tabla, basta con modificar la métrica y usar la función UNION para que nos anexe todas las tablas. ¿Cómo? Con la siguiente métrica:
¿Qué no la ves? No te preocupes, he dejado aquí un pbit con el archivo que te documenta cualquier proyecto para que lo puedas reutilizar.
En resumen, y en mi humilde opinión, las funciones INFO.VIEW en DAX son herramientas potentes y útiles para analizar y documentar un modelo de datos. Cada una ofrece una vista detallada sobre distintos aspectos clave del modelo, facilitando la inspección y el mantenimiento.
INFO.VIEW.COLUMNS(): Proporciona una vista completa de todas las columnas en el modelo, incluyendo detalles como el nombre, tipo de datos, descripción, si está oculta, y si es calculada o estándar. Es ideal para revisar y documentar cada columna, y resulta especialmente útil para identificar rápidamente columnas calculadas.
INFO.VIEW.MEASURES(): Muestra una lista detallada de todas las medidas en el modelo, incluyendo su nombre, expresión DAX, descripción y tabla de origen. Esta función es fundamental para documentar las medidas definidas, revisar sus fórmulas y garantizar que todas están correctamente descritas y organizadas en las tablas correspondientes.
INFO.VIEW.RELATIONSHIPS(): Permite inspeccionar todas las relaciones entre las tablas del modelo, detallando el origen y destino de cada relación, su sentido de filtro cruzado (unidireccional o bidireccional), y si la relación está activa o no. Esta función facilita el análisis de la estructura del modelo y asegura que las relaciones estén configuradas correctamente para una propagación de filtros eficaz.
INFO.VIEW.TABLES(): Proporciona información sobre todas las tablas en el modelo, incluyendo su nombre, modo de almacenamiento (por ejemplo, Import o DirectQuery), descripción, y cualquier expresión DAX usada en tablas calculadas. Es ideal para revisar rápidamente el tipo de almacenamiento y asegurarse de que todas las tablas están documentadas y organizadas adecuadamente.
Y vosotros, ¿qué os parece?
¡Nos vemos en los datos!