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.
Gracias por su visita y espero que les haya gustado.
Excelente Post!!
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
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
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
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
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.