🔒 Cómo validar documentos copiados en SAP Business One usando SBO_SP_TransactionNotification (Guía completa)

En SAP Business One es muy común que los usuarios copien documentos para agilizar procesos. Por ejemplo, copiar una Salida de Mercancía y convertirla en una Entrada de Mercancía.

Sin embargo, esto puede generar un problema serio: los usuarios podrían modificar las líneas del documento (cambiar cantidades, precios o incluso eliminar artículos) antes de guardar.

Esto rompe la integridad de los datos del inventario.

La buena noticia es que SAP Business One permite evitar esto usando el procedimiento almacenado SBO_SP_TransactionNotification.

En esta guía aprenderás:

  • ✅ Qué es SBO_SP_TransactionNotification
  • ✅ Cómo validar documentos copiados
  • ✅ Cómo impedir cambios en líneas
  • ✅ Cómo evitar eliminar o agregar artículos
  • ✅ Cómo detectar si un documento fue copiado desde otro
  • ✅ Ejemplo completo listo para usar

📌 ¿Qué es SBO_SP_TransactionNotification?

SBO_SP_TransactionNotification es un procedimiento almacenado que se ejecuta automáticamente cada vez que se crea, actualiza o elimina un documento en SAP Business One.

Esto permite validar reglas de negocio personalizadas antes de que el documento se guarde.

Por ejemplo:

  • 🚫 Bloquear precios incorrectos
  • 🚫 Impedir documentos incompletos
  • 🚫 Validar campos obligatorios
  • 🚫 Evitar cambios en documentos copiados

Si una validación falla, SAP muestra un mensaje al usuario y el documento no se guarda.


🏗️ Cómo funciona la copia de documentos en SAP Business One

Cuando copias un documento en SAP Business One, el sistema guarda referencias al documento original.

Por ejemplo:

  • Salida de mercancía → Entrada de mercancía

Las tablas involucradas son:

DocumentoEncabezadoDetalle
Salida de mercancíaOIGEIGE1
Entrada de mercancíaOIGNIGN1

La relación entre documentos se guarda en las líneas del documento destino.


🔗 Campos que conectan los documentos

Cuando un documento se copia, SAP guarda estos campos en la tabla del detalle:

CampoDescripción
BaseEntryDocEntry del documento origen
BaseLineLínea del documento origen
BaseTypeTipo de documento origen
BaseRefNúmero visible del documento origen

Esto permite reconstruir la relación entre documentos.


📊 Ejemplo de relación entre documentos

Supongamos que existe esta salida de mercancía:

OIGE
DocEntry = 120
DocNum = 4500

Detalle:

IGE1
DocEntry = 120
LineNum = 0
ItemCode = ITEM001
Quantity = 5

Luego se crea una entrada copiando ese documento:

IGN1
DocEntry = 300
BaseEntry = 120
BaseLine = 0
BaseType = 60

Esto indica que la entrada proviene de esa salida.


⚠️ Problema común en SAP Business One

Cuando un usuario copia un documento, puede modificar datos antes de guardarlo:

  • ✏️ Cambiar cantidades
  • ✏️ Cambiar precios
  • ✏️ Eliminar líneas
  • ✏️ Agregar artículos

Esto puede provocar inconsistencias en inventario y contabilidad.


🎯 Objetivo de nuestra validación

La validación debe impedir:

  • ❌ eliminar líneas
  • ❌ agregar líneas
  • ❌ cambiar artículo
  • ❌ cambiar descripción
  • ❌ cambiar cantidad
  • ❌ cambiar precio
  • ❌ cambiar almacén
  • ❌ cambiar centro de costo

Pero solo cuando el documento proviene de una Salida de Mercancía.


🧠 Detectar si un documento fue copiado

La forma más sencilla es revisar si el campo BaseEntry tiene valor.

SELECT BaseEntry
FROM IGN1
WHERE DocEntry = :DocEntry

Si el valor existe, el documento proviene de otro.


🧾 Código completo de validación

IF :object_type = '59' AND (:transaction_type = 'A' OR :transaction_type = 'U') THEN

DECLARE v_base_doc INT;
DECLARE v_lineas_base INT;
DECLARE v_lineas_doc INT;
DECLARE v_changes INT;

SELECT TOP 1 "BaseEntry"
INTO v_base_doc
FROM "IGN1"
WHERE "DocEntry" = :list_of_cols_val_tab_del;

IF v_base_doc IS NOT NULL THEN

SELECT COUNT(*)
INTO v_lineas_base
FROM "IGE1"
WHERE "DocEntry" = v_base_doc;

SELECT COUNT(*)
INTO v_lineas_doc
FROM "IGN1"
WHERE "DocEntry" = :list_of_cols_val_tab_del;

IF v_lineas_base <> v_lineas_doc THEN
error := -9200;
error_message := 'No se permite eliminar o agregar lineas del documento copiado.';
END IF;

SELECT COUNT(*)
INTO v_changes
FROM "IGN1" A
JOIN "IGE1" B
ON A."BaseEntry" = B."DocEntry"
AND A."BaseLine" = B."LineNum"
WHERE A."DocEntry" = :list_of_cols_val_tab_del
AND (
IFNULL(A."ItemCode",'') <> IFNULL(B."ItemCode",'')
OR IFNULL(A."Dscription",'') <> IFNULL(B."Dscription",'')
OR IFNULL(A."Quantity",0) <> IFNULL(B."Quantity",0)
OR IFNULL(A."Price",0) <> IFNULL(B."Price",0)
OR IFNULL(A."WhsCode",'') <> IFNULL(B."WhsCode",'')
OR IFNULL(A."OcrCode",'') <> IFNULL(B."OcrCode",'')
);

IF v_changes > 0 THEN
error := -9201;
error_message := 'No se permite modificar las lineas del documento base.';
END IF;

END IF;

END IF;

🧪 Cómo probar la validación

Para verificar que todo funcione:

  1. Crear una salida de mercancía
  2. Copiarla a entrada de mercancía
  3. Intentar cambiar cantidad
  4. Intentar borrar una línea
  5. Intentar agregar una línea

Si la validación funciona correctamente, SAP mostrará un mensaje de error.


💡 Consejos profesionales

Los consultores SAP suelen aplicar estas recomendaciones:

  • 🔹 Validar siempre BaseType
  • 🔹 Comparar líneas con BaseLine
  • 🔹 Bloquear cambios críticos
  • 🔹 Usar mensajes claros para el usuario

🚀 Beneficios de esta validación

  • ✔ Evita errores humanos
  • ✔ Protege la integridad del inventario
  • ✔ Mantiene trazabilidad entre documentos
  • ✔ Mejora auditorías
  • ✔ Reduce inconsistencias contables

📚 Conclusión

El procedimiento SBO_SP_TransactionNotification es una herramienta poderosa para implementar reglas de negocio en SAP Business One.

Con la validación adecuada puedes garantizar que los documentos copiados mantengan exactamente la misma información que el documento original.

Esto mejora la calidad de los datos, reduce errores y asegura que el inventario refleje la realidad operativa de la empresa.

Si trabajas con SAP Business One, dominar este procedimiento es una habilidad clave para cualquier consultor o desarrollador.

💡 Implementar controles como este puede ahorrar muchos problemas en producción.