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 en object_type como en los valores de U_Tipo.
  • Siempre asigna error := 1 y un error_message claro 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