Files
2014-03-21 10:20:06 +01:00

236 lines
12 KiB
Transact-SQL

/***************************************
* STORED stp_batch_RapQual_S02
*
* Esegue lo step 2 (travaso dati RAW in RilPro) per la tab dei rapporti di qualità
*
* Steamware, S.E.L.
* mod: 2014.03.03
*
****************************************/
CREATE PROCEDURE [BatchQueue].[stp_batch_RapQual_S02]
(
@CodMagMpNONacc NVARCHAR(50) = '6666',
@CodMagMpAcc NVARCHAR(50) = '6',
@CodStatoMpNONacc NVARCHAR(50) = 'MP-NA',
@CodStatoMpAcc NVARCHAR(50) = 'MP',
@ExecBatchInter BIT = 0 -- 0 Eseguita in Batch , 1 in Interattivo ( default x applicativo )
)
AS
SET XACT_ABORT ON;
SET NOCOUNT ON;
BEGIN TRY
-- eseguo UPSERT x tutti i dati disponibili in tab Raw...
BEGIN TRAN;
-- ===============================================================================================
-- PRIMA DI AGGIORNARE VERIFICO SE CI SONO MODIFICHE DI MP ACCETTATA / NON ACCETTATA
-- ===============================================================================================
--DECLARE @CodMagMpNONacc AS VARCHAR(50) = '6666' -- Setto il Magazzino per MP NON ACCETTATA
--DECLARE @CodMagMpAcc AS VARCHAR(50) = '6' -- Setto il Magazzino per MP ACCETTATA
DECLARE @CellaOK AS INT
DECLARE @MagAccOK AS INT
DECLARE @MagNNAccOK AS INT
DECLARE @CodEven AS NVARCHAR(10) = 'UDC_MPRQ';
-- ===============================================================================================
-- SPOSTAMENTO DI MAGAZZINO DELLA MP che da ACCETTATA diventa NON ACCETTATA
-- ===============================================================================================
-- Controllo che il magazzino dest. NON ACCETTATA sia a cella singola( a terra ), attivo
SELECT @MagAccOK = COUNT(*) FROM dbo.Celle AS c INNER JOIN Blocchi b ON c.IdxBlocco=b.IdxBlocco
WHERE b.CodMag = @CodMagMpNONacc AND c.Attiva = 1
IF @MagAccOK = 1 -- Se mag. NON 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 = @CodMagMpNONacc 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 = 'S' AND u.XBENQL = 'N' ) -- da Accettata a NON accettata
AND XMATSC = 'N' -- solo Lega non ancora Scaricata
AND b.CodMag <> @CodMagMpNONacc; -- Che non è in Magazzino NON Accettati
-- ne modifico anche lo stato
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 AS x
LEFT OUTER JOIN RilPro.RapQual AS 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
AND r.DataRapQual > ( YEAR(GETDATE()) -1 ) * 10000 -- limito al max iniz. anno precedente
COMMIT TRAN;
END TRY
BEGIN CATCH;
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 )
-- 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
ELSE -- altrimenti se interattivo salvo in tabella
INSERT INTO RawData.AS400_Comandi
SELECT GETDATE(), 'stp_batch_RapQual_S02', @ErrorMessage, @ErrorNumber;
END CATCH;
RETURN