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:
- Detectar si el asiento que se está creando es una cancelación de otro asiento (campo
StornoToTr
en OJDT).
- Obtener la serie del asiento original (asiento referenciado en
StornoToTr
).
- Comparar la serie del asiento original con la serie del asiento de cancelación.
- 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
- Filtramos los asientos contables manuales (
TransType = 30
) y solo en operaciones de creación (@transaction_type = 'A'
).
- 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).
- 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.
- Si las series son diferentes, mostramos un mensaje de error y bloqueamos la operación (
RETURN
).
Ventajas de esta Solución
Eficiencia: La consulta se ejecuta solo si el asiento es una cancelación, evitando impacto en el rendimiento.
Evita Tablas Temporales: No se usa una tabla temporal, lo que reduce el consumo de recursos.
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:
- Detecta si el asiento es una cancelación (
StornoToTr > 0
).
- Obtiene la serie del asiento original y la compara con la serie de la cancelación.
- 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! 