En la empresa para la que trabajo tiene la situación que generan varias ordenes de compra o pedidos de un mismo articulo y de un mismo proveedor.
Debido a que el proveedor no entrega el producto contra orden de compra y al mismo tiempo hacen entregas parciales se le debe ir dando ingreso a la mercancía desde el pedido u orden de compra mas antiguo.
Se dio la situación que por error del usuario que hace las entradas de mercancía le dio ingreso al producto dejando ordenes de compra abiertas intercaladas.
Debido a esta situación se necesita crear una validación que verifique y no permita realizar entradas de mercancía a ordenes de compra posteriores o mas recientes si existen ordenes de compra abiertas de fecha anterior.
Agradeceré cualquier ayuda que me sirva para poder crear esta validación.
Te proporciono una validación para aplicarla en el TransactionNotification, espero te ayude.
NOTA: Acostumbro utilizar una etiqueta al final del TransactionNotification, para evitar continuar las validaciones posteriores al lanzar un error, enviado el control hasta dicha etiqueta “FINAL_DEL_PROCESO_TransactionNotification”, que por cierto la tengo comentada en el ejemplo.
if (@transaction_type in ('A') and @object_type = '20')
begin
declare @proveedor_entrada as varchar(20) = isnull((select t0.CardCode from opdn t0 where t0.docentry = @list_of_cols_val_tab_del),'');
declare @docentry_pedido_aplicado_en_la_entrada as varchar(10) = (select t1.baseentry from pdn1 t1 where t1.docentry = @list_of_cols_val_tab_del);
declare @producto_pedido_aplicado_en_la_entrada as varchar(10) = (select t1.itemcode from pdn1 t1 where t1.docentry = @list_of_cols_val_tab_del);
declare @docnum_pedido_aplicado_en_la_entrada as varchar(10) = (select t0.docnum from opor t0 where t0.docentry = @docentry_pedido_aplicado_en_la_entrada);
-- BUSCA/RECUPERA EL "DocEntry" DEL PRIMER PEDIDO EN EL QUE SU DOCENTRY SEA MENOR AL DOCENTRY DEL PEDIDO APLICADO A LA ENTRADA, ADEMÁS DEBE ESTAR ABIERTO Y DEBE SER DEL MISMO PROVEEDOR Y PRODUCTO EN CUESTIÓN
-- NOTA: SI NO EXISTE UN PEDIDO ANTERIOR, ASIGNARÁ EL VALOR CERO "0" A LA VARIABLE, LO CUAL INDICA QUE PASARÁ LA VALIDACIÓN
declare @docentry_primer_pedido_disponible as varchar(10) = isnull((select top(1) t0.docentry from opor t0 inner join por1 t1 on t0.docentry = t1.docentry where t0.docentry < @docentry_pedido_aplicado_en_la_entrada and t0.cardcode = @proveedor_entrada and t1.itemcode = @producto_pedido_aplicado_en_la_entrada and t1.linestatus = 'O' order by t1.docentry),'0');
-- RECUPERA EL DOCNUM PARA MOSTRARLO AL USUARIO EN EL MENSAJE EN CASO DE PROCEDER
declare @docnum_primer_pedido_disponible as varchar(10) = (select t0.docnum from opor t0 where t0.docentry = @docentry_primer_pedido_disponible);
-- VALIDA QUE LA ENTRADA TENGA UN DOCUMENTO BASE DE PEDIDO
if ((select t1.BaseType from pdn1 t1 where t1.docentry = @list_of_cols_val_tab_del) <> '22')
begin
SET @error = 9;
SET @error_message = 'ATENCION !!! La entrada de mercancías NO tiene un pedido como documento base, revise por favor...';
--GOTO FINAL_DEL_PROCESO_TransactionNotification;
end
-- VALIDA QUE EL VALOR DEL DOCENTRY DEL POSIBLE PEDIDO MAS ANTIGUO CON RESPECTO AL APLICADO EN LA ENTRADA
if (convert(int,@docentry_primer_pedido_disponible) > 0)
begin
-- REALIZA LA COMPARACIÓN PARA SABER SI EL PEDIDO APLICADO A LA ENTRADA ES EL MÁS ANTIGUO, DE LO CONTRARIO MUESTRA EL MENSAJE AL USUARIO
if (@docentry_pedido_aplicado_en_la_entrada <> @docentry_primer_pedido_disponible)
begin
SET @error = 9;
SET @error_message = 'ATENCION !!! El pedido No. ' + @docnum_primer_pedido_disponible + ' ES MÁS antiguo que el pedido No. ' + @docnum_pedido_aplicado_en_la_entrada + ' elegido para la entrada, revise por favor...';
--GOTO FINAL_DEL_PROCESO_TransactionNotification;
end
end
end
Logre hacerlo de una forma diferente y también funciona:
IF (@OBJECT_TYPE = '20' AND @TRANSACTION_TYPE IN ('A','U'))
BEGIN
Select @CardCode = T0.CardCode,
@ArticuloNom = T1.ItemCode,
@Numero = T1.BaseDocNum
From OPDN T0 INNER JOIN PDN1 T1 ON T0.DocEntry=T1.DocEntry
Where T0.DocEntry = @list_of_cols_val_tab_del
select top 1 @DOCTONO = T0.[DocNum]
from OPOR T0
INNER JOIN POR1 T1 ON T0.DocEntry=T1.DocEntry
WHERE T1.[ItemCode]=@ArticuloNom
AND T0.[CardCode]=@CardCode AND T1.OpenQty > 0
ORDER BY T0.[DocDate]
IF @DOCTONO <> @Numero
BEGIN
SET @ERROR = 2
SET @ERROR_MESSAGE = 'EXISTE UNA OC ABIERTA DE ESTE MISMO PRODUCTO Y PROVEEDOR #'+ convert(varchar(16),@DOCTONO)
--GOTO FIN
END
END