set xact_abort on;
go

begin transaction;
go

set ANSI_NULLS on;
go

/***************************************
* STORED stp_spostaUdc
*
* sposta un UDC, salvandone la posizione precedente (se esiste) nella tab storica
*
* Steamware, S.E.L.
* mod: 2010.06.11
*
****************************************/
alter PROCEDURE stp_spostaUdc
(
	@CodCS VARCHAR(2),
	@UDC VARCHAR(50),
	@IdxCellaTo INT,
	@resetRLP BIT
)
AS

BEGIN TRAN
	
	-- DICHIARAZIONI iniziali variabili
	DECLARE @IdxCellaFrom INT
	DECLARE @capienza INT
	DECLARE @numUdc INT
	
	-- controllo cella di partenza
	SET		@IdxCellaFrom = (SELECT IdxCella FROM PosizioneUdcCorrente WHERE UDC = @UDC)
	SET		@IdxCellaFrom = ISNULL(@IdxCellaFrom,0) -- controllo x cella null...
	-- controllo se cella di destinazione e di partenza coincidono NON FACCIO NULLA... altrimenti procedo
	IF (@IdxCellaTo <> @IdxCellaFrom)
		BEGIN
			
			-- controllo se la cella di partenza vada indicata come piena o meno
			SET		@capienza = (
									SELECT tc.Capienza 
										FROM TipoCella TC INNER JOIN Celle c ON TC.IdxTipoCella=c.IdxTipoCella
										WHERE c.IdxCella = @IdxCellaFrom	
								)
			SET @numUdc = (SELECT COUNT(*) FROM PosizioneUdcCorrente WHERE IdxCella = @IdxCellaFrom)
			-- se capienza cella di partenza NON raggiunta aggiorno NON Piena
			IF(@numUdc -1 < @capienza)
				BEGIN
					EXEC stp_celle_updPiena @IdxCellaFrom, 0
				END
				
			-- cancello posizione occupata
			DELETE
			FROM	PosizioneUdcCorrente
			WHERE	UDC = @UDC
			
			-- SE RICHIESTO cancello eventuali righe liste di prelievo FUSI per l'UDC
			IF(@resetRLP = 1)
			BEGIN
				DELETE FROM RigheListePrelievo
					WHERE UDC = @UDC AND CodLista IN ( 
						SELECT CodLista FROM ElencoListePrelievo 
						--WHERE CodTipoLista='01-PreFus'
						WHERE CodStatoLista < 4
					)
			END

			
			
			-- creo una nuova posizione per l'UDC
			INSERT INTO PosizioneUdcCorrente(UDC, IdxCella, CodCS, DataRif)
			VALUES(@UDC, @IdxCellaTo, @CodCS, GETDATE())
			
			-- controllo se la cella di dest vada indicata come piena
			SET		@capienza = (
									SELECT tc.Capienza 
										FROM TipoCella TC INNER JOIN Celle c ON TC.IdxTipoCella=c.IdxTipoCella
										WHERE c.IdxCella = @IdxCellaTo	
								)
			SET @numUdc = (SELECT COUNT(*) FROM PosizioneUdcCorrente WHERE IdxCella = @IdxCellaTo)
			-- se capienza raggiunta aggiorno...
			IF(@numUdc >= @capienza)
				BEGIN
					EXEC stp_celle_updPiena @IdxCellaTo, 1
				END
				
		END -- cellaFrom e cellaTo non coincidono...
	
COMMIT TRAN

RETURN
go

commit;
go


set xact_abort on;
go

begin transaction;
go

set ANSI_NULLS on;
go

/*****************************************
* STORED stp_UDC_delete_byRdQ
*
* Elimina gli UDC associati ad un rapporto di qualità dato rapporto qualità
*
* Steamware, S.E.L.
* mod: 2012.02.14
*
****************************************/
alter PROCEDURE stp_UDC_delete_byRdQ
(
	@nRapQual NUMERIC(6,0),
	@ExecBatchInter BIT  = 0 -- 0 Eseguita in Batch , 1 in Interattivo
)
AS

-- Attenzione!!! Cancella tutti i cartellini degli UDC materia prima del rapporto qualità anche se sono scaricati 
-- comunque sono presenti nello StoricoCartellini 


SET NOCOUNT ON;
SET ANSI_NULLS OFF;
SET XACT_ABORT ON;       -- Se c'è un errore fa il rollback di tutta la transazione e non solo quella in errore
SET LOCK_TIMEOUT 600000; -- 10 min - Setto il tempo massimo di attesa del lock della tabella che è valido solo per la durata 
                         -- della connessione e di default è settato a -1 (infinito). ATTENZIONE che se viene dato un errore
                         -- di lock deve essere controllato 

IF @ExecBatchInter = 1     -- Se interattiva diminuisco il tempo di lock massimo a 15 sec
   SET LOCK_TIMEOUT 15000;

-- Se per il rapporto qualità esiste almeno un cartellino UDC ( se nullo non lo conta )
IF ( SELECT COUNT(UDC) FROM RilPro.RapQual WHERE nRapQual = @nRapQual ) > 0
BEGIN
 BEGIN TRY;
  BEGIN TRANSACTION;
      
      -- =========================================================
      -- Cancella tutti gli UDC Materia Prima di un Rapp. Qualità
      -- =========================================================
      SELECT ROW_NUMBER() OVER (ORDER BY UDC) AS Riga,UDC
      INTO #Temp
      FROM RilPro.RapQual
      WHERE nRapQual = @nRapQual AND UDC IS NOT NULL;                -- Rapporto di qualità da cancellare

      DECLARE @Riga AS INT = 1
             ,@Fine AS INT = 0
             ,@UDC nVarchar(50);
      
      SELECT @Fine = MAX(Riga) FROM #Temp;

      WHILE @Riga <= @Fine
       BEGIN 
            -- Leggo UDC da cancellare uno alla volta
            SELECT @UDC = UDC FROM #Temp WHERE Riga = @Riga;

            -- ======================================================
            -- Cancella i dati del singolo UDC 
            -- =======================================================
            -- Attenzione che sulle tabelle ci sono dei trigger
            DELETE dbo.PosizioneUdcCorrente WHERE UDC = @UDC

            -- DELETE dbo.RelazUDC             WHERE UDC_child   = @UDC   -- mod. 2012-03-02 per mantenere la storia UDC AS400-GMW
            -- DELETE dbo.RelazUDC             WHERE UDC_parent  = @UDC
            DELETE dbo.ElencoCartellini     WHERE UDC = @UDC
          
            -- sgancio il cartellino AS400 da quello GMW ( cancellato )
            UPDATE RilPro.RapQual SET UDC = NULL WHERE UDC = @UDC

            --SELECT * FROM  dbo.PosizioneUdcCorrente WHERE UDC = @UDC
            --SELECT * FROM dbo.RelazUDC WHERE UDC_child = @UDC
            --SELECT * FROM dbo.ElencoCartellini WHERE UDC = @UDC
            --SELECT * FROM RilPro.RapQual WHERE UDC = @UDC

        SET @Riga = @Riga + 1   -- Incremento contatore x UDC in tabella Temp

       END

       -- Se esiste la tabella #Temp la cancello
       IF OBJECT_ID(N'tempdb..#Temp') IS NOT NULL
         DROP TABLE #Temp;

   COMMIT TRANSACTION;
  END TRY
 
  BEGIN CATCH;

      --IF (ERROR_NUMBER() = 1222)             -- se vi è un lock per troppo tempo posso controllarlo x rieseguire
      --     BEGIN; PRINT 'Tabella Bloccata';  -- Segnalo l'errore specifico di lock
      --     END;
      --ELSE PRINT 'Errore Generico';          -- se l'errore non è un deadlock esco dal WHILE
  
      IF XACT_STATE() <> 0                -- solo se vi sono transazioni aperte faccio il rollback ( da verificare nel caso sia richiamato 
          ROLLBACK TRANSACTION            -- all'interno di un'altra transazione )

      -- Cancello La Tabella TEMP se esiste ( messo x per sicurezza )
      IF OBJECT_ID(N'tempdb..#Temp') IS NOT NULL
          DROP TABLE #Temp;
      
      -- Uso RAISERROR mandare in errore la procedura e x per tornare le info 
      -- sull'errore originale che ha portato l'esecuzione nel blocco CATCH
      DECLARE @ErrorNumber INT;
      DECLARE @ErrorMessage NVARCHAR(4000);
      DECLARE @ErrorSeverity INT;
      DECLARE @ErrorState INT;
      SELECT @ErrorMessage = ERROR_MESSAGE(),@ErrorSeverity = ERROR_SEVERITY(),@ErrorState = ERROR_STATE(), @ErrorNumber = ERROR_NUMBER();

      IF @ExecBatchInter = 0  -- Sollevo errore solo se richiesto dai parametri ( es. esecuzione da un Job Batch )
        RAISERROR (@ErrorMessage,@ErrorSeverity,@ErrorState);  -- Se non uso RAISERROR la procedura non mi da errore es. se schedulata
 
  END CATCH;

END

/*---------------------------------------
- Query x eliminazione UDC e tab 
- collegate dato un Rapp di Qualità
---------------------------------------*/

/*  NON FUNZIONA A CAUSA DEI TRIGGER
WITH cte AS  -- Tutti i cartellini su AS400 annullati che hanno un cartellino in RilPro
(
    SELECT r.UDC
    FROM RilPro.RapQual AS r
    INNER JOIN dbo.ElencoCartellini AS e
    ON r.UDC = e.UDC
    WHERE r.BenesQual = 'A'
)
	-- Cancello la posizione degli UDC a magazzino
	DELETE dbo.PosizioneUdcCorrente
	FROM dbo.PosizioneUdcCorrente AS P
		INNER JOIN RilPro.RapQual AS r
		ON p.UDC = r.UDC
	WHERE r.nRapQual = @nRapQual
	-- SELECT * FROM dbo.PosizioneUdcCorrente WHERE r.nRapQual = @nRapQual

    -- Se non sono ancora scaricati cancello il record movimento di scarico materia prima
	DELETE dbo.AS400_BatchConsumoMP
	FROM dbo.AS400_BatchConsumoMP AS b
		INNER JOIN RilPro.RapQual AS r
		ON b.UDC = r.UDC
	WHERE r.nRapQual = @nRapQual AND b.DataInvioAs IS NULL
    
    SELECT * FROM dbo.AS400_BatchConsumoMP
    	
    -- Cancellazione Cartellini Materia Prima di un Rapporto qualità
    SELECT * FROM dbo.ElencoCartellini
*/
go

commit;
go




/****** Object:  StoredProcedure [BatchQueue].[stp_processaGiornaleMagazzino]    Script Date: 06/05/2012 19:24:45 ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO





/*****************************************
* STORED stp_processaGiornaleMagazzino
*
* processa il giornale del magazzino, in modo da controlalre tutte le righe non processate (o eventualmente solo quelle nuove)
* e spostare nella coda di trasferimento con AS400 SOLO i movimenti che soddisfano i criteri specificati nella tabella
* "TabSyncMovMag" 
*
* Steamware, S.E.L.
* mod: 2012.05.25
*
****************************************/
ALTER PROCEDURE [BatchQueue].[stp_processaGiornaleMagazzino]
(
	@CodCS NCHAR(2),
	@lastInsDate DATETIME = NULL -- data-ora da cui cercare i record, se non viene passata è l'ultimo movimento registrato
)
AS

BEGIN TRAN

	/**********************************************************************************
	*
	* PROCEDURA in 4 step:
	* - STEP 1: registro rettifiche QUANTITA' in FROM
	* - STEP 2: registro prelievi da mag ext "from" (cambio mag)
	* - STEP 3: registro depositi a mag ext "to" (cambio mag)
	* - STEP 4: registro compensazioni: se from e to corrispondono e mag comp è NON NULLO metto in comp!
	**********************************************************************************/

	-- in primis: se è nulla la data calcolo l'ultim data di processing...
	IF ( @lastInsDate IS NULL )
	BEGIN
		SET	@lastInsDate = ( SELECT ISNULL(MAX(DataOra), '19000101') FROM GiornaleMagazzino WHERE NOT (DataOraProc IS NULL) )
	END
	
	-- ATTENZIONE!!! DEVE ESSERCI UN PARTICOLARE NON NULLO e != "n.d."
	
	-- ora prendo tutte le righe che mi interessano e cerco match sulla tab TabSyncMovMag e le inserisco in batch...
		
	-- STEP 1: rettifico quantità!
	INSERT INTO	AS400_BatchMovimenti(DataIns, numOp, CodEvento, Particolare, UDC, CodMagAS, Quantita)
	SELECT	DataOra, numOp, 'UDC_MOD', gm.Particolare, gm.UDC, tsmm.codMagExtFrom , gm.QtaTo - gm.QtaFrom
	FROM	GiornaleMagazzino gm 
	INNER JOIN TabSyncMovMag tsmm ON 
			tsmm.CodCS = @CodCS AND
			gm.CodStatoFrom		= tsmm.CodStatoFrom AND
			gm.CodStatoTo		= tsmm.CodStatoTo AND
			gm.IdxPosizioneFrom	= tsmm.IdxPosizioneFrom AND
			gm.IdxPosizioneTo	= tsmm.IdxPosizioneTo
	WHERE	(gm.DataOra		>= @lastInsDate)	
	AND		(gm.DataOraProc	IS NULL)
	AND		(tsmm.toExt		= 1)                            -- Se devo fare movimento su Sistema EXT
	AND		gm.Particolare <> ''					        -- particolare deve essere disponibile!!!!
    AND		(tsmm.codMagExtTo IS NOT NULL AND tsmm.codMagExtFrom IS NOT NULL )  -- le righe con magazzini ext NULLI non sono permessi
	AND		(tsmm.codMagExtFrom = tsmm.codMagExtTo)         -- Solo se NON VARIA MAG ESTERNO...
    AND		(tsmm.codMagExtTo > 0 AND codMagExtFrom > 0 ) -- e magazzini non 0 ( usato quando non esiste Mag )

	
	
	-- STEP 2: genero ora casi con 2 mag ext che cambiano: tolgo da FROM
	INSERT INTO	AS400_BatchMovimenti(DataIns, numOp, CodEvento, Particolare, UDC, CodMagAS, Quantita)
	SELECT	DataOra, numOp, 'UDC_MOV', gm.Particolare, gm.UDC, tsmm.codMagExtFrom , - gm.QtaFrom
	FROM	GiornaleMagazzino gm 
	INNER JOIN TabSyncMovMag tsmm ON 
			tsmm.CodCS = @CodCS AND
			gm.CodStatoFrom		= tsmm.CodStatoFrom AND
			gm.CodStatoTo		= tsmm.CodStatoTo AND
			gm.IdxPosizioneFrom	= tsmm.IdxPosizioneFrom AND
			gm.IdxPosizioneTo	= tsmm.IdxPosizioneTo
	WHERE	(gm.DataOra		>= @lastInsDate)	
	AND		(gm.DataOraProc	IS NULL)
	AND		(tsmm.toExt		= 1)
	AND		gm.Particolare <> '' -- particolare deve essere disponibile!!!!
    AND		(tsmm.codMagExtTo IS NOT NULL AND tsmm.codMagExtFrom IS NOT NULL )  -- le righe con magazzini ext NULLI non sono permessi
	AND		(tsmm.codMagExtFrom <> tsmm.codMagExtTo) -- se VARIA MAG ESTERNO...
	AND		(tsmm.codMagExtFrom > 0)                 -- e mag. partenza non 0 ( usato se non esiste Mag di partenza es. NEW UDC ) 
                                                     -- e non Negativo ( consumo ) non carica nessun magazzino
	
	-- STEP 3: genero ora casi con 2 mag ext che cambiano: metto in TO
	INSERT INTO	AS400_BatchMovimenti(DataIns, numOp, CodEvento, Particolare, UDC, CodMagAS, Quantita)
	SELECT	DataOra, numOp, 'UDC_MOV',  gm.Particolare, gm.UDC, tsmm.codMagExtTo  , gm.QtaTo
	FROM	GiornaleMagazzino gm INNER JOIN TabSyncMovMag tsmm ON 
			tsmm.CodCS = @CodCS AND
			gm.CodStatoFrom		= tsmm.CodStatoFrom AND
			gm.CodStatoTo		= tsmm.CodStatoTo AND
			gm.IdxPosizioneFrom	= tsmm.IdxPosizioneFrom AND
			gm.IdxPosizioneTo	= tsmm.IdxPosizioneTo
	WHERE	(gm.DataOra		>= @lastInsDate)	
	AND		(gm.DataOraProc	IS NULL)
	AND		(tsmm.toExt		= 1)
    AND		(tsmm.codMagExtTo IS NOT NULL AND tsmm.codMagExtFrom IS NOT NULL )  -- le righe con magazzini ext NULLI non sono permessi
	AND		gm.Particolare <> ''                     -- particolare deve essere disponibile!!!!
	AND		(tsmm.codMagExtFrom <> tsmm.codMagExtTo) -- se VARIA MAG ESTERNO...
	AND		(tsmm.codMagExtTo > 0)                   -- e mag. destinazione non 0 ( usato se non esiste Mag di arrivo es. DEL UDC )
                                                     -- e non Negativo ( consumo ) non carica nessun magazzino

	-- STEP 4: cerco prima casi con magazzini ext origine = destinazione e compensazioni
	INSERT INTO	AS400_BatchMovimenti(DataIns, numOp, CodEvento, Particolare, UDC, CodMagAS, Quantita)
	SELECT	DataOra, numOp, 'UDC_COMP',  gm.Particolare, gm.UDC, tsmm.codMagExtComp, gm.QtaFrom - gm.QtaTo 
	FROM	GiornaleMagazzino gm 
	INNER JOIN TabSyncMovMag tsmm ON 
			tsmm.CodCS = @CodCS AND
			gm.CodStatoFrom		= tsmm.CodStatoFrom AND
			gm.CodStatoTo		= tsmm.CodStatoTo AND
			gm.IdxPosizioneFrom	= tsmm.IdxPosizioneFrom AND
			gm.IdxPosizioneTo	= tsmm.IdxPosizioneTo
	WHERE	(gm.DataOra		>= @lastInsDate)	
	AND		(gm.DataOraProc	IS NULL)
	AND		(tsmm.toExt		= 1)
	AND		gm.Particolare <> '' -- particolare deve essere disponibile!!!!
    AND		(tsmm.codMagExtTo IS NOT NULL AND tsmm.codMagExtFrom IS NOT NULL )  -- le righe con magazzini ext NULLI non sono permessi
    AND		(tsmm.codMagExtTo > 0 AND codMagExtFrom > 0 )                       -- e magazzini > 0 ( usato quando non esiste Mag )
	AND		(tsmm.codMagExtComp IS NOT NULL AND tsmm.codMagExtComp <> 0 )       -- HO compensazioni!!!
	AND		(tsmm.codMagExtFrom = tsmm.codMagExtTo)                             -- E NON VARIA MAG ESTERNO...

	-- ora aggiorno le stesse righe riportate indicando la data ora di processing...
	UPDATE	gm
	SET		DataOraProc = GETDATE()
	FROM	GiornaleMagazzino gm 
	INNER JOIN AS400_BatchMovimenti abm 
		ON	gm.numOp = abm.numOp
	WHERE	(gm.DataOra	>= @lastInsDate)	
	AND		(gm.DataOraProc	IS NULL)
	
COMMIT TRAN

RETURN




GO


/****** Object:  Trigger [dbo].[trg_updMovAS]    Script Date: 06/05/2012 19:26:32 ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO



-- =============================================
-- Author:		Samuele E. Locatelli
-- Create date: 2009-09-20 mod. 2012-03-14
-- Description:	trigger x inserimento movimenti
--				nella tab GiornaleMagazzino
-- =============================================
ALTER TRIGGER [dbo].[trg_updMovAS]
   ON [dbo].[ElencoCartellini]
   AFTER UPDATE
AS
BEGIN


	/*******************************************************************************
	* Gestione UPDATE ElencoCartellini --> GiornaleMagazzino
	*
	* regola1: si fanno registrazioni solo se varia ALMENO UNO tra
	* - quantità
	* - IdxPosizione
	* - CodStato
	*
	* regola 2:
	* - Particolare deve essere valorizzato ALMENO a '' (blank)
	*
	* regola3: in caso di update SIA di quantità che di posizione/stato
	* - si genera UN PRIMO RECORD di modifica quantità a posizione e stato FISSI sulla vecchia posizione/Stato
	* - si genera UN SECONDO RECORD con variazione posizione/stato
	*
	*******************************************************************************/

	-- setup variabili e verbosità
	SET NOCOUNT ON;
	DECLARE	@dataOra AS DATETIME
	SET		@dataOra = GETDATE()
	
	-- PRIMO STEP: quantità! ( vedi Note )
	IF( UPDATE(Qta) )
	BEGIN
	
		INSERT INTO GiornaleMagazzino(OP, DataOra, CodEvento, ModDate, UDC, Particolare, CodStatoFrom, CodStatoTo, IdxPosizioneFrom, IdxPosizioneTo, QtaFrom, QtaTo)
		(
			SELECT	'U', @dataOra, i.CodEvento, i.ModDate, d.UDC, ISNULL(d.Particolare,''), d.CodStato, d.CodStato, d.IdxPosizione, d.IdxPosizione, d.Qta, i.Qta
			FROM inserted AS i
			INNER JOIN deleted AS d ON i.UDC = d.UDC
			WHERE ( (i.Qta <> d.Qta) )
		)
	
	END
	
	-- ora controllo in caso di modifica di stato o posizione
	IF(UPDATE(CodStato) OR UPDATE(IdxPosizione))
	BEGIN
	
		INSERT INTO GiornaleMagazzino(OP, DataOra, CodEvento, ModDate, UDC, Particolare, CodStatoFrom, CodStatoTo, IdxPosizioneFrom, IdxPosizioneTo, QtaFrom, QtaTo)
		(
			SELECT	'U', @dataOra, i.CodEvento, i.ModDate, i.UDC, ISNULL(d.Particolare,''), d.CodStato, i.CodStato, d.IdxPosizione, i.IdxPosizione, i.Qta, i.Qta
			FROM inserted AS i
			INNER JOIN deleted AS d ON i.UDC = d.UDC
			WHERE ( ( i.IdxPosizione <> d.IdxPosizione) OR (i.CodStato <> d.CodStato) )
		)
	
	END
	
END


GO





