El codigo a simple vista se ve bien, aunque no hace falta recorrer todas las lineas de la factura con el WHILE, ya que SAP ejecuta el TN por cada linea que va guardando. Hay que verificar si los datos registrados en las tablas estan correctos, pudiera ser que en alguno no este guardando el costo correctamente (OITW) o el DocRate de OINV sea incorrecto.
Yo usualmnete he usado este codigo y funciona perfecto:
IF @object_type = '13' AND @transaction_type in ('A')
BEGIN
If exists (Select b.ItemCode
From OINV a join INV1 b on a.DocEntry=b.DocEntry
Where a.DocEntry = @list_of_cols_val_tab_del
and b.StockPrice > b.Price)
BEGIN
set @error =1
set @error_message = 'Precio de Venta Inferior a Costo'
END
END
Tambien esta este otro ejemplo usando lista de precios, que tambien sirve de base para ver como funcionan estas validaciones:
IF (@transaction_type = 'A' or @transaction_type = 'U') AND @object_type = '17'
BEGIN
if exists (Select Distinct (T1.ItemCode) from RDR1 T1 INNER JOIN ORDR T0
ON T0.DocEntry = T1.DocEntry
where (select t3.price
from ITM1 t3
where T3.ITEMCODE=T1.ITEMCODE and t3.pricelist=2) > t1.price
and (T0.docentry = @list_of_cols_val_tab_del))
begin
SELECT @error = 1
SET @error_message = 'No se permite un precio por debajo de lista'
end
END
Saludos y espero que lo resuelvas .