SBO_SP_PostTransactionNotice

Todos los que hayan mirado los procedimientos almacenados en la base de datos de SAP Business One ya habrán visto que existen 2 procedimientos que parecen iguales, pero no lo son.
Estos son, el PostTransactionNotice y el TransactionNotification.

Al abrir ambos SPs podemos fijarnos que ambos tienen la misma sintax, pero cada uno cumple una función diferente.

USE [BASE_DE_DATOS]
GO
/****** Object:  StoredProcedure [dbo].[SBO_SP_PostTransactionNotice]    Script Date: 07/10/2013 12:37:47 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER proc [dbo].[SBO_SP_PostTransactionNotice]

@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

No hablaré del TransactionNotification ya que el 90% de los consultores y encargados de TI deben saber para qué sirve.

Bien, el PostTransactionNotice es un «After Event», ¿qué quiere decir esto?, que se ejecuta después de que se realiza una acción, ¿qué acción?, cualquier nuevo objeto, modificación, eliminación, etc.
Esto quiere decir que así como el TransactionNotification se ejecuta cada vez que se crea, modifica, cierra, elimina o actualiza un documento, el PostTransactionNotice se ejecuta de la misma manera, pero, como es un after event solo se ejecuta después de que la acción se graba en la base datos, por lo que aquí no podemos detener la transacción como lo hacemos en el TransactionNotification.

Ahora, ustedes dirán, ¿para qué sirve esto si no podemos detener la transacción?, primero, el procedimiento no fue pensado para eso, segundo, esto puede servir para insertar información en una base de datos externa, información que si existe en SAP.

Un caso práctico, si utilizan un insert a una BD externa en el TransactionNotification, si la transacción tiene errores y es bloqueada para que el usuario la corrija, igual se habrá insertado el dato en la BD externa. Al contrario de haberlo puesto en el PostTransactionNotice, ya que aquí se espera hasta que la transacción está efectivamente grabada en la base de datos. O quizas generan TXT o XML de los documentos creados en SAP B1, para lo cual también es más práctico utilizar el PostTransactionNotice.

Una manera de aplicar este procedimiento almacenado, es para registrar todas las transacciones de SAP en una BD externa.

Primero, creamos la BD externa y la tabla, si ya tienen una BD externa solo creen la tabla.

CREATE DATABASE RP_SAP9
COLLATE SQL_Latin1_General_CP850_CI_AS

GO

USE [RP_SAP9]
CREATE TABLE RegTransact_SBODemoCL
(
	object_type nvarchar(20),
	transaction_type nchar(1),
	num_of_cols_in_key int,
	list_of_key_cols_tab_del nvarchar(255),
	list_of_cols_val_tab_del nvarchar(255)
)

GO

Una vez creada la BD y tabla, vamos al PostTransactionNotice y agregamos el siguiente codigo.

INSERT INTO [RP_SAP9]..[RegTransact_SBODemoCL]
VALUES(@object_type,@transaction_type,@num_of_cols_in_key,@list_of_key_cols_tab_del,@list_of_cols_val_tab_del)

Con esos 2 pasos, todas las transacciones que se realicen en la BD de SAP, quedarán registradas en la BD externa como en la siguiente imagen.

ScreenShot053

Gracias por su visita y espero que les haya gustado.

También te podría gustar...

7 Respuestas

  1. Danilo A dice:

    Excelente Post!!

  2. Ariel Plata dice:

    Me gustaría Informarle a todos los usuarios que cumplen Ciertas condiciones en una tabla de usuario

    Enviarles un correo Electrónico
    no lo hago por una alarma porque como repito no son todos los usuarios
    son los que cumplen 3 condiciones

    de antemano muchas gracia por tu amable respuesta

  3. Daniel dice:

    Hola tengo una duda, dado a que quiero realizar una validación de los artículos que entran y salen de SAP y que se actualice su cantidad total en una tabla alterna pero si le realizo un INSERT no me duplicaría los artículos?

    • Buenas tardes

      Eso dependerá de como escribas tu código.
      Recuerda que el PostTN informa de las transacciones que se están realizando en SAP, la forma en la que manejes esa información y la repliques en otro lado es definición tuya.

      Saludos

  4. DYRG dice:

    si quiero notificar por correo a los usuarios que tienen ´documentos pendientes por autorizar? que cuando se cree una Orden de Compra y tenga un modelo de autrizacion automaticamente envie un mail a los usuarios que tienen que autorizar la Orden de Compra

  5. Felipe Loyola dice:

    Para obtener el usuario, debes usar una subquery en una variable y luego agregarlo al insert.
    Por Ejemplo

    Declare @Usuario nvarchar(128)
    select @Usuario=Case @object_type when 13 then (select T0.UserCode from OUSR T0 inner join OINV T1 on T1.UserSign=T0.UserSign and T1.DocEntry=@list_of_cols_val_tab_del) when 14 then (select T0.UserCode from OUSR T0 inner join ORIN T1 on T1.UserSign=T0.UserSign and T1.DocEntry=@list_of_cols_val_tab_del) End

    INSERT INTO [RP_SAP9]..[RegTransact_SBODemoCL]
    VALUES(@object_type,@transaction_type,@num_of_cols_in_key,@list_of_key_cols_tab_del,@list_of_cols_val_tab_del,@Usuario)

    Recuerda que debe ser por cada tipo de objeto.

    Saludos
    FLR

  6. Christian dice:

    Q buen post!
    Como podría hacer para obtener el usuario que esta grabando esa transacción y así poder guardarla también en esa tabla junto a los demás datos?
    Gracias.

Deja una respuesta

Tu dirección de correo electrónico no será publicada.