Hola camaradas consultores aquí siguiendo con nuestro blog vamos ha hablar del SP_TransactionNotification ¿y que es este?. Pues es ni mas ni menos que un store procedure (procedimiento almacenado) de SQL. Este Store es el único método legal en SAP Business One para recibir notificaciones de eventos producidos por datos, en pocas palabras previene que los usuarios introduzcan información que no cumpla con ciertas condiciones. Este Store se crea en cada base de datos de nuestras empresas. Por default se mira de la siguiente manera.
Una de las cosas que podemos hacer con este Store es cambiar los códigos de error tanto la descripción como el numero, podemos detener una operación como el guardado de una factura. Este Store tiene los siguientes 5 parámetros:
- @objecttype.- El tipo de objeto que se esta usando, este valor es alfanumérico y representa a un objeto como Factura clientes o socios de negocio.
- @transactiontype.- tipo de acción, agregar, actualizar, cancelar.
- @num_of_cols_in_key.- numero de columnas o campos en el campo llave.
- @list_of_key_cols_tab_del.- regresa delimitado por Tab una lista de los nombres de los campos que representan el campo llave.
- @list_of_cols_val_tab_del.- regresa delimitado por Tab una lista de los valores de los campos que representan el campo llave.
1. No poder crear una factura si no hay informacion en el campo Número de referencia de deudor en la factura de clientes.
If @object_type = '13' and @transaction_type = 'A'
Begin
If (Select Oinv.NumAtCard From OINV Where Oinv.DocEntry = @list_of_cols_val_tab_del) Is Null
Begin
Set @error = -5002
Set @error_message = N'El campo Numero de Referencia no puede estar vacio'
End
End
2. No poder crear una factura de compra si no viene de un documento base.
If @object_type = '18' and @transaction_type = 'A'
Begin
If Exists(Select ItemCode From PCH1 T0 Where T0.BaseEntry Is Null And
T0.DocEntry = @list_of_cols_val_tab_del)
Begin
Set @error = -5003
Set @error_message = N'La factura solo puede ser creada si viene de un documento base'
End
End
If @object_type = '24' and @transaction_type In ('A', 'U')
Begin
If Exists(Select DocTotal From ORCT T0 Where T0.DocTotal > 2500 And
T0.UserSign <> 1 And
T0.DocEntry = @list_of_cols_val_tab_del)
Begin
Set @error = -5006
Set @error_message = N'El pago debe ser menor a 2500 pesos'
End
End
Por ultimo cabe mencionar que existen otros Store. Estos son SBO_SP_PostTransactionSupport, dbo.SBO_SP_TransactionSupport estos están encriptados y son para propósitos de soporte para SAP. Y existe otro que se llama SBO_SP_PostTransactionNotice en este podemos meter código la diferencia es que este actúa ya después de que se termino una transacción y no se puede deshacer la operación como en el SBO_SP_TrnsactionNotification.
Con esto terminamos nuestro post de hoy y espero que antes de acabar la semana veamos un ejemplo de como usar un CLR dentro de nuestro Store. Saludos
muy buen Post Gracias ")
ResponderEliminarBuen aporte, ya que no todos conocen esta opcion
ResponderEliminarse agradece
Hola! gracias por tu aporte, acabo de probar una validación ya que quiero que mis guias de entregas sólo se ejecuten desde un almacén especifico.He probado agregando esta consulta a mi transaction ya que tengo otras; y no he tenido exito, por favor que me falta agregar? Muchas gracias por tu ayuda.
ResponderEliminarIF (@object_type = '15') and (@transaction_type= 'A')
BEGIN
IF (SELECT T1.whscode FROM dln1 T1 INNER JOIN ODLN T0 ON T0.DocEntry = T1.DocEntry
WHERE T0.DocEntry = @list_of_cols_val_tab_del) != 'P6'
BEGIN
SET @error = 102
SET @error_message = N'ALMACEN INCORRECTO - SOLO SE PUEDE USAR P6'
END
END
Muy interesante, tu post, sigue así!!!
ResponderEliminarTengo una consultilla, como puedo saber que número de objeto es cada formulario?? por ejemplo quiero agregar una validación para la pantalla de centro de costos en la version 8.81 pero no se q número de objeto es para referenciarlo.
Gracias.
createguib@hotmail.com
Christian
Este comentario ha sido eliminado por el autor.
ResponderEliminarMagdalena
ResponderEliminarPrueba este Codigo
IF (@object_type = '15') AND (@transaction_type IN ('A','U')
BEGIN
IF
(SELECT COUNT(T1.WhsCode)
FROM ODLN T0
INNER JOIN DLN1 T1 ON T1.DocEntry = T0.DocEntry
WHERE T0.DocEntry = @list_of_cols_val_tab_del AND T1.WhsCode != 'P6') > 1
BEGIN
SET @error = 102
SET @error_message = N'ALMACEN INCORRECTO - SOLO SE PUEDE USAR P6'
END
END
Saludos
Christian
ResponderEliminarPara saber el tipo de Objeto de los formularios, debes ejecutar una simple consulta
SELECT DISTINCT ObjType
FROM TABLA
Ej: SELECT DISTINCT ObjType
FROM OINV
Resultado : 13
SELECT DISTINCT ObjType
FROM OPCH
Resultado : 18
Y asi con los demas objetos.
Ademas en la ayuda del SDK, buscas Boobjects y te apareceran todos los objetos de SAP pero sin su tabla nativa.
Slds
Muy buen aporte...
ResponderEliminarQuiero molestarlos tengo muy pocos conocimientos en este tema y necesito crear unas validaciones como por ejemplo: en ordenes de venta cree un campo con fecha y hora de entrega que se llama U_Heven ahora como valido que esta sea mayor o igual 4horas de la fecha de contabilización.
les dejo mi correo dixon270506@hotmail.com
por su ayuda mil gracias.
Nelson Torres
ResponderEliminarBuenos Días,
Estoy creando una validación para evitar crear pagos recibidos con el mismo número de transferencia sin embargo no me efectúa la validación correctamente ya que me deja crear el pago. Disculpen la inquietud no posee muchos conocimientos de este tema el stored procedure que estoy usando es este:
if @object_type in ('24') and @transaction_type in ('A', 'U') --Validar numero de referencia
begin
declare @NumeroDoc as nvarchar
declare @Doc as nvarchar (20)
set @Doc= (SELECT T0.[TrsfrRef] FROM ORCT T0 WHERE T0.DocEntry=@list_of_cols_val_tab_del)
set @NumeroDoc =
CASE @object_type
WHEN '24' THEN
(SELECT COUNT (T0.[TrsfrRef]) FROM ORCT T0 WHERE T0.[TrsfrRef]=@Doc AND T0.[Canceled]='N')
END
IF (@NumeroDoc >1 )
begin
select @error = 104
set @error_message = 'Ya existe Número de referencia ' +@Doc
end
end
Buenos días, agradezco por favor me ayuden con dos puntos de ante mano mil gracias.
ResponderEliminar1 Necesito una condición en la Factura de deudores, La idea es que no se pueda modificar el precio si es menor a la lista de precios del artículo, pero si es superior lo deje modificar.
2 Condicionar la Factura de deudores, si el campo CardCode = CN me pida crear primero una Orden de venta
Si el campo CardCode = CT me deje facturar sin Orden de venta.
Mil gracias por la ayuda abrazo.
hola por favor necesito ayuda en sap bussines one
ResponderEliminarcomo hago para Condicionar la Factura de proveedores, no me deje crearla sin antes tener una orden de compra
Hola el ejemplo No.2 lo explica claramente
ResponderEliminarBuen día:
ResponderEliminar¿Alguien tendría algún ejemplo para compartir cuando el transaction_type es = 'D' (Delete)?
Supongo que debería tener la misma lógica, sin embargo, no me valida, al realizar la consulta sobre la base de datos me trae valores nulos o vacíos al momento de "eliminar" el UDO de tipo dato maestro, pero si realizo un informe o una consulta directa en cualquier momento, sí trae valores.
Desde ya gracias por la ayuda.