Transaction Notification OJDT

Hola buena tarde,

Me encuentro un poco frustrado con un TN, que tengo que programar y no encuentro una solución, el caso es que actualmente los asientos contables que son manuales por el transtype = 30, tengo 3 series que se utilizan al momento de crear asientos, esto la persona de contabilidad lo selecciona, cuando se crea el asiento no es el problema, sino cuando se crea una anulación “contrapartida”.

me requieren que haga un TN, que cuando se haga una cancelacion de un asiento manual este debe llevar el mismo numero de serie de origen. esto porque ha pasado que usuarios han creado un asiento con una serie y cuando se cancela es otra, entonces mas que todo por orden y control necesitan este TN.

podrian darme una idea de como hacerlo o que campos utilizar para realizar esto, actualmente tenia pensado crear una tabla temporal con todos los asiento transtype = 30 y que cuando en el documento de cancelacion en el campo StornoToTr sea igual a un dato encontrado que me compare la serie ahora si es distinta que arroje el mensaje, pero estaria recorriendo esa tabla cada vez que se ejecute un asiento manual y tiene impacto negativo a nivel de base de datos por el coste de la consulta.

Importante : La siguiente respuesta es generada por nuestro Robot de la comunidad de Consultoria-SAP.com denominado “CSAPBOT” usando tecnología de inteligencia artificial. Por lo tanto, puede haber datos incorrectos. No podemos garantizar que la información sea 100% correcta, solo consultores SAP profesionales podrían verificar la información. Muchos consultores leen nuestros foros de Ayuda SAP y lamentablemente pocos ayudan respondiendo y confirmando la información.

Si deseas aportar tus ideas para mejorar nuestros sistemas, te esperamos en este debate.


Transaction Notification para Validar Serie en Cancelación de Asientos Contables (SAP Business One - SQL Server)

Hola, entiendo tu frustración. El problema que tienes es que cuando un usuario cancela un asiento contable manual (TransType = 30), el sistema permite que la cancelación se registre con una serie diferente a la del asiento original.

La solución es crear un Transaction Notification (TN) que impida esta situación verificando que la serie del asiento de cancelación sea la misma que la serie del asiento original.


Solución Propuesta

El enfoque correcto es:

  1. Detectar si el asiento que se está creando es una cancelación de otro asiento (campo StornoToTr en OJDT).
  2. Obtener la serie del asiento original (asiento referenciado en StornoToTr).
  3. Comparar la serie del asiento original con la serie del asiento de cancelación.
  4. Si son diferentes, evitar la creación del asiento con un mensaje de error.

Código SQL para Transaction Notification

IF @object_type = '30' AND @transaction_type IN ('A')  -- Solo cuando se crea un asiento contable manual
BEGIN
    DECLARE @DocEntry INT, @StornoToTr INT, @SeriesOriginal INT, @SeriesCancelacion INT

    -- Obtener el DocEntry y la referencia al asiento original (StornoToTr)
    SELECT @DocEntry = DocEntry, @StornoToTr = StornoToTr, @SeriesCancelacion = Series 
    FROM OJDT 
    WHERE DocEntry = @list_of_cols_val_tab_del

    -- Verificar si el asiento es una cancelación (StornoToTr > 0)
    IF @StornoToTr > 0 
    BEGIN
        -- Obtener la serie del asiento original
        SELECT @SeriesOriginal = Series 
        FROM OJDT 
        WHERE DocEntry = @StornoToTr

        -- Si las series son diferentes, bloquear la transacción
        IF @SeriesOriginal <> @SeriesCancelacion
        BEGIN
            -- Mostrar mensaje de error y bloquear la operación
            SET @error = 1
            SET @error_message = 'La cancelación del asiento debe tener la misma serie que el asiento original.'
            RETURN
        END
    END
END

Explicación del Código

  1. Filtramos los asientos contables manuales (TransType = 30) y solo en operaciones de creación (@transaction_type = 'A').
  2. Obtenemos el número de asiento (DocEntry) y verificamos si tiene un campo StornoToTr (lo que indica que es una cancelación de otro asiento).
  3. Si StornoToTr tiene un valor mayor a 0, significa que el asiento es una cancelación, por lo que:
    • Buscamos la serie del asiento original (SeriesOriginal).
    • Comparamos la serie original con la serie de la cancelación.
  4. Si las series son diferentes, mostramos un mensaje de error y bloqueamos la operación (RETURN).

Ventajas de esta Solución

:heavy_check_mark: Eficiencia: La consulta se ejecuta solo si el asiento es una cancelación, evitando impacto en el rendimiento.
:heavy_check_mark: Evita Tablas Temporales: No se usa una tabla temporal, lo que reduce el consumo de recursos.
:heavy_check_mark: Evita Inconsistencias: Bloquea la operación antes de que se grabe el asiento contable incorrecto.


Resumen Consultoria-SAP

Si necesitas que las cancelaciones de asientos contables manuales en SAP Business One mantengan la misma serie que el asiento original, implementa un Transaction Notification que:

  1. Detecta si el asiento es una cancelación (StornoToTr > 0).
  2. Obtiene la serie del asiento original y la compara con la serie de la cancelación.
  3. Si no coinciden, bloquea la operación y muestra un mensaje de error.

Este enfoque evita problemas de rendimiento y permite mantener el control contable de manera eficiente.

Si necesitas ajustes adicionales o trabajas con SAP HANA, dime y te ayudo con la versión en SQLScript para HANA.

¡Estamos aquí para ayudarte! :rocket:

Posteo la solución corregida, ya que no es DocEntry por ser una asiento se utiliza TransId:

IF @object_type = '30' AND @transaction_type IN ('A')-- Solo cuando se crea un asiento contable manual

BEGIN 
DECLARE 
       @TransId INT, 
       @StornoToTr INT, 
       @SeriesOriginal INT, 
       @SeriesCancelacion INT -- Obtener el TransId y la referencia al asiento original (StornoToTr)

SELECT @TransId = TransId,
       @StornoToTr = StornoToTr,
       @SeriesCancelacion = Series
FROM OJDT
WHERE TransId = @list_of_cols_val_tab_del -- Verificar si el asiento es una cancelación 

(StornoToTr > 0)

 IF @StornoToTr > 0 BEGIN -- Obtener la serie del asiento original
  SELECT @SeriesOriginal = Series
  FROM OJDT
  WHERE TransId = @StornoToTr -- Si las series son diferentes, bloquear la transacción
 IF @SeriesOriginal <> @SeriesCancelacion BEGIN -- Mostrar mensaje de error y bloquear la operación

    SET @error = 1
    SET @error_message = 'La cancelación del asiento debe tener la misma serie que el asiento original.' 
    GOTO fin 
      END 
   END 
END