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