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