Bloqueo solicitud compra TN

BUEN DIA

ESTIMADOS agradzeco si me peuden ayudar es que necesito un TN que me ayude a blqoear y no cear las solciitudes de compra cyuando el total sea igual a cero o algun item tenga preice 0 oe n blanco tengo este tn pero no em funciona me deja pasar las oslcitudes de compra o crearlas

IF (:object_type = '147000011' AND :transaction_type = 'A') THEN
    DECLARE PRECIO_INVALIDO INT;

    SELECT (SELECT COUNT(*)
            FROM PRQ1
            WHERE "DocEntry" = :list_of_cols_val_tab_del
              AND (IFNULL("Price", 0) <= 0)) INTO PRECIO_INVALIDO FROM DUMMY;

    IF :PRECIO_INVALIDO > 0 THEN 
        SELECT 1471 INTO error FROM DUMMY;
        SELECT 'Error 1471: Hay líneas con precio igual o menor a cero en la solicitud de compra.' INTO error_message FROM DUMMY;
    END IF;
END IF;




este es mi tn copmopelto

ALTER PROCEDURE SBO_SP_TransactionNotification
(
	in object_type nvarchar(30), 				-- SBO Object Type
	in transaction_type nchar(1),			-- [A]dd, [U]pdate, [D]elete, [C]ancel, C[L]ose
	in num_of_cols_in_key int,
	in list_of_key_cols_tab_del nvarchar(255),
	in list_of_cols_val_tab_del nvarchar(255)
)
LANGUAGE SQLSCRIPT 
SQL SECURITY INVOKER 
AS
-- Return values
error  int;				-- Result (0 for no error)
error_message nvarchar (200); 		-- Error string to be displayed
CuentaBodDifSolTr INT;
CSS_CONTEO INT;

DocSubType VarChar(2);

begin

error := 0;
error_message := N'Ok';

--------------------------------------------------------------------------------------------------------------------------------

--	ADD	YOUR	CODE	HERE


/*
Objetivo: Restricción para evitar creación y actualización de solicitud de traslado en caso de que el almacén de destino sea distinto para la cabecera y las líneas
Creado por: CSS Jeisson Cristancho
Fecha creación: 04-11-2020 8:16 am
Fecha modificación
*/


IF((object_type = '1250000001') AND ( (transaction_type = 'U') or (transaction_type = 'A'))) THEN
	
	
	SELECT COUNT(*) INTO CuentaBodDifSolTr FROM OWTQ T0  INNER JOIN WTQ1 T1 ON T0."DocEntry" = T1."DocEntry" WHERE T0."ToWhsCode" !=  T1."WhsCode" And T0."DocEntry" = :list_of_cols_val_tab_del ;
	IF :CuentaBodDifSolTr > 0 THEN
		error := '1';
		error_message := 'CSS - El almacén destino no puede ser diferente a la de cabecera';
	END IF;
	
END IF;

IF((:object_type = '112') AND ( (:transaction_type = 'U') or (:transaction_type = 'A'))) THEN
	
	SELECT COUNT(*) INTO CuentaBodDifSolTr FROM ODRF T0  INNER JOIN DRF1 T1 ON T0."DocEntry" = T1."DocEntry" WHERE T0."ObjType" = '1250000001' And T0."ToWhsCode" !=  T1."WhsCode" And T0."DocEntry" = :list_of_cols_val_tab_del ;
	IF :CuentaBodDifSolTr > 0 THEN
		error := '1';
		error_message := 'CSS - El almacén destino no puede ser diferente a la de cabecera';
	END IF;
	
END IF;


IF((object_type = '13') AND ( (transaction_type = 'U') or (transaction_type = 'A'))) THEN
	DECLARE cuenta int;
	
	SELECT COUNT(*) INTO cuenta FROM INV1 T0  INNER JOIN OITM T1 ON T0."ItemCode" = T1."ItemCode" WHERE IFNULL(T1."U_COD_CABYS", '') = '' And  T0."DocEntry" = :list_of_cols_val_tab_del ;

	IF :cuenta > 0 THEN
		error := '1';
		error_message := 'El campo "CODIGOS CABUY" en el dato maestro de artículo no puede estar vacío';
	END IF;
END IF;


--------------------------------------------------------------------------------------------------------------------------------

/* Factura con margen menor a 20% */

IF (:object_type = '13' AND :transaction_type = 'A') THEN
DECLARE MARGEN INT;
SELECT (SELECT
		COUNT(*)
		FROM (SELECT
				A0."ItemCode",
				CASE 
					WHEN A0."TotalBruto" = 0 THEN 0 
					ELSE (A0."GrssProfit"/A0."TotalBruto")*100 
				END "%Ganancia"
				FROM (SELECT  
						T1."ItemCode", 
						T1."LineTotal" - (T1."LineTotal" * (T0."DiscSum" / (T0."DocTotal" + T0."WTSum" - T0."VatSum" - T0."RoundDif" - T0."TotalExpns" + T0."DpmAmnt" + T0."DiscSum"))) AS "TotalBruto", 
						T1."GrssProfit"
						FROM OINV T0 
						INNER JOIN INV1 T1 ON T0."DocEntry" = T1."DocEntry"
						WHERE :list_of_cols_val_tab_del = T0."DocEntry"
						AND T0."U_Check_Margen_FV" = 'N'
				) A0
		) B0
		WHERE B0."%Ganancia" < 20) INTO MARGEN  FROM DUMMY; 
	IF :MARGEN > 0 THEN 
    	SELECT 10 INTO error FROM DUMMY; 
        SELECT 'Por favor verificar margen de venta' INTO error_message FROM DUMMY;
    END IF;             
END IF;


----------------------------------------------------------------------------------------------------------------------------------

IF (:object_type = '147000011' AND :transaction_type = 'A') THEN
    DECLARE PRECIO_INVALIDO INT;

    SELECT (SELECT COUNT(*)
            FROM PRQ1
            WHERE "DocEntry" = :list_of_cols_val_tab_del
              AND (IFNULL("Price", 0) <= 0)) INTO PRECIO_INVALIDO FROM DUMMY;

    IF :PRECIO_INVALIDO > 0 THEN 
        SELECT 1471 INTO error FROM DUMMY;
        SELECT 'Error 1471: Hay líneas con precio igual o menor a cero en la solicitud de compra.' INTO error_message FROM DUMMY;
    END IF;
END IF;





--------------------------------------------------------------------------------------------------------------------------------
/*  
IF (:object_type = '17' AND (:transaction_type = 'A' OR :transaction_type = 'U')) THEN
DECLARE MARGEN INT;
SELECT (SELECT
		COUNT(*)
		FROM (SELECT
				A0."ItemCode",
				CASE 
					WHEN A0."TotalBruto" = 0 THEN 0 
					ELSE (A0."GrssProfit"/A0."TotalBruto")*100 
				END "%Ganancia"
				FROM (SELECT  
						T1."ItemCode", 
						T1."LineTotal" - (T1."LineTotal" * (T0."DiscSum" / (T0."DocTotal" + T0."WTSum" - T0."VatSum" - T0."RoundDif" - T0."TotalExpns" + T0."DpmAmnt" + T0."DiscSum"))) AS "TotalBruto", 
						T1."GrssProfit"
						FROM ORDR T0 
						INNER JOIN RDR1 T1 ON T0."DocEntry" = T1."DocEntry"
						WHERE :list_of_cols_val_tab_del = T0."DocEntry"
						AND T0."U_Check_Margen" = 'N'
				) A0
		) B0
		WHERE B0."%Ganancia" < 20) INTO MARGEN  FROM DUMMY; 
	IF :MARGEN > 0 THEN 
    	SELECT 1702 INTO error FROM DUMMY; 
        SELECT '1702 - Por favor verificar margen de venta' INTO error_message FROM DUMMY;
    END IF;             
END IF;
*/
--------------------------------------------------------------------------------------------------------------------------------
/*  
IF (:object_type = '112' AND (:transaction_type = 'A' OR :transaction_type = 'U')) THEN
DECLARE MARGEN INT;
SELECT (SELECT
		COUNT(*)
		FROM (SELECT
				A0."ItemCode",
				CASE 
					WHEN A0."TotalBruto" = 0 THEN 0 
					ELSE (A0."GrssProfit"/A0."TotalBruto")*100 
				END "%Ganancia"
				FROM (SELECT  
						T1."ItemCode", 
						T1."LineTotal" - (T1."LineTotal" * (T0."DiscSum" / (T0."DocTotal" + T0."WTSum" - T0."VatSum" - T0."RoundDif" - T0."TotalExpns" + T0."DpmAmnt" + T0."DiscSum"))) AS "TotalBruto", 
						T1."GrssProfit"
						FROM ODRF T0 
						INNER JOIN DRF1 T1 ON T0."DocEntry" = T1."DocEntry"
						WHERE :list_of_cols_val_tab_del = T0."DocEntry" AND T0."ObjType" = 17
						AND T0."U_Check_Margen" = 'N'
				) A0
		) B0
		WHERE B0."%Ganancia" < 20) INTO MARGEN  FROM DUMMY; 
	IF :MARGEN > 0 THEN 
    	SELECT 1121702 INTO error FROM DUMMY; 
        SELECT '1121702 - Por favor verificar margen de venta' INTO error_message FROM DUMMY;
    END IF;             
END IF;
*/
---------------------------------------------------------------------------------------------------------------------------------
/*Orden de venta: validacion cuenta anexo obligatorio
Creada por CONSENSUS - German Duque - 16/abr/2021  
IF (:object_type = '17' AND (:transaction_type = 'A' OR :transaction_type = 'U')) THEN
SELECT (SELECT
		COUNT(*)
		FROM ORDR T0 
		WHERE :list_of_cols_val_tab_del = T0."DocEntry"
			AND T0."AtcEntry" is null) INTO CSS_CONTEO FROM DUMMY; 
	IF :CSS_CONTEO > 0 THEN 
    	error := 1702; 
        error_message := '1702 CSS - Debe anexar OC o Soporte';
    END IF;             
END IF;
*/
---------------------------------------------------------------------------------------------------------------------------------
/*Orden de venta borrador: validacion anexo obligatorio
Creada por CONSENSUS - German Duque - 16/abr/2021  
IF (:object_type = '112' AND (:transaction_type = 'A' OR :transaction_type = 'U')) THEN
SELECT (SELECT
		COUNT(*)
		FROM ODRF T0 
		WHERE :list_of_cols_val_tab_del = T0."DocEntry" AND T0."ObjType" = 17
			AND T0."AtcEntry" is null) INTO CSS_CONTEO FROM DUMMY; 
	IF :CSS_CONTEO > 0 THEN 
    	error := 1121702; 
        error_message := '1121702 CSS - Debe anexar OC o Soporte';
    END IF;             
END IF;
*/
-------------------------------------------------------------------------------------------------------------------------------
/*Factura de venta: validacion cuenta ingresos vs. cuenta costos
Creada por CONSENSUS - German Duque - 08/mar/2021  */
IF (:object_type = '13' AND :transaction_type = 'A') THEN
SELECT (SELECT
		COUNT(*)
		FROM OINV T0 
			INNER JOIN INV1 T1 ON T0."DocEntry" = T1."DocEntry"
			INNER JOIN OITM T2 ON T1."ItemCode" = T2."ItemCode"
		WHERE :list_of_cols_val_tab_del = T0."DocEntry"
			AND (RIGHT(T1."AcctCode",2) <> RIGHT(T2."ItmsGrpCod",2) OR RIGHT(T1."CogsAcct",2) <> RIGHT(T2."ItmsGrpCod",2))
			AND T2."GLPickMeth"='C') INTO CSS_CONTEO FROM DUMMY; 
	IF :CSS_CONTEO > 0 THEN 
    	error := 1301; 
        error_message := '1301 CSS - Las cuentas de ingresos no corresponden a las cuentas de costos';
    END IF;             
END IF;
---------------------------------------------------------------------------------------------------------------------------------
/*Orden de venta: validacion cuenta ingresos vs. cuenta costos
Creada por CONSENSUS - German Duque - 08/mar/2021  
IF (:object_type = '17' AND (:transaction_type = 'A' OR :transaction_type = 'U')) THEN
SELECT (SELECT
		COUNT(*)
		FROM ORDR T0 
			INNER JOIN RDR1 T1 ON T0."DocEntry" = T1."DocEntry"
			INNER JOIN OITM T2 ON T1."ItemCode" = T2."ItemCode"
		WHERE :list_of_cols_val_tab_del = T0."DocEntry"
			AND (RIGHT(T1."AcctCode",2) <> RIGHT(T2."ItmsGrpCod",2) OR RIGHT(T1."CogsAcct",2) <> RIGHT(T2."ItmsGrpCod",2))
			AND T2."GLPickMeth"='C') INTO CSS_CONTEO FROM DUMMY; 
	IF :CSS_CONTEO > 0 THEN 
    	error := 1701; 
        error_message := '1701 CSS - Las cuentas de ingresos no corresponden a las cuentas de costos';
    END IF;             
END IF;
*/
---------------------------------------------------------------------------------------------------------------------------------
/*Orden de venta borrador: validacion cuenta ingresos vs. cuenta costos
Creada por CONSENSUS - German Duque - 08/mar/2021  
IF (:object_type = '112' AND (:transaction_type = 'A' OR :transaction_type = 'U')) THEN
SELECT (SELECT
		COUNT(*)
		FROM ODRF T0 
			INNER JOIN DRF1 T1 ON T0."DocEntry" = T1."DocEntry"
			INNER JOIN OITM T2 ON T1."ItemCode" = T2."ItemCode"
		WHERE :list_of_cols_val_tab_del = T0."DocEntry" AND T0."ObjType" = 17
			AND (RIGHT(T1."AcctCode",2) <> RIGHT(T2."ItmsGrpCod",2) OR RIGHT(T1."CogsAcct",2) <> RIGHT(T2."ItmsGrpCod",2))
			AND T2."GLPickMeth"='C') INTO CSS_CONTEO FROM DUMMY; 
	IF :CSS_CONTEO > 0 THEN 
    	error := 1121701; 
        error_message := '1121701 CSS - Las cuentas de ingresos no corresponden a las cuentas de costos';
    END IF;             
END IF;
*/
---------------------------------------------------------------------------------------------------------------------------------
/* 
Objetivo: Restricción traslado solo area logistica*/

IF((object_type = '67') AND ( (transaction_type = 'U') or (transaction_type = 'A'))) THEN
	DECLARE Traslado INT;
	
	SELECT COUNT(*) INTO Traslado FROM OWTR T0 WHERE IFNULL(T0."U_TRAS_AREA",'') != 'LOGISTICA' And T0."DocEntry" = :list_of_cols_val_tab_del ;
	IF :Traslado > 0 THEN 
		error := '1';
		error_message := 'Transferencia de Stock solo lo debe hacer el area de Logistica. Selecione la opcion LOGISTICA EN "U_TRAS_AREA"';
	END IF;
END IF;

---------------------------------------------------------------------------------------------------------------------------------

/*FACTURA PROVEEDORES : validacion anexo obligatorio
Creada Diego Pinilla - 24/Agosto/2021  */
IF (:object_type = '18' AND (:transaction_type = 'A' OR :transaction_type = 'U')) THEN
SELECT (SELECT
		COUNT(*)
		FROM OPCH T0 
		WHERE :list_of_cols_val_tab_del = T0."DocEntry" AND T0."DataSource" <> 'O'
			AND T0."AtcEntry" is null) INTO CSS_CONTEO FROM DUMMY; 
	IF :CSS_CONTEO > 0 THEN 
    	error := 1702; 
        error_message := '1702 DP Debe Anexar Factura,Doc.Trasnporte';
    END IF;             
END IF;

------------------------------------------------

--Consulta para TN--
---TN-XX - Valida articulos en la orden de venta---
---------- busca facturas de venta del mismo cliente de la OV con dichos articulos en los ultimos 6 meses ---
---------- si por lo menos un articulo no se ha comprado en los ultimos 6 meses, retorna error y debe irse para autorizacion---
/*IF :object_type='17' AND (:transaction_type='A' or :transaction_type='U') THEN

DECLARE cont INT;	
DECLARE maxrownumber INT;
DECLARE rownumber INT;
DECLARE linenumber INT;
DECLARE invoicelines INT;
DECLARE itemcode NVARCHAR (50);
DECLARE cardcode NVARCHAR (15);
DECLARE docdate DATE;
DECLARE backdate DATE;
		 
/*Verificar si el campo U_AUTOR_VENTA tiene valor SI/NO en la orden de venta*/
/*
SELECT CASE WHEN IFNULL(H0."U_AUTOR_VENTA",'')='S' THEN 1 ELSE 0 END INTO cont FROM ORDR H0 WHERE H0."DocEntry"= :list_of_cols_val_tab_del;
		
	IF cont = 0 THEN
	rownumber:= 0;
	SELECT COUNT(*) INTO maxrownumber FROM RDR1 WHERE "DocEntry" = :list_of_cols_val_tab_del;
	
		WHILE (:rownumber < :maxrownumber) DO
			SELECT "VisOrder" INTO linenumber FROM RDR1 WHERE "DocEntry" = :list_of_cols_val_tab_del AND "VisOrder" = :rownumber;
			SELECT "ItemCode" INTO itemcode FROM RDR1 WHERE "DocEntry" = :list_of_cols_val_tab_del AND "LineNum" = :linenumber;
			SELECT "BaseCard" INTO cardcode FROM RDR1 WHERE "DocEntry" = :list_of_cols_val_tab_del AND "LineNum" = :linenumber;
			SELECT "DocDate" INTO docdate FROM RDR1 WHERE "DocEntry" = :list_of_cols_val_tab_del AND "LineNum" = :linenumber;
			SELECT ADD_MONTHS(:docdate, -6) INTO backdate FROM DUMMY;
			
			SELECT COUNT (*) INTO invoicelines FROM INV1 T0 WHERE T0."ItemCode"=:itemcode AND T0."DocDate" BETWEEN :backdate AND :docdate AND T0."BaseCard"= :cardcode; 
			
			IF (:invoicelines <= 0) THEN	
			error:= 1;
			error_message:= 'SP-xx: Articulo en linea ('||:linenumber+1||') sin ventas en los ultimos meses, necesita autorizacion';
			END IF;
			
			rownumber:= :rownumber + 1;
		END WHILE;	
	END IF;
END IF;
*/
---------------------------------------------------------------------------------------------------------------------------------
/*IF :object_type='112' AND(:transaction_type='A' or :transaction_type='U') THEN

DECLARE cont INT;	
DECLARE maxrownumber INT;
DECLARE rownumber INT;
DECLARE linenumber INT;
DECLARE invoicelines INT;
DECLARE itemcode NVARCHAR (50);
DECLARE cardcode NVARCHAR (15);
DECLARE docdate DATE;
DECLARE backdate DATE;
		 
/*Verificar si el campo U_AUTOR_VENTA tiene valor SI/NO en la orden de venta*/
/*SELECT CASE WHEN IFNULL(H0."U_AUTOR_VENTA",'')='S' THEN 1 ELSE 0 END INTO cont FROM ODRF H0 WHERE H0."DocEntry"= :list_of_cols_val_tab_del; 
		
	IF cont = 0 THEN
	rownumber:= 0;
	SELECT COUNT(*) INTO maxrownumber FROM DRF1 WHERE "ObjType" = 17 AND "DocEntry" = :list_of_cols_val_tab_del;  
	
		WHILE (:rownumber < :maxrownumber) DO
			SELECT "VisOrder" INTO linenumber FROM DRF1 WHERE "DocEntry" = :list_of_cols_val_tab_del AND "VisOrder" = :rownumber;
			SELECT "ItemCode" INTO itemcode FROM DRF1 WHERE "DocEntry" = :list_of_cols_val_tab_del AND "LineNum" = :linenumber;
			SELECT "BaseCard" INTO cardcode FROM DRF1 WHERE "DocEntry" = :list_of_cols_val_tab_del AND "LineNum" = :linenumber;
			SELECT "DocDate" INTO docdate FROM DRF1 WHERE "DocEntry" = :list_of_cols_val_tab_del AND "LineNum" = :linenumber;
			SELECT ADD_MONTHS(:docdate, -6) INTO backdate FROM DUMMY;
			
			SELECT COUNT (*) INTO invoicelines FROM INV1 T0 WHERE T0."ItemCode"=:itemcode AND T0."DocDate" BETWEEN :backdate AND :docdate AND T0."BaseCard"= :cardcode; 
			
			IF (:invoicelines <= 0) THEN	
			error:= 1;
			error_message:= 'SP-xx: Articulo en linea ('||:linenumber+1||') sin ventas en los ultimos meses, necesita autorizacion';
			END IF;
			
			rownumber:= :rownumber + 1;
		END WHILE;	
	END IF;
END IF;
*/
---------------------------------------------------------------------------------------------------------------------------------
/* Factura con margen mayor a 60% */

IF (:object_type = '13' AND :transaction_type = 'A') THEN
DECLARE MARGEN INT;
SELECT (SELECT
		COUNT(*)
		FROM (SELECT
				A0."ItemCode",
				CASE 
					WHEN A0."TotalBruto" = 0 THEN 0 
					ELSE (A0."GrssProfit"/A0."TotalBruto")*100 
				END "%Ganancia"
				FROM (SELECT  
						T1."ItemCode", 
						T1."LineTotal" - (T1."LineTotal" * (T0."DiscSum" / (T0."DocTotal" + T0."WTSum" - T0."VatSum" - T0."RoundDif" - T0."TotalExpns" + T0."DpmAmnt" + T0."DiscSum"))) AS "TotalBruto", 
						T1."GrssProfit"
						FROM OINV T0 
						INNER JOIN INV1 T1 ON T0."DocEntry" = T1."DocEntry"
						WHERE :list_of_cols_val_tab_del = T0."DocEntry"
						AND T0."U_Check_Margen_FV" = 'N'
				) A0
		) B0
		WHERE B0."%Ganancia" > 60) INTO MARGEN  FROM DUMMY; 
	IF :MARGEN > 0 THEN 
    	SELECT 10 INTO error FROM DUMMY; 
        SELECT 'Por favor verificar margen de venta en "U_Check_Margen_FV es mayor a 60%" ' INTO error_message FROM DUMMY;
    END IF;             
END IF;
--------------------------------------------------------------------------------------------------------------------------------
/*  
IF (:object_type = '17' AND (:transaction_type = 'A' OR :transaction_type = 'U')) THEN
DECLARE MARGEN INT;
SELECT (SELECT
		COUNT(*)
		FROM (SELECT
				A0."ItemCode",
				CASE 
					WHEN A0."TotalBruto" = 0 THEN 0 
					ELSE (A0."GrssProfit"/A0."TotalBruto")*100 
				END "%Ganancia"
				FROM (SELECT  
						T1."ItemCode", 
						T1."LineTotal" - (T1."LineTotal" * (T0."DiscSum" / (T0."DocTotal" + T0."WTSum" - T0."VatSum" - T0."RoundDif" - T0."TotalExpns" + T0."DpmAmnt" + T0."DiscSum"))) AS "TotalBruto", 
						T1."GrssProfit"
						FROM ORDR T0 
						INNER JOIN RDR1 T1 ON T0."DocEntry" = T1."DocEntry"
						WHERE :list_of_cols_val_tab_del = T0."DocEntry"
						AND T0."U_Check_Margen" = 'N'
				) A0
		) B0
		WHERE B0."%Ganancia" > 60) INTO MARGEN  FROM DUMMY; 
	IF :MARGEN > 0 THEN 
    	SELECT 1702 INTO error FROM DUMMY; 
        SELECT '1702 - Por favor verificar margen de venta es mayor a 60%' INTO error_message FROM DUMMY;
    END IF;             
END IF;
*/
--------------------------------------------------------------------------------------------------------------------------------
/*  
IF (:object_type = '112' AND (:transaction_type = 'A' OR :transaction_type = 'U')) THEN
DECLARE MARGEN INT;
SELECT (SELECT
		COUNT(*)
		FROM (SELECT
				A0."ItemCode",
				CASE 
					WHEN A0."TotalBruto" = 0 THEN 0 
					ELSE (A0."GrssProfit"/A0."TotalBruto")*100 
				END "%Ganancia"
				FROM (SELECT  
						T1."ItemCode", 
						T1."LineTotal" - (T1."LineTotal" * (T0."DiscSum" / (T0."DocTotal" + T0."WTSum" - T0."VatSum" - T0."RoundDif" - T0."TotalExpns" + T0."DpmAmnt" + T0."DiscSum"))) AS "TotalBruto", 
						T1."GrssProfit"
						FROM ODRF T0 
						INNER JOIN DRF1 T1 ON T0."DocEntry" = T1."DocEntry"
						WHERE :list_of_cols_val_tab_del = T0."DocEntry" AND T0."ObjType" = 17
						AND T0."U_Check_Margen" = 'N'
				) A0
		) B0
		WHERE B0."%Ganancia" > 60) INTO MARGEN  FROM DUMMY; 
	IF :MARGEN > 0 THEN 
    	SELECT 1121702 INTO error FROM DUMMY; 
        SELECT '1121702 - Por favor verificar margen de venta es mayor a 60%' INTO error_message FROM DUMMY;
    END IF;             
END IF;
*/
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

--ENTREGA CON PRECIOS DISTINTOS A LOS ESTABLECIDOS EN LISTA DE PRECIOS ESPECIALES POR SOCIOS DE NEGOCIOS
IF(:object_type = '15' AND (:transaction_type='A' OR :transaction_type='U')) THEN
                DECLARE COUNTER INT;
                SELECT COUNT(*) INTO COUNTER
                FROM ODLN T0
                INNER JOIN DLN1 T1 ON T0."DocEntry"=T1."DocEntry"
                INNER JOIN OSPP T2 ON T0."CardCode"=T2."CardCode" AND T1."ItemCode"=T2."ItemCode" 
                WHERE (T1."Currency" <> T2."Currency" OR T1."Price"<>T2."Price") AND T1."ItemCode"=T2."ItemCode" AND T0."DocEntry"=:list_of_cols_val_tab_del;         
                IF :COUNTER > 0 THEN
                               error := 1501;
                               error_message := 'Precio en lineas de la entrega no puede ser distinto del establecido en la lista de precios especiales para el socio de negocio';
                END IF;
END IF;

----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

--ENTREGA CON ARTICULOS DIFERENTES A LA LISTA DE PRECIOS ESPECIALES 

IF(:object_type = '15' AND (:transaction_type='A' OR :transaction_type='U')) THEN
                DECLARE COUNTER INT;
                SELECT COUNT(*)  INTO COUNTER
FROM ODLN T0  
INNER JOIN DLN1 T1 ON T0."DocEntry" = T1."DocEntry" 
WHERE T1."ItemCode" NOT IN (Select "ItemCode" from OSPP where "CardCode" = T0."CardCode" ) and T0."DocEntry"=:list_of_cols_val_tab_del;
IF :COUNTER > 0 THEN
                               SELECT 1502 INTO error FROM DUMMY;
                               SELECT 'Uno de los articulo no se encuentra en la lista de precios especiales para el socio de negocio' INTO error_message FROM DUMMY;
                              
                END IF;
END IF;

	/*******************************************************/
    /*******************************************************/
    /*** INICIO VALIDACIONES V3 PARA FACTURA ELECTRONICA ***/
    
	/********************************/
    /*** V3 - FACTURA ELECTRONICA ***/
    /********************************/
    /*
    IF :Object_Type = 'V3_CR_FCE' THEN 
        CALL "SBO_SP_TransactionNotification_V3_OBJETOS_FCE"(:object_type, :transaction_type, :num_of_cols_in_key, 
        :list_of_key_cols_tab_del, :list_of_cols_val_tab_del, :error, :error_message);
        
    END IF;
    */
    
    /*************************/
    /*** VENTAS - FACTURAS ***/
    /*************************/
    
    IF :Object_Type = '13' THEN 
    
    	select "DocSubType" into DocSubType from OINV where "DocEntry" = :list_of_cols_val_tab_del;
    	
    	if :DocSubType <> 'DN' then
	        CALL "SBO_SP_TransactionNotification_V3_FE_VE_FC"(:object_type, :transaction_type, :num_of_cols_in_key, 
	        :list_of_key_cols_tab_del, :list_of_cols_val_tab_del, :error, :error_message);
        
        
        /*else
        	CALL "SBO_SP_TransactionNotification_V3_FE_VE_ND"(:object_type, :transaction_type, :num_of_cols_in_key, 
	        :list_of_key_cols_tab_del, :list_of_cols_val_tab_del, :error, :error_message);
		*/
	    end if;
	    
    END IF;
    
    /*********************************/
    /*** VENTAS - NOTAS DE CREDITO ***/
    /*********************************/
    
    IF :Object_Type = '14' THEN 
        CALL "SBO_SP_TransactionNotification_V3_FE_VE_NC"(:object_type, :transaction_type, :num_of_cols_in_key, 
        :list_of_key_cols_tab_del, :list_of_cols_val_tab_del, :error, :error_message);
        
    END IF;
    
    /*** FIN VALIDACIONES V3 PARA FACTURA ELECTRONICA ***/
    /****************************************************/
    /****************************************************/
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
-- Select the return values
select :error, :error_message FROM dummy;
end;

agradzeco su ayuda

Creo que te falta un 3 al final de tu object_type = '1470000113'

@diego1986 … edité tu mensaje. Por favor :pray: lee cómo usar el foro, aprende a usar el botón para darle formato a los códigos, un código no es lo mismo que texto normal. No publiques códigos sin formato!

:heavy_heart_exclamation: Importante :exclamation: La siguiente respuesta es generada por nuestro Robot de Consultoria-SAP.com denominado “CSAPBOT” usando tecnología de IA -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 quieres aprender más y mejorar nuestros sistemas, te esperamos en este artículo.


Hola, gracias por compartir tu código completo del Transaction Notification (TN) en SAP Business One.

Tu requerimiento es:

Bloquear la creación de solicitudes de compra (objeto 147000011) cuando el total del documento sea cero o alguna línea tenga precio 0 o vacío.

La lógica que ya tenés definida apunta en buena dirección, pero puede fallar por algunos motivos comunes que vamos a corregir ahora.


:white_check_mark: Problema identificado

El TN que compartiste:

IF (:object_type = '147000011' AND :transaction_type = 'A') THEN
    DECLARE PRECIO_INVALIDO INT;

    SELECT (SELECT COUNT(*)
            FROM PRQ1
            WHERE "DocEntry" = :list_of_cols_val_tab_del
              AND (IFNULL("Price", 0) <= 0)) INTO PRECIO_INVALIDO FROM DUMMY;

    IF :PRECIO_INVALIDO > 0 THEN 
        SELECT 1471 INTO error FROM DUMMY;
        SELECT 'Error 1471: Hay líneas con precio igual o menor a cero en la solicitud de compra.' INTO error_message FROM DUMMY;
    END IF;
END IF;

Este código puede fallar porque:

  1. :list_of_cols_val_tab_del es un string tipo texto con el valor del DocEntry, pero si no lo casteás explícitamente, puede no hacer match.
  2. No estás validando el total del documento (OPRQ.DocTotal), que también querés controlar.

:hammer_and_wrench: Solución propuesta (TN corregido y ampliado)

A continuación te dejo un bloque optimizado que sí impide crear la solicitud si:

  • Alguna línea tiene Price = 0 o nulo
  • El total del documento es 0
IF (:object_type = '147000011' AND :transaction_type = 'A') THEN
    DECLARE PRECIO_INVALIDO INT DEFAULT 0;
    DECLARE TOTAL_INVALIDO INT DEFAULT 0;

    -- Validar líneas con precio cero o nulo
    SELECT COUNT(*) INTO PRECIO_INVALIDO
    FROM PRQ1
    WHERE "DocEntry" = CAST(:list_of_cols_val_tab_del AS INT)
      AND (IFNULL("Price", 0) <= 0);

    -- Validar total del documento en cero
    SELECT COUNT(*) INTO TOTAL_INVALIDO
    FROM OPRQ
    WHERE "DocEntry" = CAST(:list_of_cols_val_tab_del AS INT)
      AND IFNULL("DocTotal", 0) = 0;

    IF :PRECIO_INVALIDO > 0 THEN
        error := 1471;
        error_message := 'No se permite crear la solicitud: Hay líneas con precio 0 o en blanco.';
    ELSEIF :TOTAL_INVALIDO > 0 THEN
        error := 1472;
        error_message := 'No se permite crear la solicitud: El total del documento es igual a cero.';
    END IF;
END IF;

:repeat: Recomendación adicional

Ya que estás gestionando múltiples validaciones en el mismo TN, es buena práctica separar cada sección por objeto de negocio, como hiciste con las entregas, facturas, etc. Esto mejora el mantenimiento futuro.

También podrías llevar un log de errores con una tabla Z si necesitás auditoría de rechazos, y validarlo en los Foros SAP de Consultoria-SAP.com.


:spiral_notepad: Resumen Consultoria-SAP

Para impedir la creación de solicitudes de compra (SAP B1) cuando tienen líneas con precio cero o el total del documento es 0, debés ajustar el Transaction Notification con validaciones explícitas sobre la tabla PRQ1 y OPRQ. Asegurate de usar correctamente CAST() sobre el DocEntry, ya que es un valor de texto recibido en el parámetro del TN. Esta solución aplica para el módulo MM/Purchasing en SAP B1. Podés seguir optimizando la lógica centralizando el control de calidad del dato en los documentos de compras.

¡Estamos aquí para ayudarte en los Foros SAP de Consultoria-SAP!

Es correcto lo que dice @epr06, falta un 3 en el tipo de objeto, también creo que deberías bloquear si intentan actualizar la solicitud, ya que si al momento de crearla si tiene precio, pero después lo actualizan a precio CERO, lo permitirá.

If :object_type = '1470000113' AND (:transaction_type ='A' OR :transaction_type ='U')
THEN
SELECT (
  SELECT TOP 1 T1."ItemCode"
                FROM "BDATOS"."OPRQ" T0 
                INNER JOIN "BDATOS"."PRQ1" T1 ON T1."DocEntry"= T0."DocEntry"
                WHERE 
                T0."DocEntry" =  list_of_cols_val_tab_del and 
                T1."Price" <= 0 
                )
                INTO ItemBC FROM dummy ;

IF  :ItemBC IS NOT NULL THEN
  error := 2 ;
  error_message :='Error (SP): Existe(n) Articulo(s) ' || :ItemBC || ' Con Precio Incorrecto';
end IF;
end IF;
1 me gusta

Este tema se cerró automáticamente 2 días después de la última publicación. No se permiten nuevas respuestas.