Saltar al contenido

Caso práctico: valida claves e integridad referencial en Datasphere

Paso a paso con Data Validation de Datasphere: claves duplicadas, ventas sin cliente y dimensiones no únicas, con datos de ejemplo y su efecto en los totales.

Por 12 min de lectura
Diagrama de una vista fact de ventas asociada a una dimensión de clientes en SAP Datasphere, con las reglas de Data Validation que fallan y el total de ventas inflado de 15.000 a 16.300
Índice del artículo

Cuando un total de SAP Analytics Cloud no cuadra con el origen, en mi experiencia la causa rara vez es la fórmula. Casi siempre es el modelo: una dimensión con claves repetidas que duplica filas al unirse con los hechos, o ventas cuyo cliente no existe en el maestro. SAP Datasphere tiene desde 2024 una herramienta para detectarlo antes de que lo vea negocio: la validación de datos de vistas (Data Validation). En este caso práctico provocamos esos dos errores clásicos con datos de ejemplo, vemos qué regla salta en cada uno, medimos cuánto inflan el total y los corregimos.

Qué vamos a construir

Un modelo mínimo de ventas de una distribuidora. Al acabar tendrás:

  1. Dos tablas locales cargadas desde CSV (T_CUSTOMER_HIST y T_SALES), una dimensión V_CUSTOMER y una vista fact V_SALES asociada a ella.
  2. La validación de las dos vistas con tres reglas en error: Unique Key Values, Referential Integrity y Unique Target Values.
  3. Una vista de control que demuestra el efecto: el total de ventas pasa de 15.000 a 16.300 por culpa de la dimensión.
  4. El modelo corregido y validado sin errores.

Todos los nombres técnicos son de ejemplo: usa los de tu convención.

Las reglas que usamos, tal como las describe SAP:

Categoría Regla Qué comprueba
Keys Unique Key Values Que ninguna combinación de valores de la clave se repita
Keys No Null Key Values Que ningún registro tenga la clave a nulo
Keys Referential Integrity Que cada valor de una columna de la fact asociada a una dimensión exista en la clave de esa dimensión. Solo en vistas con Semantic Usage Fact y para asociaciones de la fact a dimensiones
Keys Unique Target Values Que las dimensiones, text entities o jerarquías a las que apunta una asociación de la vista identifiquen cada registro de forma única en las columnas mapeadas, aunque no estén marcadas como clave

Hay más categorías (jerarquías, tipos de datos y text entities), pero no las necesitamos aquí.

Paso a paso

  1. Paso:Sube los datos de ejemplo

    Descarga los dos ficheros:

    • clientes.csv: un maestro de clientes con historia. El cliente C003 cambió de región el 1 de abril de 2026, así que tiene dos filas: SUR hasta el 31 de marzo y EST desde entonces.
    • ventas.csv: 16 ventas ficticias de julio a septiembre de 2026 que suman 15.000. Dos de ellas (1010 y 1016, 1.200 en total) son del cliente C006, que aún no está en el maestro.

    Ninguno de los dos “errores” es inventado: un maestro con historial de cambios y un cliente nuevo que factura antes de que alguien lo dé de alta son de lo más habitual en un proyecto.

    En el Data Builder, abre el menú de importación, elige Import CSV File y crea T_CUSTOMER_HIST desde clientes.csv. Revisa los tipos en Details: en mi prueba, VALID_FROM salió como Date, pero VALID_TO salió como String, seguramente por el 9999-12-31. Cámbialo a Date en el desplegable Data Type. Después marca Set as Key en CUSTOMER_ID y VALID_FROM: es la clave real de la tabla, y por eso las dos filas de C003 entran sin problema. Despliega. Repite con ventas.csv para crear T_SALES, con SALE_ID como clave. AMOUNT se detecta como Integer porque el fichero no lleva decimales; para sumar importes enteros vale.

    Pon las claves antes de desplegar: en el caso de los textos multilingües vimos que una tabla con datos no admite cambios de clave primaria.

  2. Paso:Crea la dimensión (con un error a propósito)

    Crea una SQL View V_CUSTOMER:

    V_CUSTOMER.sql (versión con error)
    SELECT "CUSTOMER_ID", "CUSTOMER_NAME", "REGION_ID"
    FROM "T_CUSTOMER_HIST"

    Ponle Semantic Usage = Dimension. Fíjate en que CUSTOMER_ID ya aparece como clave: la vista hereda la parte de la clave de la tabla que sigue seleccionando, y VALID_FROM se ha quedado fuera. Déjalo así y despliega.

    Este es el error típico: quien modela la dimensión piensa en “un cliente, una fila” y olvida que la tabla guarda el historial. Datasphere te deja desplegarla: en el caso de los textos multilingües desplegamos una vista con una clave repetida sin ningún aviso. La clave de una vista no se comprueba contra los datos al desplegar, y para eso está la validación.

  3. Paso:Crea la vista fact y su asociación

    Crea una SQL View V_SALES:

    V_SALES.sql
    SELECT "SALE_ID", "SALE_DATE", "CUSTOMER_ID", "AMOUNT"
    FROM "T_SALES"

    Ponle Semantic Usage = Fact, marca SALE_ID como clave (menú ··· del atributo, Set as Key) y pasa AMOUNT a medida. En la sección Associations del panel lateral, pulsa + > Association y elige V_CUSTOMER: Datasphere mapea solo CUSTOMER_ID con CUSTOMER_ID. Despliega.

  4. Paso:Valida la dimensión

    Abre V_CUSTOMER. En el panel de propiedades, pulsa Data Validation Status y después Validate. Si ya tienes abierto el panel de vista previa, también puedes ir a su pestaña Data Validation. Cuando termina, el campo Validated On muestra la fecha y la hora de la última ejecución.

    El resultado se muestra en una tabla con una fila por regla: categoría, regla, objeto validado y mensaje. Salen todas las reglas, también las que no aplican a esta vista, con el mensaje N/A. Lo que importa aquí:

    • Unique Key Values: en error, con el mensaje 1 records are invalid. Es un registro por la clave C003, aunque esté repetida dos veces.
    • No Null Key Values y Consistent Data Types: correctas.
    • Referential Integrity y Unique Target Values: N/A, porque la dimensión no tiene asociaciones.
    Pestaña Data Validation de V_CUSTOMER: Unique Key Values en error con 1 records are invalid, No Null Key Values y Consistent Data Types correctas, y el resto de reglas N/A
    Validación de V_CUSTOMER: Unique Key Values en error por la clave repetida de C003.
  5. Paso:Valida la vista fact

    Repite la validación en V_SALES. Aquí las reglas que nos interesan son las de la asociación:

    • Referential Integrity: en error, 2 records are invalid. Son las ventas 1010 y 1016 del cliente C006.
    • Unique Target Values: en error, Invalid records (1), porque la dimensión de destino no identifica cada cliente con un único registro.
    • Unique Key Values, No Null Key Values y Consistent Data Types: correctas, porque SALE_ID no se repite ni está vacío.

    Ojo con la columna Object: en las dos reglas de la asociación no pone V_SALES, sino V_CUSTOMER, el destino de la asociación.

    Fíjate en lo útil de la segunda regla: el error de la dimensión aparece también al validar la fact, que es lo que suele revisar quien construye el modelo encima. Para enterarte de que una dimensión asociada repite valores no hace falta validarla por separado (aunque, para ver el detalle, conviene hacerlo).

    Pestaña Data Validation de V_SALES: Referential Integrity con 2 records are invalid y Unique Target Values con Invalid records (1), ambas con V_CUSTOMER como objeto; Unique Key Values, No Null Key Values y Consistent Data Types correctas
    Validación de V_SALES: las dos reglas de la asociación fallan y señalan a V_CUSTOMER.
  6. Paso:Mide el efecto en los totales

    La validación te dice que algo está mal; esta vista te dice cuánto cuesta. Crea una SQL View V_CHECK_REGION que une las ventas con la dimensión como lo haría cualquier consulta. Al validar el SQL, Datasphere le puso Fact como Semantic Usage; cámbialo a Relational Dataset:

    V_CHECK_REGION.sql
    SELECT c."REGION_ID",
    SUM(s."AMOUNT") AS "AMOUNT",
    COUNT(*) AS "SALES_ROWS"
    FROM "V_SALES" AS s
    LEFT JOIN "V_CUSTOMER" AS c
    ON s."CUSTOMER_ID" = c."CUSTOMER_ID"
    GROUP BY c."REGION_ID"

    En la vista previa de datos salen cinco filas (sin fila de total; lo sumo yo en la tabla):

    REGION_ID AMOUNT SALES_ROWS
    CEN 3.350 3
    EST 6.900 6
    NOR 3.550 5
    SUR 1.300 3
    NULL 1.200 2
    Total 16.300 19

    Tenemos 16 ventas por 15.000, pero la consulta devuelve 19 filas por 16.300. Las tres ventas de C003 (1.300) cuentan dos veces, una en SUR y otra en EST. Y las dos ventas de C006 (1.200) se quedan sin región. Es SQL puro: un JOIN contra una dimensión con claves repetidas multiplica filas. En un informe, esto es un total que no cuadra y nadie sabe por qué.

    Vista previa de V_CHECK_REGION con cinco filas: NOR 3.550 y 5 ventas, CEN 3.350 y 3, SUR 1.300 y 3, EST 6.900 y 6, y NULL 1.200 y 2
    V_CHECK_REGION antes de corregir: 19 filas por 16.300 y dos ventas sin región (NULL).
  7. Paso:Saca la lista de registros que fallan

    En la validación de V_SALES, pulsa Details en la fila de Referential Integrity. El diálogo Detail explica la regla, repite el número de registros no válidos y la columna de la clave externa, y ofrece Copy SQLScript con el código que devuelve la lista completa. El propio diálogo dice qué hacer con él: crear una SQL view con el lenguaje SQLScript (Table Function), pegarlo, guardar, desplegar y ver la vista previa.

    Crea esa vista, por ejemplo V_DQ_SALES_NO_CUSTOMER. El código que copié era este:

    V_DQ_SALES_NO_CUSTOMER (SQLScript)
    RETURN
    SELECT * FROM "V_SALES"
    WHERE NOT EXISTS (
    SELECT 1 FROM "V_CUSTOMER"
    WHERE "V_SALES"."CUSTOMER_ID" = "V_CUSTOMER"."CUSTOMER_ID"
    );

    Al validarlo, Datasphere sustituye el * por las columnas de V_SALES. Despliega y abre la vista previa: salen las ventas 1010 y 1016, de C006, por 500 y 700. Las demás reglas en error también tienen su botón Details.

    Estas vistas son lo que yo entrego al equipo responsable del dato maestro: no “hay un problema de calidad”, sino “estas dos ventas tienen un cliente que no existe en el maestro”.

    Diálogo Detail de Referential Integrity en V_SALES: explicación de la regla, Number of invalid records: 2, Foreign key columns: CUSTOMER_ID, instrucciones para crear una vista SQLScript (Table Function) y el enlace Copy SQLScript
    Detail de Referential Integrity: número de registros, columna de la clave y Copy SQLScript.
  8. Paso:Corrige la dimensión y el maestro

    La dimensión. V_CUSTOMER tiene que devolver una fila por cliente. Para un informe por la región actual, filtra el registro vigente:

    V_CUSTOMER.sql (corregida)
    SELECT "CUSTOMER_ID", "CUSTOMER_NAME", "REGION_ID"
    FROM "T_CUSTOMER_HIST"
    WHERE "VALID_TO" = '9999-12-31'

    Despliega. Ojo, porque es una decisión de negocio, no técnica: con este filtro, las ventas de julio de C003 se atribuyen a EST aunque entonces fuera de SUR. Si negocio quiere la región histórica, la alternativa es una dimensión dependiente del tiempo, en la que SAP pide incluir la fecha de inicio de validez en la clave. Es otro caso práctico.

    El maestro. Para C006, lo correcto es darlo de alta en el origen. Aquí lo simulamos: abre T_CUSTOMER_HIST, pulsa Upload Data from CSV File y carga cliente_nuevo.csv, una fila con C006 en la región CEN. Deja sin marcar Delete Existing Data Before Upload: así la fila se añade a las seis que ya tienes. Lo comprobé en el Data Viewer de la tabla: quedan siete.

  9. Paso:Vuelve a validar

    Pulsa otra vez Validate en V_CUSTOMER y en V_SALES. Ahora todas las reglas de la categoría Keys salen con All records are valid.

    Abre de nuevo la vista previa de V_CHECK_REGION:

    REGION_ID AMOUNT SALES_ROWS
    CEN 4.550 5
    EST 6.900 6
    NOR 3.550 5
    Total 15.000 16

    Ahora tienes 16 filas por 15.000, igual que la tabla de ventas, y ninguna venta sin región.

Validación

Resumen de lo que debe devolver cada comprobación con los datos de ejemplo:

Comprobación Antes de corregir Después de corregir
V_CUSTOMER · Unique Key Values Error (C003) Sin incidencias
V_SALES · Referential Integrity Error: 2 registros (1010, 1016) Sin incidencias
V_SALES · Unique Target Values Error (V_CUSTOMER) Sin incidencias
V_CHECK_REGION · total AMOUNT / filas 16.300 / 19 15.000 / 16
V_CHECK_REGION · región vacía 1.200 (2 ventas) No aparece

Fíjate en cómo cuenta SAP: Unique Key Values da 1 records are invalid para una clave repetida dos veces, y Unique Target Values da Invalid records (1). Cuentan claves con problemas, no filas. El detalle de cuáles son te lo da Copy SQLScript.

Errores habituales

Síntoma Causa Solución
Un total del informe es mayor que el del origen La dimensión repite claves y el JOIN multiplica filas de la fact Valida la fact: Unique Target Values te señala la dimensión culpable
Aparece importe sin dimensión (vacío o “sin asignar”) Valores de la fact que no existen en la dimensión Referential Integrity + Copy SQLScript para sacar la lista y corregir el maestro
No aparece la regla Referential Integrity La vista no es Fact, o la asociación no va de la fact a una dimensión Pon Semantic Usage = Fact y crea la asociación desde la fact
Faltan reglas en el resultado La vista o sus fuentes tienen data access control o parámetros de entrada, o hay fuentes no replicadas en Datasphere Valida una vista intermedia sin DAC ni parámetros, o replica la fuente
La validación tarda demasiado Depende del número de registros y de la complejidad de los cálculos Cancel Validation en la barra del panel; valida una capa más baja o un subconjunto de datos
No puedes cambiar la clave de la tabla local La tabla ya tiene datos Crea la tabla vacía con la clave y cárgala con Upload Data from CSV File

Cierre

La validación de datos no sustituye a un proceso de calidad del dato, pero cuesta un clic y detecta los errores que más horas de reunión generan. Mi recomendación: valida siempre la vista fact sobre la que construyes un Analytic Model antes de enseñárselo a negocio y antes de cada transporte. Gracias a Unique Target Values, esa validación te avisa también si alguna dimensión asociada repite valores. Y cuando una regla falle, no te quedes en el contador: convierte el Copy SQLScript en una vista de control y entrégasela a quien puede arreglar el origen.

El siguiente paso natural es aplicar lo mismo a las jerarquías: hay reglas específicas para nodos con varios padres, jerarquías circulares, nodos que faltan en una jerarquía con directorio y, desde enero de 2026, nodos de datos mal colocados.

Fuentes