0 -- Se il n. rapporto di qualità è zero non sono cartellini materia prima L'UPDATE FUNZIONA VERSO AS400 */ DECLARE @SQL AS NVARCHAR(4000); DECLARE @SqlOK AS INT; DECLARE @As400File AS NVARCHAR(50) = ''; DECLARE @As400Linked AS NVARCHAR(50) = ''; -- Linked Server AS400 DECLARE @dataAs400 AS VARCHAR(8); SET @dataAs400 = (SELECT dbo.dateToAsFormat(@minData)); SET @SqlOK = 0; -- In base al nome del DB e della stored recupero il Linked Server e file di AS400 27/06/2013 SET @As400Linked = ( SELECT dbo.f_getLikedAS400(DB_NAME()) ); SET @As400File = ( SELECT dbo.f_getLibreriaAS400 ( DB_NAME() , OBJECT_SCHEMA_NAME(@@PROCID) + '.' + OBJECT_NAME(@@PROCID) ) ) BEGIN TRY -- svuoto tab raw attuale TRUNCATE TABLE RawData.XOGIX00F; -- Leggo tutti gli UDC dei rapporti di qualità a partire dalla data richiesta -- escludendo quelli con Numero Rapporto di qualità a zero ( non sono rapporti di qualità ) -- CREO L'ISTRUZIONE SQL DI INSERT PARAMETRICA SET @SQL = N'INSERT INTO RawData.XOGIX00F SELECT XRPQLN ,XRPQLD ,XNRETI ,XCDFOR ,XCDTER ,XCDPAR ,XDTPRO ,XTRPRO ,XQTPRO ,XDESMT ,XMATSC ,XBENQL FROM OPENQUERY(' + @As400Linked SET @SQL = @SQL + N', ''SELECT * FROM ' + @As400File SET @SQL = @SQL + ' WHERE XRPQLN <> 0 AND XRPQLD >= ' + @dataAs400 + ' '' ) ' -- Eseguo il comando T-SQL verso AS400 e testo se OK -- EXEC @SqlOK = sp_executesql @SQL se faccio così non mi valorizza la variabile se da errore EXEC sp_executesql @SQL; END TRY BEGIN CATCH -- nel caso di errore ne salvo il numero SET @SqlOK = ERROR_NUMBER(); -- PRINT ERROR_NUMBER() END CATCH -- Memorizzo il comando per verifica T-SQL e l'esito del comando se 0 è OK INSERT INTO RawData.AS400_Comandi SELECT GETDATE(), 'stp_batch_RapQual_S01', @SQL, @SqlOK; -- è possibile sollevare un RAISERROR ??? come si comporta poi il programma? -- NON SI FANNO RAISE ERROR E NON SI RESTITUISCE CODICE!!!!! RETURN]]> @CodMagMpNONacc -- Che non è in Magazzino NON Accettati UPDATE dbo.ElencoCartellini SET CodStato = @CodStatoMpNONacc, CodEvento= @CodEven, ModDate = GETDATE() FROM dbo.ElencoCartellini AS el INNER JOIN RilPro.RapQual rq ON rq.UDC = el.UDC INNER JOIN RawData.XOGIX00F u ON u.XNRETI = rq.ProgUDC WHERE ( rq.BenesQual = 'S' AND u.XBENQL = 'N' ) -- da Accettata a NON accettata AND XMATSC = 'N' -- solo Lega non ancora Scaricata AND el.CodStato = @CodStatoMpAcc -- Modifico solo UDC in stato 'MP' (accettata) AND el.IdxPosizione = 6 -- Modifico solo se cartellini non scaricati Mod. 2012-05 END -- =============================================================================================== -- SPOSTAMENTO DI MAGAZZINO DELLA MP che da NON ACCETTATA diventa ACCETTATA -- =============================================================================================== -- Controllo che il magazzino dest. ACCETTATA sia a cella singola( a terra ), attivo SELECT @MagNNAccOK = COUNT(*) FROM dbo.Celle AS c INNER JOIN Blocchi b ON c.IdxBlocco=b.IdxBlocco WHERE b.CodMag = @CodMagMpAcc AND c.Attiva = 1 IF @MagNNAccOK = 1 -- Se mag. ACCETTATA è OK BEGIN -- Vado a leggere la cella corretta SELECT @CellaOK = c.IdxCella FROM Celle AS c INNER JOIN Blocchi b ON c.IdxBlocco=b.IdxBlocco WHERE b.CodMag = @CodMagMpAcc AND c.Attiva = 1 -- Se ci sono cartellini di materia prima che sono passati da accettati a non accettati li sposto UPDATE dbo.PosizioneUdcCorrente SET IdxCella = @CellaOK, DataRif = GETDATE() FROM dbo.PosizioneUdcCorrente AS po INNER JOIN RilPro.RapQual rq ON rq.UDC = po.UDC INNER JOIN RawData.XOGIX00F u ON u.XNRETI = rq.ProgUDC INNER JOIN dbo.ElencoCartellini AS el ON rq.UDC = el.UDC INNER JOIN Celle c ON po.IdxCella=c.IdxCella INNER JOIN Blocchi b ON c.IdxBlocco=b.IdxBlocco WHERE ( rq.BenesQual = 'N' AND u.XBENQL = 'S' ) -- da NON Accettata ad Accettata AND XMATSC = 'N' -- solo Lega non ancora Scaricata AND b.CodMag <> @CodMagMpAcc -- Modifico solo UDC in stato MP non Accettata UPDATE dbo.ElencoCartellini SET CodStato = @CodStatoMpAcc, CodEvento= @CodEven, ModDate = GETDATE() FROM dbo.ElencoCartellini AS el INNER JOIN RilPro.RapQual rq ON rq.UDC = el.UDC INNER JOIN RawData.XOGIX00F u ON u.XNRETI = rq.ProgUDC WHERE ( rq.BenesQual = 'N' AND u.XBENQL = 'S' ) -- da NON Accettata ad Accettata AND XMATSC = 'N' -- solo Lega non ancora Scaricata AND el.CodStato = @CodStatoMpNONacc -- Che ha è in stato MP NON accettata AND el.IdxPosizione = 6 -- Modifico solo se cartellini non scaricati Mod. 2012-05 END -- =============================================================================================== -- ADESSO POSSO FARE UPDATE DI RilPro.RapQual -- =============================================================================================== -- se il dato esiste faccio UPDATE!!! UPDATE RilPro.RapQual SET CodFor = RTRIM(u.XCDFOR), DestTerz = RTRIM(u.XCDTER), CodLega = RTRIM(u.XCDPAR), -- DataPrelFus = u.XDTPRO, -- TurnoPrelFus = u.XTRPRO, -- non lo aggiorno perchè in AS400 è blank nel caso di consumo verso terzista e quindi lo perderei Qta = u.XQTPRO, -- non lo aggiorno x non perdere il mio dato di scaricamento DestLega = RTRIM(u.XDESMT), LegaScaric = u.XMATSC, BenesQual = u.XBENQL FROM RilPro.RapQual rq INNER JOIN RawData.XOGIX00F u ON u.XNRETI = rq.ProgUDC; -- AND u.XRPQLN = rq.nRapQual AND u.XRPQLD = rq.DataRapQual; -- se XNRETI è univoco ... -- verifico che non ci siano cartellini scaricati in AS400 e non sul mio sistema... UPDATE RilPro.RapQual SET CodFor = RTRIM(u.XCDFOR), DestTerz = RTRIM(u.XCDTER), CodLega = RTRIM(u.XCDPAR), DataPrelFus = u.XDTPRO, TurnoPrelFus = RTRIM(u.XTRPRO), Qta = u.XQTPRO, DestLega = RTRIM(u.XDESMT), LegaScaric = u.XMATSC, BenesQual = u.XBENQL FROM RilPro.RapQual rq INNER JOIN RawData.XOGIX00F u ON u.XNRETI = rq.ProgUDC WHERE rq.DataPrelFus = 0 AND u.XDTPRO > 0; -- creo tab temporanea x i dati inesistenti... WITH cteInsert AS (SELECT x.* FROM RawData.XOGIX00F x LEFT OUTER JOIN RilPro.RapQual rq ON x.XNRETI = rq.ProgUDC -- AND u.XRPQLN = rq.nRapQual AND u.XRPQLD = rq.DataRapQual; -- se XNRETI è univoco ... WHERE rq.ProgUDC IS NULL ) -- se il dato non c'è faccio INSERT!!! INSERT INTO RilPro.RapQual(nRapQual, DataRapQual, ProgUDC, CodFor, DestTerz, CodLega, DataPrelFus, TurnoPrelFus, Qta, DestLega, LegaScaric, BenesQual) SELECT XRPQLN AS nRapQual, XRPQLD AS DataRapQual, RTRIM(XNRETI) AS ProgUDC, RTRIM(XCDFOR) AS CodFor, RTRIM(XCDTER) AS DestTerz, RTRIM(XCDPAR) AS CodLega, XDTPRO AS DataPrelFus, RTRIM(XTRPRO) AS TurnoPrelFus, XQTPRO AS Qta, RTRIM(XDESMT) AS DestLega, XMATSC AS LegaScaric, XBENQL AS BenesQual FROM cteInsert -- =============================================================================================== -- DOPO UPDATE aggiorno la QTA nei Cartellini GMW se diversi da quelli in RilPro.RapQual ( AS400 ) -- =============================================================================================== UPDATE e SET e.Qta = r.Qta ,e.PesoTot = r.Qta ,CodEvento= @CodEven ,ModDate = GETDATE() -- memorizzo la modifica -- OUTPUT deleted.* INTO dbo.ElencoCartellini_Copy -- deve essere già presente FROM RilPro.RapQual AS r INNER JOIN dbo.ElencoCartellini AS e ON e.UDC = r.UDC WHERE ( r.Qta <> e.Qta ) -- Solo se la quantità è diversa COMMIT TRAN; RETURN]]> 0 BEGIN -- carico valori che mi servono SELECT @XRPQLN=rq.nRapQual, @XNRETI=rq.ProgUDC, @XDTPRO=bcu.DataPrelFus, @XTRPRO=bcu.TurnoPrelFus, @XDESMT=bcu.DestLega, @XCDTER=bcu.DestTerz FROM dbo.AS400_BatchConsumoMP as bcu INNER JOIN RilPro.RapQual as rq ON bcu.UDC = rq.UDC WHERE bcu.UDC=@UDC -- BEGIN TRAN qui non va messa perchè se verso AS400 le transazioni non sono gestite -- MANCA IL CONTROLLO SE L'AGGIORNAMENTO E' STATO OK EXECUTE @ScritturaASOK = BatchQueue.stp_consumaMP @XRPQLN ,@XNRETI ,@XDTPRO ,@XTRPRO ,@XDESMT ,@XCDTER -- registro la data del movimento BATCH solo se stp_consumaMP ritorna OK -- Così non aggiorna la tabella MA L'UTENTE NON SI ACCORGE DI NULLA!!! IF @ScritturaASOK = 0 UPDATE dbo.AS400_BatchConsumoMP SET DataInvioAs = GETDATE() WHERE UDC = @UDC ELSE SET @InteroCicloASOK = @ScritturaASOK FETCH NEXT FROM UdcMpList INTO @UDC END END CLOSE UdcMpList DEALLOCATE UdcMpList -- aggiunta per dare errore se schedulata!!! GCARLO -- Se la scrittura su AS400 ha dato errore ed è stata eseguita in batch sollevo l'errore -- così anche il batch da errore IF @InteroCicloASOK <> 0 AND @ExecBatchInter = 0 BEGIN DECLARE @ErrorMessage NVARCHAR(4000); DECLARE @ErrorSeverity INT = 16; DECLARE @ErrorState INT = 1; IF @InteroCicloASOK < 0 -- errore nella verifica della scrittura su AS400 SELECT @ErrorMessage = 'Errore nella VERIFICA di scrittura su AS400 in stp_consumaMP' ELSE SELECT -- nn so se riesce a leggere i dati dell'errore cmq lo solleva @ErrorMessage = ERROR_MESSAGE()+ ' '+ CONVERT( VARCHAR(10),ERROR_NUMBER()), @ErrorSeverity = ISNULL(ERROR_SEVERITY(),16), @ErrorState = ERROR_STATE(); -- sollevo errore per mandare in errore la procedura schedulata RAISERROR (@ErrorMessage, -- Message text. @ErrorSeverity, -- Severity. @ErrorState -- State. ); END RETURN]]> = '20140101' -- 22/11/2013 Hard Coded x Modifica Anagrafica Articoli DECLARE RigaMovMag CURSOR LOCAL FOR SELECT TOP 2000 IdxBatch FROM dbo.AS400_BatchMovimenti WHERE DataBatch IS NULL -- limito a 2000 i movimenti da passare AND LEFT(Particolare ,1) <> 'P' -- Hard Coded 22/11/2013 non passo movimenti con codice vecchio AND LEFT(Particolare ,1) <> 'A' -- Hard Coded 31/01/2014 non passo movimenti con codice anime vecchio ORDER BY DataIns ELSE DECLARE RigaMovMag CURSOR LOCAL FOR SELECT TOP 2000 IdxBatch FROM dbo.AS400_BatchMovimenti WHERE DataBatch IS NULL -- limito a 2000 i movimenti da passare ORDER BY DataIns -- utente da inviare ad AS... VERIFICARE!!! su AS400 è un Char(10) SET @CodSoggetto = 'UTENTEGMW2' -- carico i 2 valori di default di carico e scarico da AS400 SET @CodMovCarico = (SELECT CauCarico FROM RilPro.AnagCausaliMag WHERE CodElemento = '0001') SET @CodMovScarico = (SELECT CauScarico FROM RilPro.AnagCausaliMag WHERE CodElemento = '0001') -- inizio cursore! OPEN RigaMovMag FETCH NEXT FROM RigaMovMag INTO @IdxBatch WHILE @@FETCH_STATUS = 0 BEGIN -- controllo ci sia la riga IF (SELECT COUNT(IdxBatch) FROM dbo.AS400_BatchMovimenti WHERE IdxBatch = @IdxBatch) > 0 BEGIN /* OLD VERSION SELECT @Particolare=bm.Particolare, @Causale=CASE WHEN bm.Quantita>0 THEN @CodMovCarico ELSE @CodMovScarico END, @CodMag=bm.CodMagAS, @Qta = ABS(bm.Quantita), @Data=dbo.dateToAsFormat(bm.DataIns), -- mod. 09/06/2012 @RIFFO=RIGHT( (CONVERT(NVARCHAR(20),bm.IdxBatch)) , 8 ) -- mod. 09/06/2012 */ -- carico valori che mi servono -- Lo scarico Anime esterne usa la causale P3 per poterle distinguerle in AS400 ( richiesta da TEKAL ) x il carico -- non serve visto che non viene mai fatto vs AS400 x le anime esterne SELECT @Particolare = bm.Particolare, @Causale = CASE WHEN bm.Quantita < 0 AND (gm.CodStatoTo='AnimExt' OR gm.CodStatoFrom='AnimExt') THEN 'P3' -- Hard Coded 11/06/2013 WHEN bm.Quantita > 0 THEN @CodMovCarico ELSE @CodMovScarico END, @CodMag = bm.CodMagAS, @Qta = ABS(bm.Quantita), @Data = dbo.dateToAsFormat(bm.DataIns), -- mod. 09/06/2012 @RIFFO = RIGHT( (CONVERT(NVARCHAR(20),bm.IdxBatch)) , 8 ) -- mod. 09/06/2012 -- @Data=dbo.dateToAsFormat(GETDATE()), -- @RIFFO=dbo.getUdcComp(bm.UDC,8) FROM dbo.AS400_BatchMovimenti AS bm INNER JOIN dbo.GiornaleMagazzino AS gm ON bm.numOp = gm.numOp WHERE IdxBatch = @IdxBatch -- Eseguo la stored che registra i movimenti magazzino DECLARE @ScritturaASOK AS INT EXECUTE @ScritturaASOK = BatchQueue.stp_registraMovMag @CodSoggetto, @Causale, @Particolare, @CodMag, @Qta, @Data, @RIFFO -- registro la data del movimento BATCH solo se la stp verso AS400 è Ok IF @ScritturaASOK = 0 UPDATE dbo.AS400_BatchMovimenti SET DataBatch = GETDATE() WHERE IdxBatch = @IdxBatch FETCH NEXT FROM RigaMovMag INTO @IdxBatch END END CLOSE RigaMovMag DEALLOCATE RigaMovMag RETURN]]> 0 BEGIN -- carico valori che mi servono SELECT @Particolare=pl.Particolare, @UDC=UDC, @CodImb=pl.CodImballo, @Matr = pl.matrUdc, @Tipo=pl.tipo, @Dest=pl.Destinatario, @Qta=ABS(pl.Qta), @PesoNet=pl.PesoNetto, @PesoLor=pl.PesoTot, @Stato=pl.Stato, @Data=dbo.dateToAsFormat(pl.data), @CodLista=pl.CodLista FROM v_datiPackingList pl WHERE IdxRiga = @IdxRiga -- Eseguo la stored che registra la Packing List con le righe sue righe EXECUTE @ScritturaRigaOK = BatchQueue.stp_registraPackList @CodStab, @UDC, @Particolare , @CodImb , @Matr , @Tipo , @Dest , @Qta , @PesoNet , @PesoLor , @Stato , @Data -- se scrittura riga è ok allora salvo sulla riga la data di invio... così poi non la rivedo tra quelle da processare... IF @ScritturaRigaOK = 0 UPDATE RigheListePrelievo_AS SET DataBatch = GETDATE() WHERE IdxRiga = @IdxRiga; -- Se scrittura Riga Packing non ok metto Flag Packing list non Ok IF @ScritturaRigaOK <> 0 SET @ScritturaASOK = @ScritturaRigaOK FETCH NEXT FROM RigaPackList INTO @IdxRiga , @CodLista -- controllo: se la lista precedente è diversa dall'attuale la indico come scaricata (precedente) IF(@CodListaPre <> @CodLista) BEGIN -- Se tutte le righe della lista sono Ok la indico come scaricata -- se UDC già presente in As400 errore 7343 IF @ScritturaASOK = 0 UPDATE ElencoListePrelievo_AS SET DataBatch = GETDATE() WHERE CodLista = @CodListaPre; ELSE SET @ScritturaASOK = 0; -- resetto il flag di controllo -- cambio il cod pre da confrontare SET @CodListaPre = @CodLista END END END -- Aggiorno anche l'ultima lista prelievo -- x gli UDC già in AS400 da errore 7343 IF @ScritturaASOK = 0 -- OR @ScritturaASOK = 7343 ??? -- registro la data del movimento BATCH anche dell'ultima lista processata UPDATE ElencoListePrelievo_AS SET DataBatch = GETDATE() WHERE CodLista = @CodLista -- se c'è un errore mi rimane aperto il cursore? nn dovrebbe perchè LOCAL CLOSE RigaPackList DEALLOCATE RigaPackList RETURN]]> = @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... -- ===================================================================================== -- STEP 5: verifico e creo movimenti di scarico grezzi tramite distinta -- ===================================================================================== -- estraggo i mov. già creati che in base alla TabSyncMovMag devono fare mov. di scarico grezzi -- tramite distinta base e particolare leggo i relativi grezzi e qta da scaricare -- oppure, se il particolare è già un grezzo scarico se stesso WITH ctePartMov AS -- movimenti creati che hanno un ulteriore carico-scarico tramite distinta ( SELECT mov.DataIns , mov.numOp, mov.CodEvento, mov.Particolare, mov.UDC, mov.CodMagAS, mov.Quantita ,tsmm.codMagExtDist AS CodMagAS_Update --,* FROM dbo.AS400_BatchMovimenti AS mov INNER JOIN dbo.GiornaleMagazzino AS gm ON mov.numOp = gm.numOp INNER JOIN dbo.TabSyncMovMag AS 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.DataOraProc IS NULL AND tsmm.toDistinta = 1 -- movimenti elaborati con compensazione distinta grezzo richiesta toDistinta = 1 AND codMagExtDist > 0 -- e magazzino di compensazione grezzo impostato ), -- Cte ricorsiva che a fronte dei particolari passati mi ritorna tutto l'albero della distinta -- per tutti i figli del particolare con il relativo calcolo delle quantità DistintaCTE ( Particolare , Padre, Figlio, Coeff, QtaDaScar ,Level ) AS ( SELECT p.Particolare, d.Padre, d.Figlio, d.Coeff , CONVERT( numeric(20,4), d.Coeff ) AS QtaDaScar, 0 AS Level FROM RilPro.DistintaAS400 AS d INNER JOIN ctePartMov AS p ON p.Particolare = d.Padre -- prendo i particolari e leggo l'albero partendo da questi UNION ALL SELECT Particolare, p.Padre, p.Figlio, p.Coeff, -- select ricorsiva CONVERT( numeric(20,4),( p.Coeff * QtaDaScar ) ) AS QtaDaScar, Level + 1 FROM RilPro.DistintaAS400 AS p INNER JOIN DistintaCTE AS f ON p.Padre = f.Figlio ) -- estraggo solo le righe distinta con grezzi come figli ,CteGrezzi AS ( SELECT Particolare, Padre, Figlio, Coeff, QtaDaScar, Level FROM DistintaCTE WHERE SUBSTRING( Figlio, 2,3) = 'GRZ' -- solo le righe di scarico grezzi ) INSERT INTO dbo.AS400_BatchMovimenti(DataIns, numOp, CodEvento, Particolare, UDC, CodMagAS, Quantita) SELECT DataIns , numOp , 'UDC_GRZ' AS CodEvento , g.Figlio AS PartGrezzo , UDC , CodMagAS_Update , -( ISNULL( g.QtaDaScar, 1) * p.Quantita ) AS QtaGrezzo -- quantità grezzi da scaricare secondo la dist. base FROM ctePartMov AS p INNER JOIN CteGrezzi AS g ON p.Particolare = g.Particolare UNION -- i movimenti di scarico dei grezzi stessi li inserisco direttamente con qta 1=1 SELECT DataIns, numOp, 'UDC_GRZ' AS CodEvento, Particolare AS PartGrezzo, UDC, CodMagAS_Update, -(Quantita) AS QtaGrezzo FROM ctePartMov WHERE SUBSTRING( Particolare, 2,3) = 'GRZ' OPTION (MAXRECURSION 50); -- max n. sottolivelli -- ===================================================================================== -- ora aggiorno le stesse righe di giornale 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]]> = 20100601 ' ) */ /* -- preparo chiamata su AS400 SET @SQL = N' OPENQUERY( AS400XXXX, ''INSERT INTO MAZZT_DTV3.PACKL00F VALUES ' SET @SQL = @SQL + @PLREPA + ', ' + @PLCART + ', ' + @PLARTI + ', ' + @PLCONT + ', ' SET @SQL = @SQL + CAST(@PLMATR AS NVARCHAR(5)) + ', ' + @PLTPAN + ', ' + @PLCDAN + ', ' + CAST(@PLQTA AS NVARCHAR(10)) + ', ' SET @SQL = @SQL + CAST(@PLPNET AS NVARCHAR(10)) + ', ' + CAST(@PLPLOR AS NVARCHAR(10)) + ', ' + @PLSTAT + ', ' SET @SQL = @SQL + CAST(@PLDTEN AS NVARCHAR(8)) + ''' )' EXEC sp_executesql @SQL */ RETURN @SqlOK;]]> '' THEN @destP1A ELSE (@CCDMOL) END SET @destP2 = CASE WHEN (@CDINB) <> '' THEN @destP2A ELSE (@CCDPTR) END -- solo se BMW metto /S SET @destP3 = CASE WHEN @CRAGCL = '13' OR ( @CDINB <> '' AND SUBSTRING(@TELND,19,2) = '13') THEN '/S' ELSE '' END IF @destP1 + @destP2 <> '' SET @answ = @destP1 + '/' + @destP2 + @destP3 ELSE SET @answ = '' RETURN @answ END]]> 0) BEGIN -- se c'è incremento di 1 in tab UPDATE ContatoriUdc SET LastIdx = LastIdx + 1 WHERE CodCompany = @CodCompany AND Flusso = @Flusso AND Anno = @Anno END ELSE BEGIN -- lo creo! INSERT INTO ContatoriUdc(CodCompany, Flusso, Anno, LastIdx) VALUES (@CodCompany, @Flusso, @Anno, 1) END @answ = @answ + 1 */ -- uso il dato passando valore + 1 (ho incrementato nel frattempo...) RETURN @answ END]]> = InizioValidita AND @DataRif <= ISNULL(FineValidita, DATEADD(year, 2, GETDATE())) ) ), cteEspAttivi AS ( SELECT s.CodStampo ,s.Esponente ,s.EspAttivo ,s.DataInserim ,s.DataValidita FROM RilPro.StampoEsponente AS s INNER JOIN ( SELECT CodStampo ,MAX(DataValidita) AS DataValidita FROM RilPro.StampoEsponente WHERE ( DataValidita <= @DataRif ) AND ( EspAttivo = 'S' ) GROUP BY CodStampo ) AS s2 ON s.CodStampo = s2.CodStampo AND s.DataValidita = s2.DataValidita ), cteLineeAttive AS ( SELECT CodImpianto ,CodStampo ,NumStampate ,CONVERT(DATETIME, DataInizio) AS DataInizio ,DataFine ,TurnoInizio ,TurnoFine FROM RilPro.LineaStampi WHERE ( @DataRif BETWEEN DataInizio AND ISNULL(DataFine, DATEADD(year, 2, GETDATE())) ) AND CodImpianto = @CodImpianto ) -- faccio la select principale SELECT l.CodImpianto ,l.CodStampo ,l.NumStampate ,l.DataInizio ,l.TurnoInizio ,g.InizioValidita ,g.FineValidita ,g.NumFigure ,dbo.f_padLeft(CAST(g.CodCliente AS varchar(50)), 5, '0') AS CodCliente ,ISNULL(cl.RagSociale, '-') AS RagSociale ,CAST(g.CodArticolo AS varchar(50)) AS CodArticolo ,g.Particolare ,pa.DescParticolare ,pa.DisegnoGrezzo ,pa.CodFamiglia ,fa.DescFamiglia ,fi.Figura ,es.Esponente FROM cteLineeAttive AS l INNER JOIN cteUltStampo AS g ON l.CodStampo = g.CodStampo LEFT OUTER JOIN RilPro.StampoFigure AS fi ON l.CodStampo = fi.CodStampo LEFT OUTER JOIN cteEspAttivi AS es ON g.CodStampo = es.CodStampo LEFT OUTER JOIN RilPro.AnagParticolari AS pa ON g.Particolare = pa.Particolare LEFT OUTER JOIN RilPro.AnagFamiglie AS fa ON pa.CodFamiglia = fa.CodFamiglia LEFT OUTER JOIN RilPro.AnagClienti AS cl ON g.CodCliente = cl.CodCliente ORDER BY l.CodImpianto RETURN]]> ''''A''''' -- escludo bolle annullate -- commemntare le righe successive per estrarre tutto -- Parametri di selezione della bolla SET @SQL = @SQL + ' AND CDMFS = ''''' + @RaggrMagazz + ''''' ' SET @SQL = @SQL + ' AND GRBOS = ''''' + @GruppoBolle + ''''' ' SET @SQL = @SQL + ' AND NRBOS = ' + @NumeroBolla + ' ' SET @SQL = @SQL + ' AND DTBOS = ' + @DataBolla + ' ' SET @SQL = @SQL + ' AND CDARS = ''''' + @Particolare + ''''' ' SET @SQL = @SQL + ''' ) OPTION (RECOMPILE)'; EXEC sp_executesql @SQL -- commentare per test END TRY BEGIN CATCH -- PRINT ERROR_NUMBER() SET @SqlOK = ERROR_NUMBER(); -- 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 @ErrorMessage NVARCHAR(4000); --DECLARE @ErrorSeverity INT; --DECLARE @ErrorState INT; --SELECT @ErrorMessage = ERROR_MESSAGE(),@ErrorSeverity = ERROR_SEVERITY(),@ErrorState = ERROR_STATE(); --RAISERROR (@ErrorMessage,@ErrorSeverity,@ErrorState); -- Se non uso RAISERROR la procedura non mi da errore es. se schedulata END CATCH -- Memorizzo il comando per verifica T-SQL e l'esito del comando se 0 è OK INSERT INTO RawData.AS400_Comandi SELECT GETDATE(), 'stp_BORI_caricaDatiBolla', REPLACE(@SQL,' ',' '), @SqlOK; /* NEW 2013/05/01 Aggiorno il change index in base alla data validità e data bolla leggo dalla tabella RawData.ANODM00F aggiornata da import AS400 ( potrei aggiornarla anche qui ) */ IF @SqlOK = 0 -- se import Bolle è OK BEGIN ;WITH cte AS -- cte con inizio e fine validità ( SELECT OCDPAR, OCDODM, ODTVAL, ISNULL(( SELECT MIN(ODTVAL) FROM RawData.ANODM00F AS T2 WHERE T2.OCDPAR = v.OCDPAR AND T2.ODTVAL > v.ODTVAL ) ,'20993112') AS ODTVALEND FROM RawData.ANODM00F AS v ) UPDATE b SET OCDODM = c.OCDODM FROM RawData.BORI202J AS b INNER JOIN cte AS c ON b.CDARS = c.OCDPAR AND b.DTBOS >= c.ODTVAL AND b.DTBOS < c.ODTVALEND WHERE CDMFS = @RaggrMagazz -- aggiorno solo la bolla corretta AND GRBOS = @GruppoBolle AND NRBOS = @NumeroBolla AND DTBOS = @DataBolla AND CDARS = @Particolare /* query di test ;WITH cte AS ( SELECT OCDPAR, OCDODM, ODTVAL, ISNULL(( SELECT MIN(ODTVAL) FROM RawData.ANODM00F AS T2 WHERE T2.OCDPAR = v.OCDPAR AND T2.ODTVAL > v.ODTVAL ) ,'20993112') AS ODTVALEND FROM RawData.ANODM00F AS v ) SELECT b.*, c.OCDODM FROM RawData.BORI202J AS b LEFT JOIN cte AS c ON b.CDARS = c.OCDPAR AND b.DTBOS >= c.ODTVAL AND b.DTBOS < c.ODTVALEND */ END -- Carico i dati della Temp table nel file di appoggio -- INSERT INTO RawData.BORI202J -- SELECT * FROM ##TabTemp RETURN]]> 0 BEGIN SET @IdxTipoCella = @IdxTipoCellaNew END ELSE BEGIN SET @IdxTipoCella = (SELECT TOP (1) ISNULL(IdxTipoCella, 0) AS IdxTipoCella FROM TipoCella WHERE (CodCS = @CodCS) AND (CodMag = @CodMag)) END --------------------------------------------------------------------- -- inserisco le celle nelle posizioni LIBERE del blocco --------------------------------------------------------------------- INSERT INTO Celle(CodCS, CodCella, IdxTipoCella, Descrizione, Attiva, Piena, IdxBlocco,X,Y,Z) SELECT @CodCS, @CodBlocco + dbo.f_padLeft(CAST(sb.X AS VARCHAR),2,'0') + dbo.f_padLeft(CAST(sb.Y AS VARCHAR),2,'0') + dbo.f_padLeft(CAST(sb.Z AS VARCHAR),2,'0'), @IdxTipoCella, '-', 1, 0, @IdxBlocco, sb.X, sb.Y, sb.Z FROM @SchemaBlocco sb LEFT OUTER JOIN (SELECT * FROM Celle WHERE IdxBlocco = @IdxBlocco) c ON sb.X = c.X AND sb.Y = c.Y AND sb.Z = c.Z WHERE c.IdxCella IS NULL ORDER BY sb.X,sb.Y,sb.Z ASC RETURN]]> (CASE @PosAssegnata WHEN 0 THEN (ISNULL(X,0)+ISNULL(Y,0)+ISNULL(Z,0)) - 1 ELSE 0 END)) ) RETURN @TotCelle]]> 0) BEGIN -- se c'è incremento di 1 in tab UPDATE ContatoriListePrelievo SET LastIdx = LastIdx + 1 WHERE CodCS = @CodCS AND Anno = @Anno AND Mese = @Mese END ELSE BEGIN -- lo creo! INSERT INTO ContatoriListePrelievo(CodCS, Anno, Mese, LastIdx) VALUES (@CodCS, @Anno, @Mese, 1) END -- aggiorno numero lista prelievo SET @numLista = ( SELECT LastIdx FROM ContatoriListePrelievo WHERE CodCS = @CodCS AND Anno = @Anno AND Mese = @Mese ) COMMIT TRAN ------------------------------------------------------------------------------------------------------ BEGIN TRAN ------------------------------------------------------------------------------------------------------ -- Ciclo principale x inserimento nuovo record ------------------------------------------------------------------------------------------------------ -- ottengo il nuovo codice lista di prelievo completo SET @CodLista = 'K' + @CodCS + @Anno + dbo.f_padLeft(CAST(@Mese AS NVARCHAR(2)), 2, '0') + + dbo.f_padLeft(CAST(@numLista AS NVARCHAR(5)), 5, '0') INSERT INTO ElencoListePrelievo (CodLista, CodTipoLista, CodCS, DataCreaz, CodCliente, RagSociale, CodSoggetto, Particolare, DescParticolare, DisegnoGrezzo, Esponente, Figura, CodImballo, QtaTot, CodStatoLista, Destinatario, DestinatarioDescrizione, DataModStato) VALUES (@CodLista, @CodTipoLista, @CodCS, GETDATE(), @CodCliente, @RagSociale, @CodSoggetto, @Particolare, @DescParticolare, @DisegnoGrezzo, @Esponente,@Figura, @CodImballo, @QtaTot, 0, @Destinatario, @DestinatarioDescrizione, GETDATE() ) COMMIT TRAN SELECT CodLista, CodTipoLista, CodCS, DataCreaz, CodCliente, RagSociale, CodSoggetto, Particolare, DescParticolare, DisegnoGrezzo, Esponente, Figura, CodImballo, QtaTot, CodStatoLista, Destinatario, DestinatarioDescrizione FROM V_elencoListePrelievo WHERE CodLista = @CodLista; RETURN]]> 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" -- verifico già se esite già l'UDC/Gitterbox in ElencoCartellini DECLARE @newData TABLE ( RowNumber int, CodDataMatrix numeric(23, 0) , CodGitterbox varchar(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 , UDC varchar(50) ) INSERT INTO @newData SELECT ROW_NUMBER() OVER(PARTITION BY CodGitterbox ORDER BY InizioIniezione ASC), dm.CodDataMatrix, LTRIM(RTRIM(dm.CodGitterbox)), dm.NumConchiglia, dm.NumDisegno, dm.EsponenteDisegno,dm.CodDifettoScarto, dm.InizioPreparazione, dm.FinePreparazione, dm.InizioIniezione, dm.FineIniezione, dm.MagDestinazione, dm.DataImport, ec.UDC FROM dbo.v_trasfDataMatrix AS dm LEFT JOIN dbo.ElencoCartellini AS ec ON dm.CodGitterbox = ec.UDC WHERE DataImport > @lastImport AND LEFT(CodGitterbox, 1) = 'U' AND CodDifettoScarto = '00' -- non importa gli scarti!!! /* INIZIO MODIFICA Note GCarlo : Se il Gitterbox è già stato trasferito e/o cmq già presente non viene caricato, al limite vengono caricati i Datamatrix non ancora presenti ma con Gitterbox = EmptyGBox Se non trovo il Particolare in dbo.v_transcParticolari i datamatrix non vengono importati Posso reimportarli spostando la data di import indietro in LogImportFlussi ATTENZIONE! Si presuppone che i DataMatrix siano coerenti ovvero stesso Particolare ecc. ecc. */ BEGIN TRAN; -- creo UDC da gitterbox nuovi ( Se UDC già presenti non li carico ) -- GCARLO messo un RowCount prima e prendo solo il primo DataMatrix INSERT INTO ElencoCartellini(UDC,CodCS, Particolare, DescParticolare, DisegnoGrezzo, Esponente, DataFus, Qta, CodSoggetto, CodStato, IdxPosizione,CreateDate, ModDate, Figura, CodImballo, Tara, PesoTot, PesoCad, NumCont, TurnoFus, CodEvento ) SELECT DISTINCT nd.CodGitterbox, @CodCS, tp.Particolare, an.DescParticolare, an.DisegnoGrezzo, an.EsponenteModifica ,InizioIniezione, dbo.getNumDatamatrix(nd.CodGitterbox), @CodSoggetto As CodSoggetto, 'FinGBox' AS CodStato ,@IdxPosizione, GETDATE(), GETDATE() ,'' AS Figura, '' AS CodImballo,0 AS Tara,0 AS PesoTot,0 AS PesoCad,1 AS NumCont,0 AS TurnoFus, 'UDC_GBOX' AS CodEvento FROM @newData nd INNER JOIN dbo.v_transcParticolari tp -- solo se PArticolare è presente in Trascodifica ON nd.NumDisegno = tp.NumDisegno AND nd.EsponenteDisegno = tp.EsponenteDisegno LEFT JOIN RilPro.AnagParticolari an -- Leggo il disegno in anagrafica ON tp.Particolare = an.Particolare WHERE nd.RowNumber = 1 -- Prendo solo i dati del First DataMatrix ( data iniezione ) AND nd.UDC IS NULL -- solo Gitterbox Nuovi DECLARE @udc NVARCHAR(50) DECLARE @Particolare NVARCHAR(50) DECLARE @NumDisegno NVARCHAR(50) DECLARE @EsponenteDisegno NVARCHAR(50) DECLARE @IdxCellaTo INT DECLARE @adesso DATETIME DECLARE @posTrovate INT SET @adesso = GETDATE() SET @posTrovate = 0 -- indico cella UDC corrente... calcolo la prima cella della nuova posizione... SET @IdxCellaTo = ( SELECT dbo.f_getCellaByPos(CAST(@IdxPosizione AS NVARCHAR(50))) ) DECLARE cursoreImport CURSOR FOR SELECT DISTINCT CodGitterbox FROM @newData WHERE UDC IS NULL -- solo x Gitterbox Nuovi OPEN cursoreImport FETCH NEXT FROM cursoreImport INTO @udc WHILE @@FETCH_STATUS = 0 BEGIN -- controllo se posizione non ancora creata... SET @posTrovate = ( SELECT COUNT(*) FROM PosizioneUdcCorrente WHERE UDC = @udc ) IF( @posTrovate = 0) BEGIN INSERT INTO PosizioneUdcCorrente(UDC, IdxCella, CodCS, DataRif, CodSoggetto) VALUES(@udc, @IdxCellaTo, @CodCS, @adesso, @CodSoggetto) END FETCH NEXT FROM cursoreImport INTO @udc END CLOSE cursoreImport DEALLOCATE cursoreImport -- CARICAMENTO DATAMATRIX -- -- Carico i datamatrix se UDC/Gitterbox nuovi INSERT INTO dbo.ElencoDataMatrix SELECT nw.CodDataMatrix ,nw.CodGitterbox ,nw.NumConchiglia ,nw.NumDisegno ,nw.EsponenteDisegno ,nw.CodDifettoScarto ,nw.InizioPreparazione ,nw.FinePreparazione ,nw.InizioIniezione ,nw.FineIniezione ,nw.MagDestinazione ,nw.DataImport FROM @newData AS nw LEFT JOIN dbo.ElencoDataMatrix AS el ON nw.CodDataMatrix = el.CodDataMatrix WHERE el.CodDataMatrix IS NULL -- Nuovi Datamatrix AND nw.UDC IS NULL -- Solo per Gitterbox nuovi -- Se esistono Datamatrix di UDC già caricati in precedenza li inserisco ma senza -- assegnare l'UDC ma lo metto a EmptyGBox perchè potrebbero essere UDC già spediti o -- movimentati e dovrei anche aggiornare la giacenza in ElencoCartellini INSERT INTO dbo.ElencoDataMatrix SELECT nw.CodDataMatrix ,'EmptyGBox' AS CodGitterbox ,nw.NumConchiglia ,nw.NumDisegno ,nw.EsponenteDisegno ,nw.CodDifettoScarto ,nw.InizioPreparazione ,nw.FinePreparazione ,nw.InizioIniezione ,nw.FineIniezione ,nw.MagDestinazione ,nw.DataImport FROM @newData AS nw LEFT JOIN dbo.ElencoDataMatrix AS el ON nw.CodDataMatrix = el.CodDataMatrix WHERE el.CodDataMatrix IS NULL AND nw.UDC IS NOT NULL -- aggiorno dati ultimo caricamento SET @lastImport = ISNULL( ( SELECT MAX(DataImport)FROM @newData ),@lastImport ) UPDATE LogImportFlussi SET LastImport = @lastImport WHERE NomeFlusso = @nomeFlusso COMMIT TRAN; */ RETURN]]> @CodLista AND CodStatoLista > 1 AND Prelevato = 1) ) AND ISNULL(Qta,0) > 0 ORDER BY ElencoCartellini.DataFus RETURN]]> 0) BEGIN -- copio la lista (intestazione) INSERT INTO ElencoListePrelievo_AS(CodLista, CodTipoLista, CodCS, DataCreaz, CodCliente, RagSociale, CodSoggetto, Particolare, DescParticolare, DisegnoGrezzo, Esponente, Figura, CodImballo, QtaTot, CodStatoLista, Destinatario) SELECT CodLista, CodTipoLista, CodCS, DataCreaz, CodCliente, RagSociale, CodSoggetto, Particolare, DescParticolare, DisegnoGrezzo, Esponente, Figura, CodImballo, QtaTot, CodStatoLista, Destinatario FROM ElencoListePrelievo WHERE (CodLista = @CodLista) -- copio le righe lista di dettaglio INSERT INTO RigheListePrelievo_AS(CodLista, UDC, Qta, Proposto, Prelevato) SELECT CodLista, UDC, Qta, Proposto, Prelevato FROM RigheListePrelievo WHERE (CodLista = @CodLista) AND Prelevato = 1 -- aggiorno le quantità passate ad AS... UPDATE ElencoListePrelievo_AS SET QtaTot = ( SELECT SUM(Qta) AS QtaTot FROM RigheListePrelievo WHERE (CodLista = @CodLista) AND Prelevato = 1 ) WHERE (CodLista = @CodLista) END COMMIT TRAN -- IMPORTANTE: in caso siano rimasti riferimenti ad un UDC scaricato in AS in altre liste di prelievo li tolgo in modo da "ripulirle" ed evitare che lo stesso UDC venga prelevato 2 volte... DELETE RLP FROM RigheListePrelievo RLP INNER JOIN ElencoListePrelievo ELP ON RLP.CodLista = ELP.CodLista WHERE ELP.CodStatoLista < 4 AND RLP.CodLista <> @CodLista AND RLP.UDC IN ( SELECT UDC FROM RigheListePrelievo WHERE (CodLista = @CodLista) AND Prelevato = 1 ) RETURN]]> 0 ORDER BY AnagMag.CodMag , Blocchi.CodBlocco; END /* OLD 17/06/2013 Problema della cella terra bloccata non più visibile e delle celle bloccate piene SELECT AnagMag.CodCS, AnagMag.CodMag, AnagMag.DescMag, Blocchi.IdxBlocco, Blocchi.CodBlocco, Blocchi.DescBlocco, TipoCella.Capienza * Blocchi.NumX * Blocchi.NumY * Blocchi.NumZ AS TotCelle, TipoCella.Capienza * COUNT(DISTINCT Celle.IdxCella) AS CelleAttive, COUNT(PosizioneUdcCorrente.UDC) AS CelleOccupate, TipoCella.Capienza * COUNT(DISTINCT Celle.IdxCella) - COUNT(PosizioneUdcCorrente.UDC) AS CelleLibere, ISNULL(MIN(PosizioneUdcCorrente.DataRif), GETDATE()) AS Oldest, ISNULL(MAX(PosizioneUdcCorrente.DataRif), GETDATE()) AS Newest FROM TipoCella INNER JOIN AnagMag INNER JOIN Blocchi ON AnagMag.CodMag = Blocchi.CodMag AND AnagMag.CodCS = Blocchi.CodCS ON TipoCella.CodMag = AnagMag.CodMag AND TipoCella.CodCS = AnagMag.CodCS LEFT OUTER JOIN Celle ON TipoCella.IdxTipoCella = Celle.IdxTipoCella AND Blocchi.IdxBlocco = Celle.IdxBlocco LEFT OUTER JOIN PosizioneUdcCorrente ON Celle.IdxCella = PosizioneUdcCorrente.IdxCella WHERE (Celle.Attiva = 1) AND (AnagMag.CodCS = @CodCS) AND (ISNULL(AnagMag.Nascosto, 0) = 0) GROUP BY AnagMag.CodCS, AnagMag.CodMag, AnagMag.DescMag, Blocchi.IdxBlocco, Blocchi.CodBlocco, Blocchi.DescBlocco, Blocchi.NumX, Blocchi.NumY, Blocchi.NumZ, TipoCella.Capienza ORDER BY AnagMag.CodMag, Blocchi.CodBlocco END ELSE BEGIN SELECT AnagMag.CodCS, AnagMag.CodMag, AnagMag.DescMag, Blocchi.IdxBlocco, Blocchi.CodBlocco, Blocchi.DescBlocco, TipoCella.Capienza * Blocchi.NumX * Blocchi.NumY * Blocchi.NumZ AS TotCelle, TipoCella.Capienza * COUNT(DISTINCT Celle.IdxCella) AS CelleAttive, COUNT(PosizioneUdcCorrente.UDC) AS CelleOccupate, TipoCella.Capienza * COUNT(DISTINCT Celle.IdxCella) - COUNT(PosizioneUdcCorrente.UDC) AS CelleLibere, ISNULL(MIN(PosizioneUdcCorrente.DataRif), GETDATE()) AS Oldest, ISNULL(MAX(PosizioneUdcCorrente.DataRif), GETDATE()) AS Newest FROM TipoCella INNER JOIN AnagMag INNER JOIN Blocchi ON AnagMag.CodMag = Blocchi.CodMag AND AnagMag.CodCS = Blocchi.CodCS ON TipoCella.CodMag = AnagMag.CodMag AND TipoCella.CodCS = AnagMag.CodCS LEFT OUTER JOIN Celle ON TipoCella.IdxTipoCella = Celle.IdxTipoCella AND Blocchi.IdxBlocco = Celle.IdxBlocco LEFT OUTER JOIN PosizioneUdcCorrente ON Celle.IdxCella = PosizioneUdcCorrente.IdxCella INNER JOIN ElencoCartellini ec ON PosizioneUdcCorrente.UDC = ec.UDC WHERE (Celle.Attiva = 1) AND (AnagMag.CodCS = @CodCS) AND (ISNULL(AnagMag.Nascosto, 0) = 0) AND ec.particolare = @particolare GROUP BY AnagMag.CodCS, AnagMag.CodMag, AnagMag.DescMag, Blocchi.IdxBlocco, Blocchi.CodBlocco, Blocchi.DescBlocco, Blocchi.NumX, Blocchi.NumY, Blocchi.NumZ, TipoCella.Capienza ORDER BY AnagMag.CodMag, Blocchi.CodBlocco END */ RETURN]]> 'VMLP' AND (am.CodCS = @CodCS) AND (ec.Particolare = @Particolare) GROUP BY b.IdxBlocco, b.CodBlocco, b.DescBlocco, ec.Particolare ORDER BY Oldest ASC RETURN]]> 0) BEGIN IF GETDATE() < '20140101' -- 28/11/2013 Hard Coded x Modifica Anagrafica Articoli BEGIN SELECT TOP 1 -- nel caso di più righe dello stesso articolo in bolla -- campo 1 indirizzo destinazione cliente ( Receiver ) @ragSocCli = CASE WHEN dbo.f_trim(CDINB) <> '' AND @CodCS <> 'TK' THEN dbo.f_trim(RA1ND) ELSE dbo.f_trim(RASCL) END ,@indirCli = CASE WHEN dbo.f_trim(CDINB) <> '' AND @CodCS <> 'TK' THEN dbo.f_trim(RA2ND) ELSE dbo.f_trim(INDCL) END ,@capCittCli = CASE WHEN dbo.f_trim(CDINB) <> '' AND @CodCS <> 'TK' THEN dbo.f_trim(CAPND) + ' ' + dbo.f_trim(CITND) ELSE dbo.f_trim(CAPCL) + ' ' + dbo.f_trim(LOCCL) + ' ' +dbo.f_trim(PROCL) END -- campo 2 punto di rifornimento / molo / uso ( Destination ) -- ATTENZIONE NON POSSO TESTARE QUI LE VARIABILI MA SOLO ASSEGNARLE!!! NEL CASE LE VALUTA SEMPRE VUOTE ,@destinatario = dbo.f_odetteCalcDest( dbo.f_trim(INEND), dbo.f_trim(CCDMOL), dbo.f_trim(CCDPTR), dbo.f_trim(CDINB), dbo.f_trim(CRAGCL), dbo.f_trim(TELND) ) -- Leggo i dati che mi servono dopo nel caso il destinatario sia vuoto ( VEDI DOPO SELECT ) ,@ragSocDest = dbo.f_trim(RA1ND) ,@indirDest = dbo.f_trim(RA2ND) ,@capCittDest = dbo.f_trim(CAPND) + ' ' + dbo.f_trim(CITND) -- campo 5_2 peso netto ( Net Weight ) ,@peso = CASE WHEN ISNULL(EPLAVO,0) <= 0 THEN EPNETT ELSE EPLAVO END ,@pesoNetto = CONVERT(NVARCHAR(50), CONVERT(INT , FLOOR( @peso * @qtaUdc ) ) ) -- campo 6_2 peso lordo (Gross Weight) ,@pesoLordo = CONVERT(NVARCHAR(50), CONVERT(INT, FLOOR( PELDB / NRC1B ) ) ) -- campo 7 numero colli (Nr. Boxes) ,@numColli = CONVERT(NVARCHAR(50), 1) -- imposto n. colli del cartellino odette fisso = 1 -- ,@numColli = CONVERT(NVARCHAR(50), NRC1B) -- campo 8 disegno particolare ( Part Number ) ,@disPart = dbo.f_trim(ECMM01) -- campo 10 Descrizione particolare ( Description ) ,@descPart = dbo.f_trim(DEPAR) -- campo 11_1 Codice particolare (non stampato) ,@codPart = dbo.f_trim(CDARS) -- campo 11_2 Codice imballo per il cliente ( Logistics Reference ) ,@codImb = dbo.f_trim(FCDI01) -- campo 12 Codice Mazzucconi/Tekal/Possidonio per il cliente ( Supplier ) ,@codMaz = CASE WHEN dbo.f_trim(CRAGCL) = '13' OR dbo.f_trim(SUBSTRING(TELND,19,2)) = '13' THEN CASE WHEN dbo.f_trim(CDINB) <> '' AND dbo.f_trim(PERND) <> '' THEN dbo.f_trim(PERND) WHEN dbo.f_trim(CDINB) = '' AND dbo.f_trim(CCDET1) <> '' THEN dbo.f_trim(CCDET1) ELSE dbo.f_trim(CCFOE1) END ELSE dbo.f_trim(CCFOE1) END -- campo 14 codice NAEL + esponente di modifica particolare ( Change Index ) ,@codNael = dbo.f_odetteCalcNAEL ( dbo.f_trim(CRAGCL),dbo.f_trim(TELND),dbo.f_trim(ECDNAE),dbo.f_trim(ECDNA1), dbo.f_trim(EESPMD),dbo.f_trim(OCDODM) ) --,@codNaelP1 = CASE WHEN dbo.f_trim(CRAGCL) = '13' OR dbo.f_trim(SUBSTRING(TELND,19,2)) = '13' THEN dbo.f_trim(ECDNAE) ELSE '' END --,@codNaelP2 = CASE WHEN dbo.f_trim(CRAGCL) = '13' OR dbo.f_trim(SUBSTRING(TELND,19,2)) = '13' THEN dbo.f_trim(ECDNA1) ELSE '' END --,@codNaelP3 = CASE WHEN dbo.f_trim(CRAGCL) = '13' OR dbo.f_trim(SUBSTRING(TELND,19,2)) = '13' THEN dbo.f_trim(EESPMD) ELSE '' END --,@codNael = CASE WHEN dbo.f_trim(CRAGCL) = '13' OR dbo.f_trim(SUBSTRING(TELND,19,2)) = '13' THEN 'ZI:'+ @codNaelP1 + ' ' + @codNaelP2 + ' AI:'+ @codNaelP3 ELSE OCDODM END -- campo 16_5 AQP ( controllo qualità ) ,@codAQP = dbo.f_trim(ECLAQP) FROM RawData.BORI202J WHERE CDMFS = @CodMag AND GRBOS = @GrpBolla AND NRBOS = @numBolla AND DTBOS = @DataBolla AND CDARS = @Particolare -- Se nella destinazione non trovo nulla utilizzo i dati in RA1ND RA2ND CAPND CITND ( simile indirizzo cliente ) IF @destinatario = '' SET @destinatario = @ragSocDest ELSE BEGIN -- vuoto i campi necessari solo se destinatario NON è vuoto ( in questo caso compilo solo prima riga ) SET @indirDest = '' SET @capCittDest = '' END END ELSE BEGIN SELECT TOP 1 -- nel caso di più righe dello stesso articolo in bolla -- campo 1 indirizzo destinazione cliente ( Receiver ) @ragSocCli = CASE WHEN dbo.f_trim(CDINB) <> '' THEN dbo.f_trim(RA1ND) ELSE dbo.f_trim(RASCL) END ,@indirCli = CASE WHEN dbo.f_trim(CDINB) <> '' THEN dbo.f_trim(RA2ND) ELSE dbo.f_trim(INDCL) END ,@capCittCli = CASE WHEN dbo.f_trim(CDINB) <> '' THEN dbo.f_trim(CAPND) + ' ' + dbo.f_trim(CITND) ELSE dbo.f_trim(CAPCL) + ' ' + dbo.f_trim(LOCCL) + ' ' +dbo.f_trim(PROCL) END -- campo 2 punto di rifornimento / molo / uso ( Destination ) -- ATTENZIONE NON POSSO TESTARE QUI LE VARIABILI MA SOLO ASSEGNARLE!!! NEL CASE LE VALUTA SEMPRE VUOTE ,@destinatario = dbo.f_odetteCalcDest( dbo.f_trim(INEND), dbo.f_trim(CCDMOL), dbo.f_trim(CCDPTR), dbo.f_trim(CDINB), dbo.f_trim(CRAGCL), dbo.f_trim(TELND) ) -- campo 5_2 peso netto ( Net Weight ) ,@peso = CASE WHEN ISNULL(EPLAVO,0) <= 0 THEN EPNETT ELSE EPLAVO END ,@pesoNetto = CONVERT(NVARCHAR(50), CONVERT(INT , FLOOR( @peso * @qtaUdc ) ) ) -- campo 6_2 peso lordo (Gross Weight) ,@pesoLordo = CONVERT(NVARCHAR(50), CONVERT(INT, FLOOR( PELDB / NRC1B ) ) ) -- campo 7 numero colli (Nr. Boxes) ,@numColli = CONVERT(NVARCHAR(50), 1) -- imposto n. colli del cartellino odette fisso = 1 -- ,@numColli = CONVERT(NVARCHAR(50), NRC1B) -- campo 8 disegno particolare ( Part Number ) ,@disPart = dbo.f_trim(RCARTC) -- campo 10 Descrizione particolare ( Description ) ,@descPart = dbo.f_trim(DEPAR) -- campo 11_1 Codice particolare (non stampato) ,@codPart = dbo.f_trim(CDARS) -- campo 11_2 Codice imballo per il cliente ( Logistics Reference ) ,@codImb = dbo.f_trim(FCDI01) -- campo 12 Codice Mazzucconi/Tekal/Possidonio per il cliente ( Supplier ) ,@codMaz = CASE WHEN dbo.f_trim(CRAGCL) = '13' OR dbo.f_trim(SUBSTRING(TELND,19,2)) = '13' THEN CASE WHEN dbo.f_trim(CDINB) <> '' AND dbo.f_trim(PERND) <> '' THEN dbo.f_trim(PERND) WHEN dbo.f_trim(CDINB) = '' AND dbo.f_trim(CCDET1) <> '' THEN dbo.f_trim(CCDET1) ELSE dbo.f_trim(CCFOE1) END ELSE dbo.f_trim(CCFOE1) END -- campo 14 codice NAEL + esponente di modifica particolare ( Change Index ) ,@codNael = dbo.f_odetteCalcNAEL ( dbo.f_trim(CRAGCL),dbo.f_trim(TELND),dbo.f_trim(ECDNAE),dbo.f_trim(ECDNA1), dbo.f_trim(EESPMD),dbo.f_trim(OCDODM) ) -- campo 16_5 AQP ( controllo qualità ) ,@codAQP = dbo.f_trim(ECLAQP) FROM RawData.BORI202J WHERE CDMFS = @CodMag AND GRBOS = @GrpBolla AND NRBOS = @numBolla AND DTBOS = @DataBolla AND CDARS = @Particolare END -- SELECT @UDC, @ragSocCli, @indirCli, @capCittCli, @destinatario, @indirDest, @capCittDest, @pesoNetto, @pesoLordo, @numColli, @disPart, @descPart, @codPart, @codImb, @codMaz, @codNael, @codAQP EXEC stp_ODETTE_updateVal @UDC, @ragSocCli, @indirCli, @capCittCli, @destinatario, @indirDest, @capCittDest, @pesoNetto, @pesoLordo, @numColli, @disPart, @descPart, @codPart, @codImb, @codMaz, @codNael, @codAQP END RETURN]]> '' ) SELECT * FROM v_selParticolari WHERE conditio = @conditio AND value LIKE @prefText + '%'; ELSE SELECT * FROM v_selParticolari WHERE value LIKE @prefText + '%'; RETURN]]> '*' ) SELECT * FROM v_selParticolari WHERE conditio = @conditio AND value = @value; ELSE SELECT * FROM v_selParticolari WHERE value = @value; RETURN]]> = 0 -- vincolo posizioni mag attive GROUP BY RilPro.AnagParticolari.Particolare, RilPro.AnagParticolari.DescParticolare RETURN]]> = 0 -- vincolo posizioni mag attive GROUP BY RilPro.AnagParticolari.Particolare, RilPro.AnagParticolari.DescParticolare RETURN]]> 1 AND Prelevato = 1) ) GROUP BY RilPro.AnagParticolari.Particolare, RilPro.AnagParticolari.DescParticolare RETURN]]> = dbo.dateToAsFormat(@dataFrom)) AND (DataRapQual < dbo.dateToAsFormat(@dataTo))) -- cond data RQ AND (ISNULL(UDC,'') <>'') -- non nullo UDC, quindi stampati... RETURN]]> = dbo.dateToAsFormat(@dataFrom)) AND (DataRapQual < dbo.dateToAsFormat(@dataTo)) ORDER BY nRapQual RETURN]]> @CodLista ) -- effettua "sblocco" delle righe liste prelievo che danno UDC prelevati ma che NON risultano UPDATE cteUdcRigheAttive SET Prelevato = 0 WHERE UDC = @UDC RETURN]]> @IdxCellaFrom) BEGIN -- controllo UDC "libero" da LDP (ovvero non faccia parte di LDP in uno stato che NON permette MOV, nel qual caso NON sposto) IF (@udcInLdpPrel = 0) -- tutto ok PROCEDO! 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 ---- aggiorno utente x la posizione corrente, in modo da poter POI salvare l'utente che scarica UDC --UPDATE PosizioneUdcCorrente --SET CodSoggetto = @CodSoggetto --WHERE UDC = @UDC ---- cancello posizione occupata ( non serve più faccio UPDATE ) --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 -- modifico la posizione per l'UDC se esiste altrimenti la inserisco IF @IdxCellaFrom <> 0 UPDATE PosizioneUdcCorrente SET IdxCella = @IdxCellaTo, DataRif = GETDATE(), CodSoggetto = @CodSoggetto FROM PosizioneUdcCorrente WHERE UDC = @UDC AND CodCS = @CodCS AND IdxCella = @IdxCellaFrom ELSE INSERT INTO PosizioneUdcCorrente(UDC, IdxCella, CodCS, DataRif, CodSoggetto) VALUES(@UDC, @IdxCellaTo, @CodCS, GETDATE(), @CodSoggetto); SET @numUdc = (SELECT COUNT(*) FROM PosizioneUdcCorrente WHERE IdxCella = @IdxCellaTo) -- controllo se la cella di dest vada indicata come piena, altrimenti NON la indicherò (mai) come piena... SET @capienza = ( SELECT CASE CheckPiena WHEN 1 THEN tc.Capienza ELSE @numUdc + 1 END FROM TipoCella TC INNER JOIN Celle c ON TC.IdxTipoCella=c.IdxTipoCella WHERE c.IdxCella = @IdxCellaTo ) -- se capienza raggiunta aggiorno... IF(@numUdc >= @capienza) BEGIN EXEC stp_celle_updPiena @IdxCellaTo, 1 END END -- cellaFrom e cellaTo non coincidono... END -- UDC NON appartiene a LDP già prelevate... COMMIT TRAN RETURN]]> = Capienza) RETURN]]> 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 */]]> 0 BEGIN BEGIN TRY; BEGIN TRANSACTION; -- ===================================================== -- Cancella tutti gli UDC di un RQ -- ===================================================== SELECT ROW_NUMBER() OVER (ORDER BY UDC) AS Riga,UDC INTO #Temp FROM RilPro.RapQual WHERE nRapQual = @nRapQual; -- 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 cartelle ci sono dei trigger DELETE dbo.PosizioneUdcCorrente WHERE UDC = @UDC DELETE dbo.RelazUDC WHERE UDC_child = @UDC 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 -- IF @nRapQual = 20 Select 1/0 -- Select 1/0 SET @Riga = @Riga + 1 -- Incremento contatore x UDC in tabella Temp -- SELECT @UDC 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 AND @TRAN = 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 ) -- EXISTS (SELECT 1 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE='BASE TABLE' AND TABLE_NAME='#Temp') -- *** QUI HO IL PROBLEMA SE XACT_STATE() = -1 perchè da errore 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]]> 'VMLP' AND (am.CodCS = @CodCS) AND (ec.Particolare = @Particolare) AND b.IdxBlocco = @idxBlocco GROUP BY ec.UDC, c.CodCella, ec.DataFus, ec.Qta ORDER BY ec.DataFus ASC RETURN]]> = @DataFrom) AND (DataFus <= @DataTo) ORDER BY UDC DESC RETURN]]> @note OR ec.note IS NULL ) RETURN]]> 0) -- UPDATE! BEGIN UPDATE RigheListePrelievo SET Prelevato=1 WHERE (CodLista = @CodLista) AND (UDC = @UDC) END ELSE -- INSERT! BEGIN INSERT INTO RigheListePrelievo (CodLista, UDC, Qta, Proposto, Prelevato) SELECT @CodLista, @UDC, Qta, 0, 1 FROM ElencoCartellini WHERE (UDC = @UDC) END -- restituisce la tab delle righe di prelievo della lista indicata SELECT * FROM RigheListePrelievo WHERE (CodLista = @CodLista) AND (UDC = @UDC)]]> i.CodStatoLista ) -- 99 solo se lo stato lista è cambiato AND NOT ( ( d.CodStatoLista = 0 AND i.CodStatoLista = 1 AND d.CodTipoLista = '00-Smart' ) -- escludo la storicizzazione dei primi due stati OR ( d.CodStatoLista = 1 AND i.CodStatoLista = 2 AND d.CodTipoLista = '00-Smart' ) ) -- delle smart list che sono creati contemporaneamente --WHERE ( d.CodStatoLista = 3 AND i.CodStatoLista = 4 ) -- Storicizzo chi ha completato la Lista -- OR ( d.CodStatoLista = 4 AND i.CodStatoLista < 4 ) -- Storicizzo se la lista Scaricata è viene resettata -- OR ( d.CodStatoLista = 3 AND i.CodStatoLista < 3 ) -- Storicizzo se la lista Completata è viene resettata -- OR ( d.CodStatoLista = 0 AND i.CodStatoLista > 0 ) -- Storicizzo lo stato Bozza -- OR ( d.CodStatoLista = 1 AND i.CodStatoLista > 1 ) -- Storicizzo lo stato Generata -- OR ( d.CodStatoLista = 2 AND i.CodStatoLista > 2 ) -- Storicizzo lo stato In Carico END ELSE -- se è cambiato il tipo Lista ma non lo Stato storicizzo cmq Mod. 28/06/2013 IF ( UPDATE(CodTipoLista)) BEGIN INSERT INTO ElencoListePrelievo_storico (DataOraDelete,CodLista,CodTipoLista,CodCS,DataCreaz,CodCliente,RagSociale,CodSoggetto,Particolare,DescParticolare,DisegnoGrezzo, Esponente,Figura,CodImballo,QtaTot,CodStatoLista,Destinatario,DestinatarioDescrizione, DataModStato) SELECT @dataOra, d.CodLista,d.CodTipoLista,d.CodCS,d.DataCreaz,d.CodCliente,d.RagSociale,d.CodSoggetto,d.Particolare,d.DescParticolare,d.DisegnoGrezzo, d.Esponente,d.Figura,d.CodImballo,d.QtaTot,d.CodStatoLista,d.Destinatario,d.DestinatarioDescrizione, d.DataModStato FROM deleted AS d INNER JOIN inserted AS i ON d.CodLista = i.CodLista WHERE d.CodTipoLista <> i.CodTipoLista -- solo se cambiato -- AND NOT ( d.CodStatoLista <> 3 ) -- escludo il cambio per le liste stato 3 ( Normale Funzionamento ) END END]]> 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]]> GETDATE() - 180 ) , cte2 AS ( SELECT * , CASE WHEN TimePrint BETWEEN Maxi_ms - 500 AND Maxi_ms + 500 THEN 1 ELSE 0 END AS MaxiCount , CASE WHEN TimePrint BETWEEN Min_ms - 100 AND Min_ms + 100 THEN 1 ELSE 0 END AS MinCount FROM cte ) SELECT TipoCart , prtName , NumCart , Med_ms , Maxi_ms , SUM( MaxiCount )AS MaxiCount , Min_ms , SUM( MinCount )AS MinCount FROM cte2 GROUP BY TipoCart , prtName , Maxi_ms , Min_ms , Med_ms , NumCart]]> '' THEN ' [' + codPostazione + ']' ELSE '' END AS label, CodBlocco AS conditio FROM dbo.AnagLinee]]> 0)]]> = 0)]]>