


/*************************************************
* STORED stp_PostRxDt_addDtx
*
* fa tutti i processi di associazione DataMatrix in post RX - DT:
* - controlla il particolare da Dtx
* - genera eventuale UDC del particoalre su cella/posizione corrente
* - associa Dtx a UDC
* - fa controllo, se ho almeno 2 Dtx ok associo tutti i Dtx compresi nell'intervallo min-MAX
*
* Steamware, S.E.L.
* mod: 2014.03.07
*
*************************************************/
CREATE PROCEDURE [dmtx].[stp_PostRxDt_addDtx_OLD]
(
	@DataMatrix		NVARCHAR(50),
	@CodSoggetto	VARCHAR(17),
	@IdxPosizione	INT,
	@IdxCella		INT = 0 -- cella in cui si trova il dmtx
)
AS

DECLARE @Particolare	NVARCHAR(15) = '',
		@PartNumber		NVARCHAR(30) = '',
		@UDC			NVARCHAR(50) = '',
		@CodStato		NVARCHAR(50) = 'RX',
		@trovati		INT = 0,
		@DtFirst		DATETIME,
		@DtLast			DATETIME

-- Create a temporary table variable to hold the output actions.
DECLARE @SummaryOfChanges TABLE(Change VARCHAR(20));

SET NOCOUNT ON;
SET XACT_ABORT ON;

BEGIN Tran

	-- calcolo il partNumber ed il particolare da DTX 	
	SELECT	@PartNumber = PartNumber, @Particolare = Particolare
	FROM	dmtx.v_TrascDatamatrix
	WHERE	(PartNumber = dmtx.f_getPN(@DataMatrix))

	-- calcolo UDC da posizione e cella...
	SELECT	@UDC = ec.UDC
	FROM	dbo.PosizioneUdcCorrente puc
	INNER JOIN dbo.ElencoCartellini ec
		ON puc.UDC = ec.UDC
	WHERE puc.IdxCella = @IdxCella
		AND ec.IdxPosizione = @IdxPosizione
		AND	ec.Particolare = @Particolare

	-- associo il singolo DTX ad UDC
	INSERT INTO dbo.Dtx2UDC (DataMatrix, CodStato, UDC, DataOra, CodSoggetto, Particolare)
	VALUES	(@DataMatrix, @CodStato, @UDC, GETDATE(), @CodSoggetto, @Particolare) 

	--INSERT INTO dbo.Dtx2UDC (DataMatrix, UDC, DataOra, CodSoggetto, Particolare)
	--VALUES	(@DataMatrix, @UDC, GETDATE(), @CodSOggetto, @Particolare) 

SELECT 1/0

	-- ..e se ci sono almeno 2 Dtx OK in elenco...
	SELECT	@trovati = COUNT(d2c.DataMatrix)
	FROM	dbo.Dtx2UDC d2c
    INNER JOIN dmtx.v_ElencoDatamatrixBMW edb ON edb.DataMatrix = d2c.DataMatrix COLLATE Latin1_General_CI_AS
	INNER JOIN dbo.PosizioneUdcCorrente puc
		ON d2c.UDC = puc.UDC
	INNER JOIN dbo.ElencoCartellini ec
		ON puc.UDC = ec.UDC
	WHERE puc.IdxCella = @IdxCella
		AND ec.IdxPosizione = @IdxPosizione
        AND edb.EsitoMarcatura = 'OK'         -- inizio e fine intervallo non possono essere mai dei KO

	IF(@trovati > 1)
	BEGIN
		-- recupero le 2 data-ora dell'intervallo
		SELECT	@DtFirst = MIN(edb.DataOra), @DtLast = MAX(edb.DataOra)
		FROM	dmtx.v_ElencoDatamatrixBMW edb
		INNER JOIN dbo.Dtx2UDC d2c
			ON	edb.DataMatrix = d2c.DataMatrix COLLATE Latin1_General_CI_AS
		INNER JOIN dbo.PosizioneUdcCorrente puc
			ON	d2c.UDC = puc.UDC
		INNER JOIN dbo.ElencoCartellini ec
			ON	puc.UDC = ec.UDC
		WHERE	puc.IdxCella = @IdxCella
			AND ec.IdxPosizione = @IdxPosizione
			AND edb.EsitoMarcatura = 'OK'

		-- ASSOCIO TUTTI i Dtx compresi in intervallo ai vari UDC
		MERGE INTO Dtx2UDC AS Target
		USING (
			SELECT	Dtx.DataMatrix, Trasc.Particolare, puc.UDC
			FROM	dmtx.v_ElencoDatamatrixBMW AS Dtx
			LEFT JOIN dmtx.v_TrascDatamatrix AS Trasc
				ON	dmtx.f_getPN(Dtx.DataMatrix) = Trasc.PartNumber
			INNER JOIN ElencoCartellini ec
				ON Trasc.Particolare = ec.Particolare
			INNER JOIN PosizioneUdcCorrente puc
				ON	puc.UDC = ec.UDC
			WHERE dtx.EsitoMarcatura = 'OK' -- solo OK!
				AND dtx.Associato = 0		-- NON RIASSOCIO se già associati
				AND (
					Dtx.DataOra BETWEEN @DtFirst
						AND @DtLast
					)
				AND NOT (Trasc.Particolare IS NULL)
				AND	puc.IdxCella = @IdxCella
				AND ec.IdxPosizione = @IdxPosizione
			)
				AS Source
		ON Target.DataMatrix = Source.DataMatrix COLLATE Latin1_General_CI_AS
		--WHEN MATCHED THEN
		--	UPDATE SET PackagName = Source.PackagName
		WHEN NOT MATCHED BY TARGET THEN
			INSERT (DataMatrix, CodStato, UDC, DataOra, CodSoggetto, Particolare) VALUES (DataMatrix, @CodStato, UDC, GETDATE(), @CodSoggetto, Particolare)
		OUTPUT $action INTO @SummaryOfChanges;
		
		-- segno come associati i DTX che ho collegato...
		UPDATE dtx
		SET Associato = 1
		FROM dmtx.v_ElencoDatamatrixBMW AS Dtx
		INNER JOIN dbo.Dtx2UDC d2c ON Dtx.DataMatrix = d2c.DataMatrix COLLATE Latin1_General_CI_AS
		WHERE dtx.Associato = 0

    END
   --ELSE
   -- BEGIN
        -- segno come associati i DTX che ho collegato...
		UPDATE dtx
		SET Associato = 1
		FROM dmtx.v_ElencoDatamatrixBMW AS Dtx
		INNER JOIN dbo.Dtx2UDC d2c ON Dtx.DataMatrix = d2c.DataMatrix COLLATE Latin1_General_CI_AS
		WHERE dtx.Associato = 0        
--   END

	-- ricalcolo QTA degli UDC
	UPDATE ec
	SET Qta = conteggio.qty
	FROM dbo.ElencoCartellini ec
	INNER JOIN (
		SELECT d2c.UDC
			, COUNT(d2c.DataMatrix) AS qty
		FROM Dtx2UDC d2c
		INNER JOIN dbo.PosizioneUdcCorrente puc
			ON d2c.UDC = puc.UDC
		INNER JOIN dbo.ElencoCartellini ec
			ON puc.UDC = ec.UDC
		WHERE puc.IdxCella = @IdxCella
			AND ec.IdxPosizione = @IdxPosizione
		GROUP BY d2c.UDC
		) AS conteggio
		ON ec.UDC = conteggio.UDC

COMMIT Tran;

-- restituisco elenco Dtx degli UDC coinvolti...
SELECT d2c.*
FROM dbo.Dtx2UDC d2c
INNER JOIN dbo.PosizioneUdcCorrente puc
	ON d2c.UDC = puc.UDC
INNER JOIN dbo.ElencoCartellini ec
	ON puc.UDC = ec.UDC
WHERE puc.IdxCella = @IdxCella
	AND ec.IdxPosizione = @IdxPosizione

RETURN