Power BI desactivó tu relación y no te avisó

· 7 min de lectura
Compartir:

TL;DR

  • Una línea punteada en el modelo = relación inactiva
  • Power BI desactiva relaciones automáticamente para evitar ambigüedad
  • Usa USERELATIONSHIP() para activarla en medidas específicas
  • El patrón más común: múltiples fechas contra una tabla Calendario
  • Alternativa: role-playing dimensions (duplicar la tabla)

El síntoma

Tienes un dashboard funcionando perfectamente. Un buen día, un visual deja de filtrar correctamente. Seleccionas un valor en un slicer y… el visual muestra todos los datos. O peor: cero.

Revisas las medidas. Están bien. Revisas los filtros del visual. Están bien. Revisas los datos. Existen.

Te estás volviendo loco. Y entonces vas a la vista de Modelo y… espera, ¿por qué esa línea está punteada?


Por qué Power BI desactiva relaciones

La regla de oro: un camino activo

Entre dos tablas, Power BI solo permite un camino activo de relaciones. Cuando creas una relación que genera ambigüedad (hay más de un camino posible), Power BI automáticamente desactiva una de ellas.

No te avisa con un popup. No te manda un email. No te pone un warning. Simplemente la puntea y sigue adelante como si nada.

Meses después, cuando un usuario te dice “esto no funciona”, te das cuenta de que llevas semanas con una relación muerta.

Cuándo ocurre (casos típicos)

1. Múltiples fechas en la misma tabla

Pedidos[FechaCreacion] → Calendario
Pedidos[FechaEntrega]  → Calendario (INACTIVA)
Pedidos[FechaPago]     → Calendario (INACTIVA)

2. Tablas puente con múltiples conexiones

Clientes → Ventas
Clientes → Devoluciones → Ventas (crea ciclo, se desactiva)

3. Relaciones bidireccionales que generan ciclos

Cuando activas “filtrar en ambas direcciones” y eso crea un bucle con otra relación existente.


Cómo detectar relaciones inactivas

Método visual

  1. Ve a la vista de Modelo (icono de diagrama)
  2. Busca líneas punteadas (no continuas)
  3. Haz clic en la línea para ver los detalles

Método sistemático

  1. Clic derecho en cualquier relación
  2. “Administrar relaciones”
  3. La columna “Activo” muestra el estado
IndicadorSignificado
Línea continuaRelación activa (se usa por defecto)
Línea punteadaRelación inactiva (ignorada a menos que la actives)

La solución: USERELATIONSHIP

No necesitas activar la relación permanentemente (eso puede crear otros problemas de ambigüedad). Puedes activarla solo en las medidas que la necesitan:

Ventas por Fecha Entrega =
CALCULATE(
    [Total Ventas],
    USERELATIONSHIP(
        Pedidos[FechaEntrega],
        Calendario[Fecha]
    )
)

Cómo funciona

USERELATIONSHIP hace tres cosas:

  1. Desactiva temporalmente la relación activa entre esas tablas
  2. Activa la relación inactiva especificada
  3. Calcula la medida con ese nuevo contexto
  4. Restaura todo al estado original

Solo afecta al cálculo de esa medida. El resto del modelo no se entera.

Sintaxis

USERELATIONSHIP(
    columna_origen,    -- La columna de la tabla de hechos
    columna_destino    -- La columna de la tabla de dimensión
)

Importante: Debes especificar las columnas exactas de la relación inactiva, en el orden correcto.


Ejemplo completo: Pedidos con múltiples fechas

El escenario

Tabla Pedidos:

PedidoIDFechaCreacionFechaEntregaFechaPagoImporte
12025-01-152025-01-202025-01-18100
22025-01-162025-01-25null200

Tabla Calendario (una sola):

FechaMesTrimestreAño
2025-01-15EneroQ12025

Las relaciones

  • Pedidos[FechaCreacion] → Calendario[Fecha] (ACTIVA)
  • Pedidos[FechaEntrega] → Calendario[Fecha] (inactiva)
  • Pedidos[FechaPago] → Calendario[Fecha] (inactiva)

Las medidas

// Ventas por fecha de creación (usa relación activa, normal)
Ventas Creadas = SUM(Pedidos[Importe])

// Ventas por fecha de entrega (activa relación inactiva)
Ventas Entregadas =
CALCULATE(
    SUM(Pedidos[Importe]),
    USERELATIONSHIP(Pedidos[FechaEntrega], Calendario[Fecha])
)

// Ventas por fecha de pago
Ventas Cobradas =
CALCULATE(
    SUM(Pedidos[Importe]),
    USERELATIONSHIP(Pedidos[FechaPago], Calendario[Fecha])
)

El resultado

Ahora puedes usar el mismo slicer de fechas para analizar:

  • Cuándo se crearon los pedidos
  • Cuándo se entregaron
  • Cuándo se cobraron

Tres perspectivas, una tabla Calendario, cero ambigüedad.


Patrón alternativo: Role-Playing Dimensions

Si USERELATIONSHIP te complica el modelo (muchas medidas, muchas fechas), considera duplicar la tabla de dimensión:

Cómo implementarlo

// En Power Query, crea referencias de la tabla Calendario
Calendario_Creacion = Calendario
Calendario_Entrega = Calendario
Calendario_Pago = Calendario

Ahora tienes:

  • Pedidos[FechaCreacion] → Calendario_Creacion[Fecha] (activa)
  • Pedidos[FechaEntrega] → Calendario_Entrega[Fecha] (activa)
  • Pedidos[FechaPago] → Calendario_Pago[Fecha] (activa)

Ventajas

  • No necesitas USERELATIONSHIP en cada medida
  • Slicers independientes por tipo de fecha
  • Más intuitivo para usuarios de negocio

Desventajas

  • Modelo más grande (tablas duplicadas)
  • Más mantenimiento si cambias la tabla original
  • Puede confundir si no documentas bien

Cuándo usar cada enfoque

SituaciónRecomendación
2-3 fechas, pocas medidasUSERELATIONSHIP
Muchas fechas, muchas medidasRole-playing dimensions
Usuarios técnicosUSERELATIONSHIP
Usuarios de negocio que crean sus propios reportsRole-playing dimensions

Errores comunes

1. Especificar las columnas al revés

// ❌ MAL: orden incorrecto
USERELATIONSHIP(Calendario[Fecha], Pedidos[FechaEntrega])

// ✅ BIEN: primero la columna de hechos, luego la de dimensión
USERELATIONSHIP(Pedidos[FechaEntrega], Calendario[Fecha])

2. Olvidar CALCULATE

// ❌ MAL: USERELATIONSHIP sin CALCULATE
Ventas Entregadas =
SUM(Pedidos[Importe]) + USERELATIONSHIP(...)

// ✅ BIEN: siempre dentro de CALCULATE
Ventas Entregadas =
CALCULATE(
    SUM(Pedidos[Importe]),
    USERELATIONSHIP(Pedidos[FechaEntrega], Calendario[Fecha])
)

3. Activar una relación que no existe

Si especificas columnas que no tienen relación (ni activa ni inactiva), DAX dará error. La relación debe existir en el modelo.

4. No probar con datos reales

La medida puede parecer correcta pero dar resultados inesperados si:

  • Hay nulls en la columna de fecha
  • La relación tiene la cardinalidad incorrecta
  • Hay filtros de informe/página que interfieren

Checklist de troubleshooting

Cuando un visual no filtra y sospechas de relaciones:

1. Verificar el modelo

  • ¿Hay líneas punteadas que no esperabas?
  • ¿La relación que necesitas existe?
  • ¿Está activa o inactiva?

2. Verificar la medida

  • ¿Usa USERELATIONSHIP si la relación es inactiva?
  • ¿Está dentro de CALCULATE?
  • ¿Las columnas están en el orden correcto?

3. Verificar los datos

  • ¿Hay valores en la columna de fecha?
  • ¿Las fechas coinciden entre tablas? (mismo formato, sin nulls)
  • ¿La cardinalidad es correcta? (1:N, no N:N)

4. Verificar el contexto

  • ¿Hay filtros de informe que interfieren?
  • ¿El slicer está conectado a la tabla correcta?
  • ¿Hay otras medidas que modifican el contexto?

Conclusión

Las relaciones inactivas no son un bug, son una feature. Power BI las desactiva para protegerte de resultados ambiguos.

El problema es que lo hace en silencio. Por eso:

  1. Revisa el modelo regularmente buscando líneas punteadas
  2. Documenta por qué ciertas relaciones están inactivas
  3. Usa USERELATIONSHIP cuando necesites activarlas
  4. Considera role-playing dimensions si el modelo se complica

Y la próxima vez que un visual “deje de funcionar”… ya sabes dónde mirar primero.


¿Te ha servido? Lee también Power Query: Documenta el porqué, no solo el qué sobre por qué esos filtros “raros” existen.

¿Empezando con DAX? Lee primero Qué es DAX en Power BI: Guía para principiantes.

¿Problemas de rendimiento? Mira cómo funciona VertiPaq para entender por qué tu modelo es lento.

¿Te ha sido útil? Compártelo

Compartir:

También te puede interesar