Si estás desarrollando en SAP Business One sobre HANA y necesitas validar datos en una tabla de usuario tipo documento (UDO), es probable que hayas enfrentado el problema de que tu código en SBO_SP_TransactionNotification no se ejecuta. Aquí te explico por qué y cómo solucionarlo.
El problema
En SAP HANA, cuando una tabla de usuario (UDT) se registra formalmente como Objeto Definido por el Usuario (UDO) de tipo documento, el parámetro :object_type que recibe el procedimiento almacenado no es el nombre de la tabla física (como '@MTTOCONFIG'), sino el nombre del objeto registrado (el campo Name en la tabla OUDO).
Por eso, aunque tu validación funcionaba para algunas tablas (como USUARIOALMACEN), para otras simplemente no se ejecutaba.
Ejemplo real:
Tabla física: @MTTOCONFIG
Nombre del UDO registrado: ConfigMtto
✅ La condición correcta es: UPPER(:object_type) = 'CONFIGMTTO'
Solución: Código final que funciona
IF UPPER(:object_type) = 'CONFIGMTTO'
AND (:transaction_type = 'A' OR :transaction_type = 'U') THEN
DECLARE v_U_Tipo VARCHAR(100);
DECLARE v_U_Code VARCHAR(100);
-- Obtener valores de la cabecera (la tabla @MTTOCONFIG)
SELECT "U_Tipo", "U_Code"
INTO v_U_Tipo, v_U_Code
FROM "@MTTOCONFIG"
WHERE "DocEntry" = :list_of_cols_val_tab_del;
-- Validación según el tipo
IF UPPER(v_U_Tipo) = 'TIPOMQ' THEN
IF NOT EXISTS (SELECT 1 FROM "@TYPEMTTO" WHERE "Code" = v_U_Code) THEN
error := 1;
error_message := N'El código ' || IFNULL(v_U_Code, 'NULL') || N' no existe en @TYPEMTTO (TipoMQ).';
END IF;
ELSEIF UPPER(v_U_Tipo) = 'EQUIPO' THEN
IF NOT EXISTS (SELECT 1 FROM OITM WHERE "ItemCode" = v_U_Code) THEN
error := 1;
error_message := N'El código ' || IFNULL(v_U_Code, 'NULL') || N' no existe en OITM (Equipo).';
END IF;
END IF;
END IF;Puntos clave
- Usa el nombre del UDO, no el de la tabla física. Para conocerlo, consulta:
SELECT "Name" FROM "OUDO" WHERE "TableName" = '@TU_TABLA'; - La clave primaria en documentos es
DocEntry, y llega directamente en:list_of_cols_val_tab_del. - Usa
UPPER()para evitar problemas de mayúsculas/minúsculas tanto enobject_typecomo en los valores deU_Tipo. - Siempre asigna
error := 1y unerror_messageclaro para que SAP muestre el mensaje y cancele la transacción.
¿Por qué funciona con USUARIOALMACEN y no con MTTOCONFIG?
Porque USUARIOALMACEN también es un UDO registrado, y su nombre coincide con el de la tabla. En cambio, ConfigMtto fue registrado con un nombre diferente al de la tabla física. Siempre verifica el campo Name en OUDO.
✅ Resultado: Con esta modificación, la validación se ejecuta correctamente y se impide guardar datos incorrectos (por ejemplo, un U_Code que no existe en @TYPEMTTO).
¿Te fue útil esta solución? Apoya mi trabajo en Patreon y accede a más contenido exclusivo sobre SAP Business One, HANA y automatizaciones.❤️ Apóyame en Patreon