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.
Problema con Transaction Notification al Cancelar Facturas de Proveedor en SAP Business One
En SAP Business One, el procedimiento almacenado Transaction Notification se ejecuta cada vez que se realiza una operación sobre un documento, permitiendo validaciones y actualizaciones personalizadas.
Tu problema es que, al cancelar una Factura de Proveedor (ObjectType = 18), el Transaction Notification lo detecta como si fuera un documento nuevo (@transaction_type = 'A'
) en vez de reconocerlo como cancelado ('C'
).
Causa del Problema
En SAP Business One, cuando cancelas una factura, el sistema crea un nuevo documento de cancelación, en lugar de modificar el estado del documento original.
- El documento original sigue existiendo con su estado normal.
- SAP B1 genera un nuevo documento de cancelación, que tiene su propio
DocEntry
y DocStatus = 'C'
.
- Esto hace que
@transaction_type
se registre como 'A'
en lugar de 'C'
.
Por lo tanto, tu validación no está detectando correctamente la cancelación porque está evaluando el documento original, en lugar del documento generado como cancelación.
Solución: Detectar correctamente los documentos cancelados
Para corregir el problema, debes modificar tu lógica de detección de cancelación en Transaction Notification.
1. Validar si el documento tiene un documento de cancelación asociado
Modifica la condición inicial para verificar si el DocEntry
de la factura tiene un documento de cancelación en la tabla OPCH.
Código corregido:
IF @object_type = '18' AND @transaction_type = 'C'
BEGIN
DECLARE @cancelado INT, @docentry NVARCHAR(50)
-- Validar si el documento tiene una cancelación asociada
SELECT @cancelado = COUNT(*)
FROM OPCH
WHERE CANCELED = 'Y'
AND DocEntry = @list_of_cols_val_tab_del
-- Si el documento está cancelado, ejecutar el ajuste de presupuesto
IF @cancelado > 0
BEGIN
DECLARE @doctotal NUMERIC(19,6), @mes NVARCHAR(20), @folio NVARCHAR(50), @area NVARCHAR(20), @folio_int NVARCHAR(50), @base NVARCHAR(50)
DECLARE @lineasfact TABLE (
Linenum NUMERIC (10),
linetotal NUMERIC(20,6),
mes NVARCHAR(20),
folio NVARCHAR(50),
area NVARCHAR(20),
folio_int NVARCHAR(50),
base NVARCHAR(50),
docentry NVARCHAR(50)
)
-- Obtener los datos de la factura
INSERT INTO @lineasfact (Linenum, Linetotal, Mes, Folio, area, folio_int, base, docentry)
SELECT T1.Linenum, T1.LineTotal, T1.U_FMP_Mes, T1.U_Folio_Concepto, T1.U_FMP_AREA, T1.U_FMP_F_Interno, T1.BaseRef, T1.DocEntry
FROM PCH1 T1
WHERE T1.DocEntry = @list_of_cols_val_tab_del
-- Procesar cada línea de la factura cancelada
DECLARE cursor_fact CURSOR FOR
SELECT linetotal, mes, folio, area, folio_int, base, docentry
FROM @lineasfact
OPEN cursor_fact
FETCH NEXT FROM cursor_fact INTO @doctotal, @mes, @folio, @area, @folio_int, @base, @docentry
WHILE @@FETCH_STATUS = 0
BEGIN
-- Actualizar la tabla de presupuesto como cancelado
UPDATE KYA_ASIGNACION_PRES
SET ESTATUS = 'C'
WHERE FOLIO_INTERNO = @folio_int
-- Ajustar el presupuesto comprometido
SELECT @area = dbo.presupuesto_tabla(@area)
SELECT @mes = dbo.presupuesto_mes_ejer(@mes)
DECLARE @sql NVARCHAR(MAX), @parametros NVARCHAR(MAX)
SET @sql = 'UPDATE ' + @area + ' SET ' + @mes + ' = (SELECT ' + @mes + ' FROM ' + @area + ' WHERE U_FOLIO_CONCEPTO = @folio) - @doctotal WHERE U_FOLIO_CONCEPTO = @folio'
SET @parametros = N'@mes NVARCHAR(20), @area NVARCHAR(20), @folio NVARCHAR(10), @doctotal NUMERIC(19,6)'
EXEC sp_executesql @sql, @parametros, @mes, @area, @folio, @doctotal
FETCH NEXT FROM cursor_fact INTO @doctotal, @mes, @folio, @area, @folio_int, @base, @docentry
END
CLOSE cursor_fact
DEALLOCATE cursor_fact
END
END
Explicación de los cambios
- Verificamos si el documento tiene estado cancelado (
CANCELED = 'Y'
) en la tabla OPCH.
- Si el documento fue cancelado, procesamos las líneas de la factura cancelada.
- Usamos un cursor para recorrer todas las líneas de la factura y actualizar el presupuesto adecuadamente.
- Ejecutamos la actualización del presupuesto de forma segura con
sp_executesql
para evitar problemas de sintaxis.
Resumen Consultoria-SAP
Si tu Transaction Notification no detecta correctamente la cancelación de facturas de proveedor en SAP Business One, el problema es que SAP genera un nuevo documento al cancelar en lugar de modificar el original.
Para corregirlo:
- Verifica si el documento está cancelado (
CANCELED = 'Y'
) en OPCH.
- Obtén los datos de la factura cancelada con PCH1.
- Recorre cada línea y ajusta el presupuesto afectado.
- Usa un
sp_executesql
para ejecutar dinámicamente la actualización del presupuesto.
Si esta solución no funciona en tu entorno, dime qué versión de SAP Business One (SQL o HANA) estás usando y revisamos un ajuste más preciso.
Estamos aquí para ayudarte.