Funciones INFO.VIEW
INFO.VIEW.TABLES, INFO.VIEW.COLUMNS, INFO.VIEW.MEASURES, INFO.VIEW.RELATIONSHIPS, auto-documenta tu modelo semántico directamente desde DAX
El modelo que se documenta a sí mismo
¿Alguna vez has llegado a un modelo de Power BI heredado y no sabías qué medidas había, qué significaban las columnas o cómo estaban relacionadas las tablas? Las funciones INFO.VIEW llegaron en octubre de 2024 para resolver exactamente eso: devuelven una tabla con metadatos de tu propio modelo, y lo mejor es que se actualizan solas cada vez que haces un refresh. 🙌
Las funciones INFO.VIEW son únicas en DAX porque:
✅ Se pueden usar en tablas calculadas, columnas calculadas y medidas
✅ Se actualizan automáticamente al refrescar el modelo
✅ Usan nombres amigables (nombre de tabla, no TableID numérico)
✅ Se pueden combinar con FILTER, SELECTCOLUMNS, ADDCOLUMNS...
✅ Sirven para crear páginas de documentación automática en el propio informe
Requieren permiso de escritura sobre el modelo semántico. No funcionan en Power BI Desktop en modo de conexión en vivo (Live Connection).
Dónde se pueden usar
| CONTEXTO | INFO.VIEW.* | INFO.* (sin VIEW) |
|---|---|---|
| Tabla calculada | ✅ | ❌ |
| Columna calculada | ✅ | ❌ |
| Medida | ✅ | ❌ |
| DAX Query View | ✅ | ✅ |
Las funciones INFO.* sin VIEW (más de 50) solo funcionan en DAX Query View, son los equivalentes a los DMVs de Analysis Services y están pensadas para administradores avanzados. En esta página nos centramos en las 4 funciones INFO.VIEW que cualquier desarrolladora puede usar en su modelo.
INFO.VIEW.TABLES, todas las tablas del modelo
Columnas que devuelve:
| COLUMNA | TIPO | DESCRIPCIÓN |
|---|---|---|
| [Name] | Texto | Nombre de la tabla |
| [Description] | Texto | Descripción (si la has añadido en el modelo) |
| [StorageMode] | Texto | "Import", "DirectQuery", "Dual", "Push" |
| [IsHidden] | Booleano | TRUE si la tabla está oculta en el panel de campos |
| [IsDateTable] | Booleano | TRUE si está marcada como tabla de fechas |
| [SystemFlags] | Entero | Flags internos del sistema |
Ejemplos:
// Ver todas las tablas del modelo:
EVALUATE INFO.VIEW.TABLES()
// Solo las tablas visibles (no ocultas):
EVALUATE
FILTER(
INFO.VIEW.TABLES(),
NOT [IsHidden]
)
// Tabla calculada para documentación automática:
Doc_Tablas =
SELECTCOLUMNS(
FILTER(INFO.VIEW.TABLES(), NOT [IsHidden]),
"Tabla", [Name],
"Descripción", [Description],
"Modo", [StorageMode],
"Es tabla de fechas", [IsDateTable]
)
// Contar tablas de cada tipo de almacenamiento:
Tablas Import =
COUNTROWS(
FILTER(INFO.VIEW.TABLES(), [StorageMode] = "Import")
)
Si añades descripciones a tus tablas en el modelo (en la vista de modelo, panel de propiedades), INFO.VIEW.TABLES las muestra en la columna [Description]. ¡Es la base de una documentación automática de calidad!
INFO.VIEW.COLUMNS, todas las columnas del modelo
Columnas que devuelve:
| COLUMNA | TIPO | DESCRIPCIÓN |
|---|---|---|
| [TableName] | Texto | Nombre de la tabla que contiene la columna |
| [Name] | Texto | Nombre de la columna |
| [DataType] | Texto | "Integer", "Double", "String", "DateTime", "Boolean", "Currency" |
| [IsHidden] | Booleano | TRUE si la columna está oculta |
| [Description] | Texto | Descripción de la columna |
| [FormatString] | Texto | Formato aplicado a la columna |
| [IsNullable] | Booleano | TRUE si puede contener valores nulos |
| [Expression] | Texto | Si es columna calculada, la expresión DAX (si no, BLANK) |
Ejemplos:
// Todas las columnas del modelo:
EVALUATE INFO.VIEW.COLUMNS()
// Solo columnas de tipo fecha:
EVALUATE
FILTER(
INFO.VIEW.COLUMNS(),
[DataType] = "DateTime"
)
// Diccionario de datos automático (tabla calculada):
Diccionario_Datos =
SELECTCOLUMNS(
FILTER(
INFO.VIEW.COLUMNS(),
NOT [IsHidden]
),
"Tabla", [TableName],
"Columna", [Name],
"Tipo", [DataType],
"Descripción", [Description],
"Formato", [FormatString]
)
// Contar columnas de texto (útil para saber qué hay en el modelo):
N° Columnas Texto =
COUNTROWS(
FILTER(INFO.VIEW.COLUMNS(), [DataType] = "String")
)
// Detectar columnas calculadas (tienen expresión DAX):
Columnas_Calculadas =
FILTER(
INFO.VIEW.COLUMNS(),
NOT ISBLANK([Expression])
)
Combina INFO.VIEW.COLUMNS con INFO.VIEW.TABLES para crear un diccionario de datos completo con tabla + columna + descripción + tipo. Úsalo en una página dedicada dentro de tu informe para que cualquier persona que lo use entienda qué significa cada campo.
INFO.VIEW.MEASURES, todas las medidas del modelo
Columnas que devuelve:
| COLUMNA | TIPO | DESCRIPCIÓN |
|---|---|---|
| [Table] | Texto | Tabla donde está definida la medida |
| [Name] | Texto | Nombre de la medida |
| [Expression] | Texto | La fórmula DAX completa de la medida |
| [FormatString] | Texto | Formato (ej: "#,##0.00 €", "0.00%") |
| [Description] | Texto | Descripción de la medida |
| [IsHidden] | Booleano | TRUE si la medida está oculta |
| [State] | Texto | Estado: "Ready" (válida) o error |
Ejemplos:
// Ver todas las medidas con su fórmula:
EVALUATE INFO.VIEW.MEASURES()
// Medidas con errores en la fórmula:
EVALUATE
FILTER(
INFO.VIEW.MEASURES(),
[State] <> "Ready"
)
// Tabla calculada para documentar todas las medidas:
Doc_Medidas =
SELECTCOLUMNS(
INFO.VIEW.MEASURES(),
"Tabla", [Table],
"Medida", [Name],
"Descripción", [Description],
"Fórmula DAX", [Expression],
"Formato", [FormatString],
"Estado", [State]
)
// Contar medidas del modelo:
Total Medidas = COUNTROWS(INFO.VIEW.MEASURES())
// Medidas sin descripción (para recordarte añadirlas):
Medidas Sin Documentar =
COUNTROWS(
FILTER(
INFO.VIEW.MEASURES(),
ISBLANK([Description])
)
)
// Buscar medidas que usan CALCULATE:
Medidas_con_CALCULATE =
FILTER(
INFO.VIEW.MEASURES(),
CONTAINSSTRING([Expression], "CALCULATE")
)
La columna [State] = 'Ready' indica que la medida es válida y está compilada correctamente. Si ves alguna con otro estado, ¡tienes una medida rota en tu modelo que quizás no sabías que existía! INFO.VIEW.MEASURES es fantástica para hacer auditorías de calidad.
INFO.VIEW.RELATIONSHIPS, todas las relaciones del modelo
Columnas que devuelve:
| COLUMNA | TIPO | DESCRIPCIÓN |
|---|---|---|
| [FromTableName] | Texto | Tabla del lado "muchos" (tabla de hechos) |
| [FromColumnName] | Texto | Columna de la tabla muchos |
| [ToTableName] | Texto | Tabla del lado "uno" (tabla de dimensión) |
| [ToColumnName] | Texto | Columna de la tabla uno |
| [CrossFilteringBehavior] | Texto | "OneDirection", "BothDirections", "Automatic" |
| [IsActive] | Booleano | TRUE si la relación está activa |
| [Cardinality] | Texto | "ManyToOne", "OneToOne", "ManyToMany" |
| [RelyOnReferentialIntegrity] | Booleano | TRUE si asume integridad referencial |
Ejemplos:
// Ver todas las relaciones del modelo:
EVALUATE INFO.VIEW.RELATIONSHIPS()
// Solo relaciones activas:
EVALUATE
FILTER(
INFO.VIEW.RELATIONSHIPS(),
[IsActive] = TRUE
)
// Tabla calculada con el diagrama de relaciones en texto:
Doc_Relaciones =
ADDCOLUMNS(
INFO.VIEW.RELATIONSHIPS(),
"Relación", [FromTableName] & "[" & [FromColumnName] & "] → "
& [ToTableName] & "[" & [ToColumnName] & "]",
"Tipo", [Cardinality],
"Filtro", [CrossFilteringBehavior],
"Activa", IF([IsActive], "✅", "⚠️ Inactiva")
)
// Detectar relaciones bidireccionales (que pueden afectar rendimiento):
Relaciones_Bidireccionales =
FILTER(
INFO.VIEW.RELATIONSHIPS(),
[CrossFilteringBehavior] = "BothDirections"
)
Si tienes muchas relaciones con CrossFilteringBehavior = 'BothDirections', puede ser una señal de alerta de rendimiento. INFO.VIEW.RELATIONSHIPS te permite detectarlas todas de un vistazo y documentarlas.
La familia completa: INFO.VIEW.* vs INFO.*
Además de las 4 funciones INFO.VIEW, DAX tiene más de 50 funciones INFO.* (sin VIEW) introducidas en diciembre de 2023. Estas son los equivalentes exactos de los DMVs (Dynamic Management Views) de Analysis Services, ahora disponibles como funciones DAX.
Diferencias clave:
| CARACTERÍSTICA | INFO.VIEW.* | INFO.* |
|---|---|---|
| Disponible desde | Octubre 2024 | Diciembre 2023 |
| Uso en tablas calculadas | ✅ Sí | ❌ Solo DAX Query View |
| Nombres amigables | ✅ Sí (TableName) | ⚠️ A veces usa IDs |
| Funciones disponibles | 4 | 50+ |
| Para quién | Cualquier dev | Admins y power users |
Las INFO.* más útiles para DAX Query View:
// Ver medidas (versión INFO sin VIEW, solo en DAX Query View):
EVALUATE INFO.MEASURES()
// Diferencia con INFO.VIEW.MEASURES(): usa TableID en lugar de
// TableName, tienes que hacer un JOIN con INFO.TABLES() para obtener
// el nombre legible
// Las más usadas en DAX Query View:
INFO.MEASURES() -- medidas (con TableID, no nombre)
INFO.COLUMNS() -- columnas
INFO.TABLES() -- tablas
INFO.RELATIONSHIPS() -- relaciones
INFO.PARTITIONS() -- particiones
INFO.HIERARCHIES() -- jerarquías
INFO.CALCULATIONGROUPS() -- grupos de cálculo
INFO.CALCULATIONITEMS() -- ítems de cálculo
INFO.ROLES() -- roles de seguridad RLS
INFO.KPIS() -- KPIs definidos en el modelo
Para el trabajo del día a día, usa INFO.VIEW.*, son más simples y funcionan en tablas calculadas. Reserva INFO.* para consultas administrativas avanzadas en DAX Query View o DAX Studio.
Patrones: auto-documentación del modelo
Patrón 1, Página de documentación automática completa
Crea una tabla calculada que combine las 4 funciones para tener una documentación automática del modelo completo.
// Tabla calculada: diccionario completo de columnas con tipo
Diccionario_Modelo =
SELECTCOLUMNS(
FILTER(
INFO.VIEW.COLUMNS(),
NOT [IsHidden]
),
"Tabla", [TableName],
"Campo", [Name],
"Tipo de dato", [DataType],
"Descripción", [Description],
"Es calculada", IF(NOT ISBLANK([Expression]), "Sí ⚙️", "No")
)
Patrón 2, Dashboard de calidad del modelo
Estas medidas en un visual tipo scorecard dan una visión rápida del estado de documentación del modelo:
Total Tablas = COUNTROWS(INFO.VIEW.TABLES())
Total Columnas = COUNTROWS(INFO.VIEW.COLUMNS())
Total Medidas = COUNTROWS(INFO.VIEW.MEASURES())
Total Relaciones = COUNTROWS(INFO.VIEW.RELATIONSHIPS())
Tablas sin descripción =
COUNTROWS(FILTER(INFO.VIEW.TABLES(), ISBLANK([Description])))
Medidas sin descripción =
COUNTROWS(FILTER(INFO.VIEW.MEASURES(), ISBLANK([Description])))
% Medidas documentadas =
DIVIDE(
COUNTROWS(FILTER(INFO.VIEW.MEASURES(), NOT ISBLANK([Description]))),
[Total Medidas]
)
Medidas con error =
COUNTROWS(FILTER(INFO.VIEW.MEASURES(), [State] <> "Ready"))
Patrón 3, Exportar documentación a Excel
En DAX Query View, puedes ejecutar esta query y copiar los resultados directamente a Excel con el botón Copiar:
EVALUATE
ADDCOLUMNS(
SELECTCOLUMNS(
INFO.VIEW.MEASURES(),
"Tabla", [Table],
"Medida", [Name],
"Descripción", [Description],
"Fórmula", [Expression],
"Formato", [FormatString]
),
"Modelo", "Mi Modelo Power BI",
"Fecha exportación", FORMAT(NOW(), "DD/MM/YYYY HH:MM")
)
ORDER BY [Tabla], [Medida]
¡Con INFO.VIEW ya puedes crear modelos que se documentan solos! Es una de las funcionalidades más prácticas de DAX para proyectos en equipo. Añade descripciones a tus tablas, columnas y medidas desde hoy, futuras tú y tu equipo os lo agradeceréis. 🌸🚀