SAP BO. SAP Business One. SBO_SP_TransactionNotification

   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.
      Ahora bien que ya vimos mucho concepto y mucha explicación veamos unos ejemplos para que quede mas claro

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

3.Rechazar pagos recibidos mayores a 2500 si no es el usuario manager. 

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

13 comentarios:

  1. Lui Says:

    muy buen Post Gracias ")

  2. Felipe Loyola Says:

    Buen aporte, ya que no todos conocen esta opcion

    se agradece

  3. Maggie Fredoom Says:

    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.
    IF (@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

  4. Anónimo Says:

    Muy interesante, tu post, sigue así!!!
    Tengo 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

  5. Felipe Loyola Says: Este comentario ha sido eliminado por el autor.
  6. Felipe Loyola Says:

    Magdalena
    Prueba 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

  7. Felipe Loyola Says:

    Christian
    Para 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

  8. Dixon Says:

    Muy buen aporte...
    Quiero 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.

  9. Unknown Says:

    Nelson Torres
    Buenos 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

  10. Andres Says:

    Buenos días, agradezco por favor me ayuden con dos puntos de ante mano mil gracias.

    1 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.

  11. Unknown Says:

    hola por favor necesito ayuda en sap bussines one

    como hago para Condicionar la Factura de proveedores, no me deje crearla sin antes tener una orden de compra

  12. Anónimo Says:

    Hola el ejemplo No.2 lo explica claramente

  13. José Chamorro Says:

    Buen día:
    ¿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.

Related Posts with Thumbnails