Está en la página 1de 4

Aprende a usar el Transaction Notification

El Transaction Notification o TN es un procedimiento almacenado en las bases de datos de SAP


Business One en donde el DBA (data base administrator) puede incluir validaciones para que se
disparan al cumplir ciertas condiciones para prevenir que los usuarios ingresen datos errneos o se
les olvide llenar un campo obligatorio, etc.

Bueno, dijimos que es un procedimiento almacenado, as que lo podemos encontrar en la ruta [BD]
\ [Programmability] \ [Stored Procedures] \ [SBO_SP_TransactionNotification]. La estructura por
defecto del TN es la siguiente.
USE [NOMBRE_DE_LA_BD]
GO
/****** Object: StoredProcedure [dbo].[SBO_SP_TransactionNotification] Script Date: 10/12/2012
12:24:21 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER proc [dbo].[SBO_SP_TransactionNotification]
@object_type nvarchar(20), -- SBO Object Type
@transaction_type nchar(1), -- [A]dd, [U]pdate, [D]elete, [C]ancel, C[L]ose
@num_of_cols_in_key int,
@list_of_key_cols_tab_del nvarchar(255),
@list_of_cols_val_tab_del nvarchar(255)
AS
begin
-- Return values
declare @error int -- Result (0 for no error)
declare @error_message nvarchar (200) -- Error string to be displayed
select @error = 0
select @error_message = N'Ok'
-------------------------------------------------------------------------------------------------------------ADD YOUR CODE HERE
--------------------------------------------------------------------------------------------------------------- Select the return values
select @error, @error_message
end
Donde dice, "ADD YOUR CODE HERE" es desde donde nosotros podemos incluir sentencias
SQL para validar las transacciones en SAP B1.

Primero, analizaremos las variables y luego como escribir un cdigo que sea satisfactorio.

@object_type, Devuelve el nmero del objeto de la transaccin que se est ejecutando. En SAP B1
cada transaccin tiene un nmero identificatorio como la huella digital, ejemplo, las facturas de
cliente son el @object_type 13, las de proveedores @object_type 18, etc, etc.

@transaction_type, En SAP B1 existen 5 tipos de transacciones, [A]dd (aadir o crear), [U]pdate


(actualizar o modificar), [D]elete (eliminar), [C]ancel (cancelar) y C[L]ose (cerrar). La letra entre
corchetes determina el valor del @transaction_type, ejemplo, si queremos validar la creacion de
algun documento, el @transaction_type debe tener el valor 'A'.

@num_of_cols_in_key, Devuelve el nmero de campos llave de la tabla que se est afectando.

@list_of_key_cols_tab_del, Devuelve el nombre de los campos llave de la tabla que se est


afectando.

@list_of_cols_val_tab_del, Devuelve el valor del campo llave de la transaccin que se est


ejecutando en SAP B1, ejemplo, si estas agregando un cliente nuevo devolver el cdigo interno
del ese cliente. Esta es la variable clave a la hora de hacer un script para validar en SAP B1.

@error, Es una variable de salida, por defecto tiene el valor 0 lo que significa que no hay ningn
error en la transaccin que se est ejecutando. Para bloquear una transaccin que no cumple
ciertos parmetros hay que asignarle un valor numrico distinto a 0 a esta variable.

@error_message, Contiene el mensaje que se mostrar al usuario cuando la transaccin que este
ejecutando sea no cumpla con las condiciones establecidas.

Ya hemos explicado las variables del TN, ahora procederemos a hacer algunos cdigos de
ejemplo.

El primer cdigo ser que el nombre de un cliente y proveedor no pueda estar en blanco cuando
lo ingresen o modifiquen.

Empezamos, lo primero es declarar cuales son los valores de la transaccin para que se active
la validacin. Para este caso usamos el tipo de objeto 2 (socios de negocios) y las transacciones A
y U, crear y modificar.

IF @object_type=2 AND @transaction_type IN ('A','U')


BEGIN
END
Luego agregamos dentro del BEGIN la validacin. Usamos la tabla OCRD porque esta es la que
contiene los socios de negocios (clientes y proveedores), el campo llave de esta tabla es el
CardCode y como necesitamos que sea el que se est usando en la transaccin le hacemos el
match con la variable @list_of_cols_val_tab_del.
IF @object_type=2 AND @transaction_type IN ('A','U')
BEGIN
IF
(SELECT
ISNULL(T0.CardName,'')
FROM
OCRD
T0
WHERE
T0.CardCode=@list_of_cols_val_tab_del)=''
BEGIN
SELECT @error=200, @error_message='Nombre del socio de negocios no puede estar vacio'
END
END
Cada vez que un usuario ingrese o modifique un socio de negocio y este tenga en nombre vacio
aparecer un error con ese mensaje. Ahora un ejemplo de una validacin de varios campos de los
socios de negocios.
IF @object_type =2 AND @transaction_type IN ('A', 'U')
BEGIN
/**** Telefono ****/
IF
EXISTS(SELECT
T0.Phone1
FROM
OCRD
T0
WHERE
T0.CardCode=@list_of_cols_val_tab_del AND (T0.Phone1 IS NULL OR T0.Phone1=''))
SET @error=101
IF
(SELECT
CHARINDEX('-',T0.Phone1,1)
FROM
OCRD
T0
WHERE
T0.CardCode=@list_of_cols_val_tab_del)>0
SET @error=102
IF
(SELECT
LEN(T0.Phone1)
FROM
OCRD
T0
WHERE
T0.CardCode=@list_of_cols_val_tab_del)<>8
SET @error=103
/**** E-mail ****/
IF EXISTS(SELECT T0.E_Mail FROM OCRD T0 WHERE T0.CardCode=@list_of_cols_val_tab_del
AND (T0.E_Mail IS NULL OR T0.E_Mail=''))

SET @error=104
IF
(SELECT
CHARINDEX('@',T0.E_Mail,1)
FROM
OCRD
T0
WHERE
T0.CardCode=@list_of_cols_val_tab_del)<=0
SET @error=105
IF (SELECT T0.CardType FROM OCRD T0 WHERE T0.CardCode=@list_of_cols_val_tab_del) IN
('C','L')
BEGIN
IF (SELECT TOP 1 T0.CntctCode FROM OCPR T0 INNER JOIN OCRD T1 ON
T1.CardCode=T0.CardCode
WHERE
T1.CardCode=@list_of_cols_val_tab_del
AND
T1.CardType<>'S') IS NULL
SET @error=106
END
SET @error_message=
CASE @error
WHEN 101 THEN 'Telefono obligatorio'
WHEN 102 THEN 'Telefono sin guiones'
WHEN 103 THEN 'Telefono debe tener 8 numeros'
WHEN 104 THEN 'E-mail obligatorio'
WHEN 105 THEN 'Formato de e-mail invalido, el formato debe ser "cuenta@dominio.com"'
WHEN 106 THEN 'No hay persona de contacto'
END
END

Recomendacin de las validaciones:

La declaracin de variables no deben repetirse.

Los nmeros de errores no deben repetirse para que no haya confusin con los mensajes.

Siempre prueben primero en una base TEST.

También podría gustarte