🔒 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:
| Documento | Encabezado | Detalle |
|---|---|---|
| Salida de mercancía | OIGE | IGE1 |
| Entrada de mercancía | OIGN | IGN1 |
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:
| Campo | Descripción |
|---|---|
| BaseEntry | DocEntry del documento origen |
| BaseLine | Línea del documento origen |
| BaseType | Tipo de documento origen |
| BaseRef | Nú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:
- Crear una salida de mercancía
- Copiarla a entrada de mercancía
- Intentar cambiar cantidad
- Intentar borrar una línea
- 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.
Deja un comentario