1. Auditoría de registros huérfanos
1. Orphaned Record Audit
Detecta registros en hechos sin correlación en dimensiones.
Detects facts without dimension correlation.
#"RegistrosSinMatch" = Table.Join(Fact, "ID", Dim, "ID", JoinKind.LeftAnti)
20 casos prácticos para convertir dashboards en radares de integridad: duplicados, registros huérfanos, anomalías, excepciones y señales tempranas de riesgo.
20 practical cases to turn dashboards into integrity radars: duplicates, orphaned records, anomalies, exceptions, and early risk signals.
Power BI no debe limitarse a mostrar resultados bonitos. Bien diseñado, puede funcionar como un tablero de control forense que revela dónde se rompe la confianza en la data: relaciones incompletas, reglas violadas, patrones anormales y problemas que normalmente quedan ocultos en reportes operativos.
Power BI should not be limited to showing attractive results. When designed well, it can become a forensic control panel that reveals where data trust breaks: incomplete relationships, violated rules, abnormal patterns, and issues that normally remain hidden in operational reports.
Detecta registros en hechos sin correlación en dimensiones.
Detects facts without dimension correlation.
#"RegistrosSinMatch" = Table.Join(Fact, "ID", Dim, "ID", JoinKind.LeftAnti)
Identifica duplicados en llaves primarias para evitar inflar métricas.
Identifies duplicates in primary keys to avoid metric inflation.
Duplicados = COUNTROWS(Fact) - COUNTROWS(DISTINCT(Fact[ID]))
Alerta visual automática si el % de errores supera el 2%.
Automatic visual alert if error rate exceeds 2%.
Semáforo = SWITCH(TRUE(), [IssueRate] < 0.02, "Verde", [IssueRate] < 0.05, "Amarillo", "Rojo")
Identifica montos atípicos (3 desviaciones estándar).
Identifies outliers (3 standard deviations).
EsOutlier = IF(ABS([Monto] - AVERAGE([Monto])) > (3*[StdDev]), "ALERTA", "Normal")
Valida si quien creó una transacción fue también quien la aprobó.
Validates if transaction creator is the same as the approver.
SoD_Violation = IF(Fact[Creator_ID] = Fact[Approver_ID], "¡VIOLACIÓN!", "OK")
Detecta actividad fuera de horarios laborales estándar.
Detects activity outside standard working hours.
Weekend_Audit = IF(WEEKDAY(Fact[Date], 2) > 5, "AUDITAR", "OK")
Detecta montos terminados en 000 (posible invento contable).
Detects amounts ending in 000 (potential accounting fraud).
Redondeo_Alert = IF(MOD(Fact[Amount], 1000) = 0, "ALERTA: Redondeo", "OK")
Encuentra proyectos que finalizan antes de empezar.
Finds projects ending before they start.
Error_Fecha = IF(Fact[End_Date] < Fact[Start_Date], "ERROR: Fecha Final < Inicial", "OK")
Identifica proveedores con correos personales (Gmail).
Identifies suppliers using personal emails (Gmail).
Dominio_Error = IF(CONTAINSSTRING(Fact[Email], "@gmail.com"), "EXTERNO", "CORPORATIVO")
Cuenta filas críticas vacías para exigir calidad.
Counts critical empty rows to enforce quality.
Missing_Fields = COUNTROWS(FILTER(Fact, ISBLANK(Fact[MandatoryField])))
Compara valor original vs actual (cambios no autorizados).
Compares original vs actual (unauthorized changes).
Changed = IF(Fact[Current] <> Fact[Original], "MODIFICADO", "OK")
Fuerza tipos de datos para evitar errores de cálculo.
Forces data types to prevent calculation errors.
#"DetectType" = Table.TransformColumnTypes(Fact, {{"Monto", type number}})
Verifica cardinalidad para evitar modelos erróneos.
Verifies cardinality to prevent incorrect models.
-- Validar: Model View → Cardinalidad (One-to-Many)
Herramienta nativa para ver % de errores sin código.
Native tool to see % of errors without code.
-- Power Query: View → Column Quality / Column Profile
Lista blanca de dominios permitidos para proveedores.
Whitelist of authorized domains for suppliers.
Whitelisting = IF(NOT(Fact[Domain] IN {"empresa.com"}), "ERROR", "OK")
Detecta saltos anormales mes a mes.
Detects abnormal month-to-month jumps.
Delta = [Actual] - CALCULATE([Actual], PREVIOUSMONTH(DimDate[Date]))
Dataset con registros que fallaron cualquier auditoría.
Dataset with records failing any audit.
Excepciones = FILTER(Fact, Fact[Audit_Flag] <> "OK")
Asegura que datos sensibles no sean expuestos por RLS.
Ensures sensitive data isn't exposed by RLS.
-- Modeling → Manage Roles → Filtro: DimDept[Dept] = "RRHH"
Aísla documentos con longitud incorrecta.
Isolates documents with incorrect length.
ID_Error = IF(LEN(Fact[ID]) <> 11, "LONGITUD INCORRECTA", "OK")
Dashboard central: resume errores, tendencias y detalle.
Central dashboard: summarizes errors, trends, and detail.
-- Visualiza: Errores, tendencia de fallas y detalle forense