Reconciliación de Lotes (Batch) de Ventas (SOP) Parte III

Microsoft Dynamics GP
Estaba un poco distraido en el hobby de los modelos de escala que tardé tiempo en actualizar la segunda parte de este artículo. Esta vez voy de una vez con la tercera y última parte de la presentación de los resultados.
Pero antes olvidé algo. La forma de conciliación tiene un checkbox que pregunta si solo va a emitir el reporte. Como curiosidad el mensaje que el reporte arroja indica que los valores fueron corregidos aunque no es cierto. Hahaha!!! Desde mi punto de vista el reporte debería enviar mensajes indicando las inconsistencias simplemente, pero bueno, dejaron el mismo reporte. Siguiendo la misma linea, voy a dejar el mismo reporte también… 🙂
El script de SQL tiene un pequeño cambio. Ahora recibe un nuevo parámetro que le indica si debe solo generar el reporte o también debe conciliar:


SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
IF EXISTS(SELECT * FROM [sys].[procedures] WHERE [name] = 'gpspSOPBatchesReconcile') BEGIN
	DROP PROCEDURE [dbo].[gpspSOPBatchesReconcile];
END
GO
-- =============================================
-- Description:	Reconcile SOP Batches
-- =============================================
CREATE PROCEDURE [dbo].[gpspSOPBatchesReconcile]
	@USERID CHAR(15) = '',
	@REPORTONLY BIT = 0
AS
BEGIN
	DECLARE @LINE INT
	DECLARE @RANGE CHAR(133) = 'Document Number:                                                                                                                     '

	SET NOCOUNT ON;
	
	SELECT @LINE = COUNT(*) FROM [dbo].[SOP50700] R WHERE R.[USERID] = @USERID
	IF @LINE < 7
	BEGIN
		SET @LINE = 7
	END

	INSERT INTO [dbo].[SOP50700]
	(
		[FIELD12],
		[SEQNUMBR],
		[USERID],
		[Process_ID]
	)
	(
	SELECT
		LEFT(B.[BACHNUMB]+'                              ',30)+'Lote: '+IIF(B.[NUMOFTRX] - T.[REALNUMOFTRX] <> 0,'  Corregido el número de transacciones de '+LTRIM(RTRIM(STR(B.[NUMOFTRX])))+' a '+LTRIM(RTRIM(STR(T.[REALNUMOFTRX]))), ' ')+IIF(B.[BCHTOTAL] - T.[REALBCHTOTAL] <> 0,' Corregido el monto del lote de '+LTRIM(RTRIM(STR(B.[BCHTOTAL])))+' a '+LTRIM(RTRIM(STR(T.[REALBCHTOTAL]))), ' ') 'FIELD12',
		ROW_NUMBER() OVER (ORDER BY B.[BACHNUMB]) + @LINE 'SEQNUMBR',
		@USERID 'USERID',
		0 'Process_ID'
	FROM
		[dbo].[SY00500] B
	JOIN
		(SELECT
			H.[BACHNUMB],
			ISNULL(COUNT(H.[SOPNUMBE]), 0) 'REALNUMOFTRX',
			ISNULL(SUM(H.[DOCAMNT]), 0) 'REALBCHTOTAL'
		FROM
			[dbo].[SOP10100] H
		GROUP BY
			H.[BACHNUMB]) T ON
		T.[BACHNUMB] = B.[BACHNUMB]
	WHERE
		B.[SERIES] = 3 AND
		B.[BCHSOURC] = 'Sales Entry' AND
		(B.[NUMOFTRX] - T.[REALNUMOFTRX] <> 0 OR
		B.[BCHTOTAL] - T.[REALBCHTOTAL] <> 0)
	);
	IF @REPORTONLY = 0
	BEGIN
		WITH T AS (
			SELECT
				H.[BACHNUMB],
				ISNULL(COUNT(H.[SOPNUMBE]), 0) 'REALNUMOFTRX',
				ISNULL(SUM(H.[DOCAMNT]), 0) 'REALBCHTOTAL'
			FROM
				[dbo].[SOP10100] H
			GROUP BY
				H.[BACHNUMB]
		)
		UPDATE C
		SET
			C.[NUMOFTRX] = T.[REALNUMOFTRX],
			C.[BCHTOTAL] = T.[REALBCHTOTAL]
		FROM
			[dbo].[SY00500] C
		JOIN T ON T.[BACHNUMB] = C.[BACHNUMB]
		WHERE
			C.[SERIES] = 3 AND
			C.[BCHSOURC] = 'Sales Entry' AND
			(C.[NUMOFTRX] - T.[REALNUMOFTRX] <> 0 OR
			C.[BCHTOTAL] - T.[REALBCHTOTAL] <> 0);
	END

	RETURN @@ROWCOUNT;
END
GO
GRANT EXECUTE ON [dbo].[gpspSOPBatchesReconcile] TO [DYNGRP];
GO

Como la definición del script gpspSOPBatchesReconcile de SQL cambia porque tiene un parámetro adicional, el Prototype Procedure también:


sproc returns long lStatus;
in string UserId;
in boolean ReportOnly;

local long lSleep;

try
	call sproc "gpspSOPBatchesReconcile",lStatus,UserId,ReportOnly;
catch [EXCEPTION_CLASS_DB]
	lSleep=Timer_Sleep(200);
	restart try;
catch [EXCEPTION_CLASS_DB_CHG_TRAN_LVL]
	lSleep=Timer_Sleep(200);
	restart try;
catch [EXCEPTION_CLASS_DB_DEADLOCK]
	lSleep=Timer_Sleep(200);
	restart try;
catch [EXCEPTION_CLASS_DB_TRAN_IMP_ROLLBACK]
	lSleep=Timer_Sleep(200);
	restart try;
else
	exit try;
end try;

Entonces la llamada que hace el script que ejecuta el trigger SOPBatchesReconcile también para que pase el parámetro faltante que es el valor del checkbox de la pantalla:


local long lStatus;

if 'Include GB' of window SOP_Reconcile of form SOP_Reconcile=0 then
	call gpspSOPBatchesReconcile,
		lStatus,
		'User ID' of globals,
		'(L) Print Report Only' of window SOP_Reconcile of form SOP_Reconcile;
end if;

Con esto ahora si está listo!!!

Para finalizar, como se realizó completamente con las herramientas de desarrollo nativas la solución es 100% compatible con desktop y web client. Si… En test-mode pueden probar la aplicación en desktop… y si crean el chunk de distribución pueden probarlo en los dos ambientes. Este es el resultado de las pruebas en los dos ambientes:

Microsoft Dynamics GP SOP Reconcile Report Desktop
Microsoft Dynamics GP SOP Reconcile Report Web Client

Si tienen dudas escríbanme sus comentarios!!! Hasta la próxima!!!

Leave a Reply