Power BI desactivó tu relación y no te avisó
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
- Ve a la vista de Modelo (icono de diagrama)
- Busca líneas punteadas (no continuas)
- Haz clic en la línea para ver los detalles
Método sistemático
- Clic derecho en cualquier relación
- “Administrar relaciones”
- La columna “Activo” muestra el estado
| Indicador | Significado |
|---|---|
| Línea continua | Relación activa (se usa por defecto) |
| Línea punteada | Relació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:
- Desactiva temporalmente la relación activa entre esas tablas
- Activa la relación inactiva especificada
- Calcula la medida con ese nuevo contexto
- 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:
| PedidoID | FechaCreacion | FechaEntrega | FechaPago | Importe |
|---|---|---|---|---|
| 1 | 2025-01-15 | 2025-01-20 | 2025-01-18 | 100 |
| 2 | 2025-01-16 | 2025-01-25 | null | 200 |
Tabla Calendario (una sola):
| Fecha | Mes | Trimestre | Año |
|---|---|---|---|
| 2025-01-15 | Enero | Q1 | 2025 |
| … | … | … | … |
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
USERELATIONSHIPen 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ón | Recomendación |
|---|---|
| 2-3 fechas, pocas medidas | USERELATIONSHIP |
| Muchas fechas, muchas medidas | Role-playing dimensions |
| Usuarios técnicos | USERELATIONSHIP |
| Usuarios de negocio que crean sus propios reports | Role-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
USERELATIONSHIPsi 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:
- Revisa el modelo regularmente buscando líneas punteadas
- Documenta por qué ciertas relaciones están inactivas
- Usa
USERELATIONSHIPcuando necesites activarlas - 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.
También te puede interesar
Rolling 12 meses en DAX: la solución de dos calendarios
Cómo calcular rolling 12 months en Power BI correctamente. Tutorial DAX paso a paso.
Qué es DAX en Power BI: Guía práctica para principiantes (con ejemplos)
Aprende DAX desde cero: qué es, para qué sirve, diferencia con Power Query, las 5 funciones esenciales y errores comunes. Con ejemplos de código.
Medidas Rotativas en DAX: Cuando tus datos no se están quietos
Cómo manejar productos que cambian de categoría con el tiempo en DAX.