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.

Í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:
- Dos tablas locales cargadas desde CSV (
T_CUSTOMER_HISTyT_SALES), una dimensiónV_CUSTOMERy una vista factV_SALESasociada a ella. - La validación de las dos vistas con tres reglas en error: Unique Key Values, Referential Integrity y Unique Target Values.
- 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.
- 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
Paso:Sube los datos de ejemplo
Descarga los dos ficheros:
- clientes.csv: un maestro de clientes con historia. El cliente
C003cambió de región el 1 de abril de 2026, así que tiene dos filas:SURhasta el 31 de marzo yESTdesde 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_HISTdesdeclientes.csv. Revisa los tipos en Details: en mi prueba,VALID_FROMsalió como Date, peroVALID_TOsalió como String, seguramente por el9999-12-31. Cámbialo a Date en el desplegable Data Type. Después marca Set as Key enCUSTOMER_IDyVALID_FROM: es la clave real de la tabla, y por eso las dos filas deC003entran sin problema. Despliega. Repite conventas.csvpara crearT_SALES, conSALE_IDcomo clave.AMOUNTse 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.
- clientes.csv: un maestro de clientes con historia. El cliente
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_IDya aparece como clave: la vista hereda la parte de la clave de la tabla que sigue seleccionando, yVALID_FROMse 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.
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_IDcomo clave (menú ··· del atributo, Set as Key) y pasaAMOUNTa medida. En la sección Associations del panel lateral, pulsa + > Association y eligeV_CUSTOMER: Datasphere mapea soloCUSTOMER_IDconCUSTOMER_ID. Despliega.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.

Validación de V_CUSTOMER: Unique Key Values en error por la clave repetida de C003. - Unique Key Values: en error, con el mensaje 1 records are invalid. Es un registro por la clave
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_IDno se repite ni está vacío.
Ojo con la columna Object: en las dos reglas de la asociación no pone
V_SALES, sinoV_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).

Validación de V_SALES: las dos reglas de la asociación fallan y señalan a V_CUSTOMER. - Referential Integrity: en error, 2 records are invalid. Son las ventas 1010 y 1016 del cliente
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_REGIONque 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 sLEFT JOIN "V_CUSTOMER" AS cON 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 enSURy otra enEST. Y las dos ventas deC006(1.200) se quedan sin región. Es SQL puro: unJOINcontra una dimensión con claves repetidas multiplica filas. En un informe, esto es un total que no cuadra y nadie sabe por qué.
V_CHECK_REGION antes de corregir: 19 filas por 16.300 y dos ventas sin región (NULL). 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) RETURNSELECT * 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 deV_SALES. Despliega y abre la vista previa: salen las ventas 1010 y 1016, deC006, 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”.

Detail de Referential Integrity: número de registros, columna de la clave y Copy SQLScript. Paso:Corrige la dimensión y el maestro
La dimensión.
V_CUSTOMERtiene 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
C003se atribuyen aESTaunque entonces fuera deSUR. 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: abreT_CUSTOMER_HIST, pulsa Upload Data from CSV File y carga cliente_nuevo.csv, una fila conC006en la regiónCEN. 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.Paso:Vuelve a validar
Pulsa otra vez Validate en
V_CUSTOMERy enV_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
- What’s New in SAP Datasphere (SAP Help Portal)
- Validating View Data (SAP Help Portal)
- Set Key Columns to Uniquely Identify Records (SAP Help Portal)
- Creating a Local Table from a CSV File (SAP Help Portal)
- Load or Delete Local Table Data (SAP Help Portal)
- Create an Association to Define a Semantic Relationship Between Entities (SAP Help Portal)


