Procedimientos Almacenados en SAP Business One – Parte 3
Transaction Notification (TN)
Este procedimiento almacenado es ejecutado por SAP B1 previo a cada transacción de alta, baja, modificación, cancelación o cierre de un registro o una operación.
Dentro de este procedimiento podremos incluir controles o validaciones por medio de consultas SQL, que se ejecutaran previamente a que la transacción ocurra.
En caso de que el control sea aplicado SAP arrojara un error en pantalla y no se guardará o ejecutará transacción (alta, baja, modificación, cancelación o cierre).
Las posibilidades de controles y validaciones son muchas, algunos ejemplos claros de la utilización del TN:
• Realizar control para que un campo sea como obligatorio al momento del alta y modificación.
• Realizar un control para no permitir la modificación de un campo.
• No permitir ingresar determinados valores a campos.
• Controlar calculando importes o totales.
• Establecer reglas de controles como: si un campo tiene valor X, otro campo debe llevar valor Y.
• …
El procedimiento TN estándar (sin controles) de SAP Business One es el siguiente:

Parámetros
Para trabajar con el TN debemos entender y utilizar correctamente los parámetros de entrada del procedimiento almacenado, los cuales nos permiten descubrir cual, y que tipo de transacción es, los campos claves, cantidad de campos claves y la clave del registro de la transacción.
Los parámetros del TN son los siguientes:
in object_type nvarchar(20),
— SBO Object Type
Devuelve el número de objeto de la transacción que se está ejecutando. En SAP B1 cada transacción tiene un número identificatorio como la huella digital, ejemplo, las facturas de cliente son el @object_type 13, las de proveedores @object_type 18.
in transaction_type nchar(1),
— [A]dd, [U]pdate, [D]elete, [C]ancel, C[L]ose
En SAP B1 existen estos 5 tipos de transacciones y la validación dependerá de las que seleccionemos.
in num_of_cols_in_key int,
Devuelve la cantidad de campos claves de la tabla de la transacción que está ocurriendo.
in list_of_key_cols_tab_del nvarchar(255),
Devuelve el nombre de los campos claves de la tabla de la transacción que está ocurriendo.
in list_of_cols_val_tab_del nvarchar(255)
Devuelve el valor del campo clave de la transacción que se está ejecutando en SAP B1, ejemplo, si estas agregando un cliente nuevo devolverá el código interno del ese cliente. Esta es la variable clave a la hora de hacer un script para validar en SAP B1.
Variables de Salida – @error y @error_message
— Return values
error int; — Result (0 for no error)
error_message nvarchar (200); — Error string to be displayed
begin
error := 0;
error_message := N’Ok’;
Las variables de error y error_message son variables de salidas. error por defecto tiene el valor 0 lo que significa que no hay ningún error en la transacción que se está ejecutando. Para bloquear una transacción que no cumple ciertos parámetros hay que asignarle un valor numérico distinto a 0 a esta variable.
error_message contiene el mensaje que se mostrará al usuario cuando la transacción que este ejecutando sea no cumpla con las condiciones establecidas.
En caso de agregar nuevas variables, se deben incluir por encima de estas.
ADD YOUR CODE HERE
————————————————————————————————————
— ADD YOUR CODE HERE
————————————————————————————————————
En esta sección del procedimiento almacenado debemos incluir las sentencias SQL para validar las transacciones en SAP B1.
Validaciones y controles – Ejemplos
- Ejemplo 1: Que el nombre de un cliente y proveedor no pueda estar en blanco cuando lo ingresen o modifiquen.
Lo primero es declarar cuales son los valores de la transacción para que se active la validación. Para este caso usamos el tipo de objeto 2 (socios de negocios) y las transacciones A y U, crear y modificar.
IF (:transaction_type = ‘A’ OR :transaction_type = ‘U’) AND (:object_type = ‘2’)
THEN
END IF;
Luego agregamos dentro del THEN la validación. Usamos la tabla OCRD porque esta es la que contiene los socios de negocios, el campo clave de esta tabla es el “CardCode” y como necesitamos que sea el que se está usando en la transacción hacemos el match con la variable :list_of_cols_val_tab_del.
Lo primero es obtener e insertar en una variable el valor del campo. Para esto vamos a definir la variables CardName nvarchar(100); en la parte superior del TN.
ALTER PROCEDURE SBO_SP_TransactionNotification
(
in object_type nvarchar(30), — SBO Object Type
in transaction_type nchar(1), — [A]dd, [U]pdate, [D]elete, [C]ancel, C[L]ose
in num_of_cols_in_key int,
in list_of_key_cols_tab_del nvarchar(255),
in list_of_cols_val_tab_del nvarchar(255)
)
LANGUAGE SQLSCRIPT
AS
— Return values
CardName nvarchar(100);
Luego dentro de la validación vamos a obtener el valor del campo e ingresarlo dentro de la variable.
IF (:transaction_type = ‘A’ OR :transaction_type = ‘U’) AND (:object_type = ‘2’)
THEN
SELECT (SELECT T0.”CardName” FROM OCRD T0 WHERE T0.”CardCode” = :list_of_cols_val_tab_del)
INTO CardName FROM DUMMY;
END IF;
Luego debemos aplicar la validación requerida en la condición del IF. En este caso, si el campo es NULL o vacío debemos arrojar error. Para arrojar el error debemos ingresar valores en las variables de error y forzar la salida del procedimiento.
IF (:transaction_type = ‘A’ OR :transaction_type = ‘U’) AND (:object_type = ‘2’)
THEN
SELECT (SELECT T0.”CardName” FROM OCRD T0 WHERE T0.”CardCode” = :list_of_cols_val_tab_del)
INTO CardName FROM DUMMY;
IF (:CardName IS NULL OR :CardName = ”)
THEN
error := 0001;
error_message := ‘El Campo Nombre del SN no puede estar vacío.’;
select :error, :error_message FROM dummy;
Return;
END IF;
END IF;
- Ejemplo 2: Valida que el campo del proyecto no este vacío en cada línea de una factura de venta.
En este ejemplo, obtendremos la primera línea de una factura que se encuentre sin proyecto y arrojaremos el error, mostrando el número de línea que tiene el error. En caso de que no se encuentren líneas con faltante de proyecto, no se arroja el error.
IF (:transaction_type = ‘A’ OR :transaction_type = ‘U’) AND (:object_type = ’13’)
THEN
SELECT (SELECT TOP 1 (T0.”LineNum”) FROM INV1 T0 WHERE T0.”DocEntry” = :list_of_cols_val_tab_del AND (T0.”Project” = ” OR T0.”Project” IS NULL))
INTO LineaSinProject FROM DUMMY;
IF (:LineaSinProject <> ” OR :LineaSinProject IS NOT NULL)
THEN
error := 0002;
error_message := ‘Falta código de proyecto en línea nro. ‘ || (:LineaSinProject + 1);
select :error, :error_message FROM dummy;
Return;
END IF;
END IF;
Curso SQL desde cero básico para SAP Business One - SQL / HANA
Accede al curso en Udemy…
Sintaxis de consultas - SAP Business One
Aprende las particularidades de como escribir query’s en SAP B1. Sintaxis de consultas en SAP Business One.