Entrada de mercancía contra orden de compra

Que tal compañeros.

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.

Saludos.

Buenas tardes Mike

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
1 me gusta

Que tal compañero, te agradezco tu amable ayuda.

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
1 me gusta