TNotificacion Facturas Canceladas

Hola compañeros buenas tardes

Expongo un problema que tengo en un Transaction Notificacion donde se cancela una factura de proveedor.
no me esta respetando que al momento de cancelar lo detecta como nuevo (A) en vez de cancelar (C).
este transaction tiene que resta el monto que se tiene en una tabla de presupuesto ya ejercido.

este es mi consulta

IF @object_type = '18' AND @transaction_type in ('C')
    
BEGIN
          
	declare @contlines1 int, @contitt1 int, @base nvarchar(50), @docentry nvarchar(50), @baseType int

     Declare @lineasfact1 table (
	          Linenum numeric (10), 
			  linetotal numeric(20),
			  mes nvarchar(20),
			  folio nvarchar(50),
			  area nvarchar(20),
			  folio_int nvarchar(50),
			  base nvarchar(50),
			  docentry nvarchar(50)
			  		  );
    
	Set @contitt1 = '0'
 
  	Insert into @lineasfact1 (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

  
	SELECT @doctotal = linetotal,  @mes = mes, @folio = Folio, @area = AREA, @folio_int = folio_int, @base = base, @docentry = docentry from @lineasfact1 order by mes
		 OFFSET @contitt1 rows fetch next 1 rows only

 BEGIN
	update KYA_ASIGNACION_PRES set ESTATUS = 'C' where  FOLIO_INTERNO = @folio_int


	--MOVIMIENTO EN EL PRESUPUESTO COMPROMETIDO--
	    select @area = dbo.presupuesto_tabla (@area)
		select @mes1 = [dbo].[presupuesto_mes_ejer] (@mes)


		select @sql ='update '+@area+' set '+@mes1+' = (select '+@mes1+' from '+@area+' where U_FOLIO_CONCEPTO = '+char(39)+@folio+char(39)+') - '+convert(varchar(20),@doctotal) +' where U_FOLIO_CONCEPTO = '+char(39)+@folio+char(39); 
		select @parametros = N'@mes1 varchar(20),@area varchar(20),@folio nvarchar(10), @doctotal NUMERIC(19,6)';
		execute sp_executesql @sql, @parametros, @mes1 ,@area ,@folio , @doctotal;
	END
	
	  set @contitt1 = @contitt1 + 1
  END
  
END

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

  1. Verificamos si el documento tiene estado cancelado (CANCELED = 'Y') en la tabla OPCH.
  2. Si el documento fue cancelado, procesamos las líneas de la factura cancelada.
  3. Usamos un cursor para recorrer todas las líneas de la factura y actualizar el presupuesto adecuadamente.
  4. 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:

  1. Verifica si el documento está cancelado (CANCELED = 'Y') en OPCH.
  2. Obtén los datos de la factura cancelada con PCH1.
  3. Recorre cada línea y ajusta el presupuesto afectado.
  4. 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.