🔍
🗂️

Funciones INFO.VIEW

INFO.VIEW.TABLES, INFO.VIEW.COLUMNS, INFO.VIEW.MEASURES, INFO.VIEW.RELATIONSHIPS, auto-documenta tu modelo semántico directamente desde DAX

Intermedio Avanzado
🗂️

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. 🙌

🏆 Qué tienen de especial
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
⚠️ Requisitos
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

INFO.VIEW.TABLES()
Intermedio
Devuelve una tabla con información sobre cada tabla del modelo semántico: nombre, descripción, modo de almacenamiento (Import, DirectQuery, Dual), si está oculta y si es una tabla de fechas marcada.

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")
)
💡 Tip
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

INFO.VIEW.COLUMNS()
Intermedio
Devuelve una tabla con información sobre cada columna del modelo: nombre, tabla a la que pertenece, tipo de dato, si está oculta, formato y descripción.

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])
)
🏆 Best Practice
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

INFO.VIEW.MEASURES()
Intermedio
Devuelve una tabla con información sobre cada medida: nombre, expresión DAX, tabla de inicio, formato, si está oculta y su estado de validación.

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")
)
💡 Tip
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

INFO.VIEW.RELATIONSHIPS()
Intermedio
Devuelve una tabla con información sobre cada relación del modelo: tablas y columnas que conecta, cardinalidad, dirección de filtro cruzado y si está activa.

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"
)
⚠️ Alerta de rendimiento
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
💡 Consejo
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]
🚀 Siguiente paso
¡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. 🌸🚀