

/*************************************************
* 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., G.A.R.
* mod: 2014.03.12
*
*************************************************/
CREATE PROCEDURE [dmtx].[stp_PostRxDt_addDtx]
(
	@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) = 'ContrRx',
		@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 TRY;
 BEGIN TRANSACTION;

	-- 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 se non è già associato
    IF NOT EXISTS ( SELECT * FROM dbo.Dtx2UDC WHERE DataMatrix = @DataMatrix ) AND @UDC IS NOT NULL    -- controllo anche di aver trovato UDC
	    INSERT INTO dbo.Dtx2UDC (DataMatrix, CodStato, UDC, DataOra, CodSoggetto, Particolare)
	    VALUES	(@DataMatrix, @CodStato, @UDC, GETDATE(), @CodSoggetto, @Particolare)

	-- ..e se ci sono almeno 2 Dtx OK in elenco datamatrix
	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 dbo.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;  -- per riabilitarlo togliere il ; precedente
		
		-- 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

    -- segno come associati tutti i DTX che trovo collegati in Dtx2UDC ...
	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        

	-- ricalcolo QTA degli UDC nella locazione
	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 TRANSACTION;
END TRY
-- ====================================
--  GESTIONE ERRORI
-- ====================================
BEGIN CATCH

    DECLARE @ErrorMessage NVARCHAR(4000);
    DECLARE @ErrorSeverity INT;
    DECLARE @ErrorState  INT;
    DECLARE @ErrorNumber INT;

    SELECT @ErrorMessage  = ERROR_MESSAGE() + ' Error Number : ' + CONVERT( Varchar(10) , ERROR_NUMBER()) + ' : ' + ISNULL(OBJECT_NAME(@@PROCID),'stored?'),
           @ErrorNumber   = ERROR_NUMBER(),
           @ErrorSeverity = ERROR_SEVERITY(),
           @ErrorState    = ERROR_STATE();

    -- Test XACT_STATE for 1 or -1.
    -- XACT_STATE = 0 means there is no transaction and a commit or rollback operation would generate an error.
    IF (XACT_STATE()) <> 0
    BEGIN
        PRINT N'stp_PostRxDt_addDtx error - ' + 'Rolling back transaction.'   -- non lo trovo in nessun log
        ROLLBACK TRANSACTION;
    END;

    ---- Test whether the transaction is active and valid. In realtà qui dovrei testare se è 
    ---- la stessa transazione aperta dalla stored salvandone il numero all'inizio
    --IF (XACT_STATE()) = 1
    --BEGIN
    --    PRINT N'stp_PostRxDt_addDtx The transaction is committable. ' + 'Committing transaction.'
    --    COMMIT TRANSACTION;   
    --END;
    
    -- Use RAISERROR inside the CATCH block to return error information about the original error that caused execution to jump to the CATCH block.
    RAISERROR (@ErrorMessage, -- Message text.
               @ErrorSeverity, -- Severity.
               @ErrorState -- State.
               ) WITH LOG;  -- Scrivo nel LOG di SQL ( e application log )

END CATCH;

-- 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