set xact_abort on go begin transaction go set ANSI_NULLS on go /***************************************** * STORED stp_DtMtrx_import * * Recupera dati Gitterbox/DataMatrix partendo leggendo dati successivi all'ultimo import e importanto in tab GMW * * Steamware, S.E.L. * mod: 2011.04.29 * ****************************************/ ALTER PROCEDURE dbo.stp_DtMtrx_import ( @CodCS VARCHAR(2), @IdxPosizione INT ) AS ------------------------------------------------------------------------------------------------------ -- leggo data ultimo import (o creo record...) ------------------------------------------------------------------------------------------------------ DECLARE @nomeFlusso AS NVARCHAR(50) DECLARE @lastImport AS DATETIME DECLARE @trovati AS INT -- imposto valori SET @nomeFlusso = 'DataMatrix' SET @lastImport = DATEADD(yy,-10,GETDATE()) -- inizializzo a -10 anni ... -- sistemo tab registrazione import... BEGIN TRAN -- cerco nella tab log ultima data caricamento SET @trovati = ( SELECT COUNT(*) FROM logImportFlussi WHERE NomeFlusso = @nomeFlusso ) -- controllo se record c'è... IF(@trovati > 0) BEGIN SET @lastImport = ( SELECT LastImport FROM LogImportFlussi WHERE NomeFlusso = @nomeFlusso ) END ELSE BEGIN -- lo creo! INSERT INTO LogImportFlussi(NomeFlusso, LastImport) VALUES (@nomeFlusso, @lastImport) END COMMIT TRAN ------------------------------------------------------------------------------------------------------ ------------------------------------------------------------------------------------------------------ -- ora gestisco il vero caricamento... ------------------------------------------------------------------------------------------------------ -- filtro e salvo in tabella... gitterbox validi SOLO se iniziano per "U" DECLARE @newData TABLE ( CodDataMatrix numeric(23, 0) , CodGitterbox char(10) , NumConchiglia int , NumDisegno numeric(7, 0) , EsponenteDisegno tinyint , CodDifettoScarto varchar(5) , InizioPreparazione smalldatetime , FinePreparazione smalldatetime , InizioIniezione smalldatetime , FineIniezione smalldatetime , MagDestinazione varchar(2) , DataImport smalldatetime ) INSERT INTO @newData SELECT CodDataMatrix, LTRIM(RTRIM(CodGitterbox)), NumConchiglia, NumDisegno, EsponenteDisegno, CodDifettoScarto, InizioPreparazione, FinePreparazione, InizioIniezione, FineIniezione, MagDestinazione, DataImport FROM v_trasfDataMatrix WHERE DataImport > @lastImport AND LEFT(CodGitterbox, 1) = 'U' -- creo UDC da gitterbox nuovi INSERT INTO ElencoCartellini(UDC, Particolare, DataFus) SELECT DISTINCT nd.CodGitterbox, null, MIN( InizioIniezione) FROM @newData nd LEFT OUTER JOIN ElencoCartellini ec ON nd.CodGitterbox COLLATE SQL_Latin1_General_CP1_CI_AS = ec.UDC WHERE ec.UDC IS NULL GROUP BY nd.CodGitterbox DECLARE @udc NVARCHAR(50) DECLARE @Particolare NVARCHAR(50) DECLARE @NumDisegno NVARCHAR(50) DECLARE @EsponenteDisegno NVARCHAR(50) DECLARE @Qta INT DECLARE @IdxCellaTo INT DECLARE @adesso DATETIME DECLARE @posTrovate INT SET @adesso = GETDATE() SET @posTrovate = 0 DECLARE cursoreImport CURSOR FOR SELECT nd.CodGitterbox, tp.Particolare, tp.NumDisegno, tp.EsponenteDisegno, dbo.getNumDatamatrix(nd.CodGitterbox) FROM @newData nd INNER JOIN v_transcParticolari tp ON nd.NumDisegno = tp.NumDisegno AND nd.EsponenteDisegno = tp.EsponenteDisegno OPEN cursoreImport FETCH NEXT FROM cursoreImport INTO @udc, @Particolare, @NumDisegno, @EsponenteDisegno, @Qta WHILE @@FETCH_STATUS = 0 BEGIN -- aggiorno gli UDC gitterbox esistenti per quantità tra quelli dei dati da importare... UPDATE ElencoCartellini SET CodCS = @CodCS, IdxPosizione = @IdxPosizione, CreateDate = @adesso, Particolare = @Particolare, DisegnoGrezzo = @NumDisegno, Esponente = @EsponenteDisegno, Qta = @Qta, Figura = '', CodImballo ='', Tara = 0, PesoTot = 0, PesoCad = 0, CodStato = 'Fin', NumCont = 1, TurnoFus = 0, ModDate = @adesso WHERE UDC = @udc -- indico cella UDC corrente... calcolo la prima cella della nuova posizione... SET @IdxCellaTo = ( SELECT TOP 1 IdxCella FROM Celle WHERE IdxBlocco = ( SELECT IdxBlocco FROM Blocchi WHERE CodMag=CAST(@IdxPosizione AS NVARCHAR(50))) ) -- controllo se posizione non ancora creata... SET @posTrovate = ( SELECT COUNT(*) FROM PosizioneUdcCorrente WHERE UDC = @udc ) IF( @posTrovate =0) BEGIN INSERT INTO PosizioneUdcCorrente VALUES (@udc, @IdxCellaTo, @CodCS, @adesso) END FETCH NEXT FROM cursoreImport INTO @udc, @Particolare, @NumDisegno, @EsponenteDisegno, @Qta END CLOSE cursoreImport DEALLOCATE cursoreImport -- inserisco datamatrix da ultimo import INSERT INTO ElencoDataMatrix SELECT * FROM @newData -- aggiorno dati ultimo caricamento SET @lastImport = ( SELECT ISNULL(MAX(DataImport),@lastImport) FROM @newData ) UPDATE LogImportFlussi SET LastImport = @lastImport WHERE NomeFlusso = @nomeFlusso RETURN go commit go -- ============================================= -- Author: Samuele E. Locatelli -- Create date: 2009-09-20 -- Description: trigger x inserimento movimenti -- nella coda di trasferimento batch -- verso AS400 x UPDATE UDC -- ============================================= ALTER TRIGGER trg_updMovAS ON ElencoCartellini AFTER UPDATE AS BEGIN -- setup variabili e verbosità SET NOCOUNT ON; DECLARE @partOk AS BIT DECLARE @currUdc AS NVARCHAR(50) DECLARE @IdxPosFrom AS INT DECLARE @IdxPosTo AS INT DECLARE @magFrom AS NVARCHAR(50) DECLARE @magTo AS NVARCHAR(50) DECLARE @qta AS DECIMAL(10,2) DECLARE @qtaOld AS DECIMAL(10,2) DECLARE @IdxPosizioneComp INT DECLARE @toAs400 BIT DECLARE cursore CURSOR FOR SELECT CASE WHEN ISNULL(Particolare,'n.d.') = 'n.d.' THEN 0 ELSE 1 END, UDC FROM inserted OPEN cursore FETCH NEXT FROM cursore INTO @partOk, @currUdc WHILE @@FETCH_STATUS = 0 BEGIN -- controllo che CI SIA il particolare (altrimenti non eseguo) IF(@partOk = 1) SET @qta = (SELECT Qta FROM inserted WHERE UDC = @currUdc) SET @qtaOld = (SELECT Qta FROM deleted WHERE UDC = @currUdc) -- se c'è stata modifica di quantità inizio a rettificare quella IF ((UPDATE(Qta)) AND(@qta <> @qtaOld)) BEGIN -- registro il VERO movimento INSERT INTO AS400_BatchMovimenti(DataIns, CodEvento, Particolare, UDC, CodMagAS, Quantita) ( SELECT GETDATE(), 'UDC_MOD', Particolare, UDC, CAST(IdxPosizione AS NVARCHAR(50)), @qta - Qta FROM deleted WHERE UDC = @currUdc AND CAST(IdxPosizione AS NVARCHAR(50)) IN (SELECT CodMagAS FROM AS400_MagCont WHERE Attivo = 1) ) -- controllo: se il magazzino di destinazione richiede una compensazione registro il 2° movimento di compensazione SET @IdxPosFrom = (SELECT IdxPosizione FROM deleted) SET @IdxPosTo = (SELECT IdxPosizione FROM inserted) -- calcolo il mag di compensazione SET @IdxPosizioneComp = (SELECT CAST(ISNULL(CodMagAS_compensaz,0) AS INT) FROM AS400_MagCont WHERE (Attivo = 1) AND (CodMagAS = CAST(@IdxPosFrom AS NVARCHAR(50)))) IF (@IdxPosizioneComp > 0) BEGIN INSERT INTO AS400_BatchMovimenti(DataIns, CodEvento, Particolare, UDC, CodMagAS, Quantita) ( SELECT GETDATE(), 'UDC_COMP', Particolare, UDC, CAST(@IdxPosizioneComp AS NVARCHAR(50)), Qta - @qta FROM deleted WHERE UDC = @currUdc AND CAST(IdxPosizione AS NVARCHAR(50)) IN (SELECT CodMagAS FROM AS400_MagCont WHERE Attivo = 1) ) END END -- Prendo le posizioni di magazzino precedente e nuova SET @IdxPosFrom = (SELECT IdxPosizione FROM deleted WHERE UDC = @currUdc) SET @IdxPosTo = (SELECT IdxPosizione FROM inserted WHERE UDC = @currUdc) -- controllo se devo fare rettifiche quantità... SET @toAs400 = ( SELECT TOP 1 ISNULL(toAs400, 0) as valore FROM TabTranPosizEventi WHERE IdxPosizione = @IdxPosFrom AND IdxPosizioneTo = @IdxPosTo ) -- controllo poi se sia cambiato il magazzino logico (IdxPosizione) e si richieda update verso AS400, altrimenti non lo inserisco IF ((UPDATE(IdxPosizione)) AND @toAs400 = 1) BEGIN -- Le trasformo nelle equivalenti stringhe del codMag SE attive SET @magFrom = (SELECT ISNULL(CodMagAS,'---') FROM AS400_MagCont WHERE Attivo = 1 AND CodMagAs = CAST(@IdxPosFrom AS NVARCHAR(50))) SET @magTo = (SELECT ISNULL(CodMagAS,'---') FROM AS400_MagCont WHERE Attivo = 1 AND CodMagAs = CAST(@IdxPosTo AS NVARCHAR(50))) -- inserisco un movimento di deposito verso mag nuovo (SE attivo) IF (@magFrom <> '---') BEGIN INSERT INTO AS400_BatchMovimenti(DataIns, CodEvento, Particolare, UDC, CodMagAS, Quantita) ( SELECT GETDATE(), 'UDC_MOV', Particolare, UDC, CAST(IdxPosizione AS NVARCHAR(50)), -@qta FROM deleted WHERE UDC = @currUdc AND CAST(IdxPosizione AS NVARCHAR(50)) IN (SELECT CodMagAS FROM AS400_MagCont WHERE Attivo = 1) ) END -- inserisco un movimento di prelievo verso mag vecchio (SE attivo) IF (@magTo <> '---') BEGIN INSERT INTO AS400_BatchMovimenti(DataIns, CodEvento, Particolare, UDC, CodMagAS, Quantita) ( SELECT GETDATE(), 'UDC_MOV', Particolare, UDC, CAST(IdxPosizione AS NVARCHAR(50)), @qta FROM inserted WHERE UDC = @currUdc AND CAST(IdxPosizione AS NVARCHAR(50)) IN (SELECT CodMagAS FROM AS400_MagCont WHERE Attivo = 1) ) END END FETCH NEXT FROM cursore INTO @partOk, @currUdc END CLOSE cursore DEALLOCATE cursore END -- registro versione... INSERT INTO [dbo].[LogUpdateDb] ([Versione],[Data]) VALUES(385, GETDATE()) GO