Files
GMW/GMW_data/SqlScripts/V2.0/GMW_00452_Stored_BIS.sql
T

491 lines
17 KiB
PL/PgSQL

set xact_abort on;
go
begin transaction;
go
set ANSI_NULLS on;
go
/***************************************
* STORED stp_spostaUdc
*
* sposta un UDC, salvandone la posizione precedente (se esiste) nella tab storica
*
* Steamware, S.E.L.
* mod: 2010.06.11
*
****************************************/
alter PROCEDURE stp_spostaUdc
(
@CodCS VARCHAR(2),
@UDC VARCHAR(50),
@IdxCellaTo INT,
@resetRLP BIT
)
AS
BEGIN TRAN
-- DICHIARAZIONI iniziali variabili
DECLARE @IdxCellaFrom INT
DECLARE @capienza INT
DECLARE @numUdc INT
-- controllo cella di partenza
SET @IdxCellaFrom = (SELECT IdxCella FROM PosizioneUdcCorrente WHERE UDC = @UDC)
SET @IdxCellaFrom = ISNULL(@IdxCellaFrom,0) -- controllo x cella null...
-- controllo se cella di destinazione e di partenza coincidono NON FACCIO NULLA... altrimenti procedo
IF (@IdxCellaTo <> @IdxCellaFrom)
BEGIN
-- controllo se la cella di partenza vada indicata come piena o meno
SET @capienza = (
SELECT tc.Capienza
FROM TipoCella TC INNER JOIN Celle c ON TC.IdxTipoCella=c.IdxTipoCella
WHERE c.IdxCella = @IdxCellaFrom
)
SET @numUdc = (SELECT COUNT(*) FROM PosizioneUdcCorrente WHERE IdxCella = @IdxCellaFrom)
-- se capienza cella di partenza NON raggiunta aggiorno NON Piena
IF(@numUdc -1 < @capienza)
BEGIN
EXEC stp_celle_updPiena @IdxCellaFrom, 0
END
-- cancello posizione occupata
DELETE
FROM PosizioneUdcCorrente
WHERE UDC = @UDC
-- SE RICHIESTO cancello eventuali righe liste di prelievo FUSI per l'UDC
IF(@resetRLP = 1)
BEGIN
DELETE FROM RigheListePrelievo
WHERE UDC = @UDC AND CodLista IN (
SELECT CodLista FROM ElencoListePrelievo
--WHERE CodTipoLista='01-PreFus'
WHERE CodStatoLista < 4
)
END
-- creo una nuova posizione per l'UDC
INSERT INTO PosizioneUdcCorrente(UDC, IdxCella, CodCS, DataRif)
VALUES(@UDC, @IdxCellaTo, @CodCS, GETDATE())
-- controllo se la cella di dest vada indicata come piena
SET @capienza = (
SELECT tc.Capienza
FROM TipoCella TC INNER JOIN Celle c ON TC.IdxTipoCella=c.IdxTipoCella
WHERE c.IdxCella = @IdxCellaTo
)
SET @numUdc = (SELECT COUNT(*) FROM PosizioneUdcCorrente WHERE IdxCella = @IdxCellaTo)
-- se capienza raggiunta aggiorno...
IF(@numUdc >= @capienza)
BEGIN
EXEC stp_celle_updPiena @IdxCellaTo, 1
END
END -- cellaFrom e cellaTo non coincidono...
COMMIT TRAN
RETURN
go
commit;
go
set xact_abort on;
go
begin transaction;
go
set ANSI_NULLS on;
go
/*****************************************
* STORED stp_UDC_delete_byRdQ
*
* Elimina gli UDC associati ad un rapporto di qualità dato rapporto qualità
*
* Steamware, S.E.L.
* mod: 2012.02.14
*
****************************************/
alter PROCEDURE stp_UDC_delete_byRdQ
(
@nRapQual NUMERIC(6,0),
@ExecBatchInter BIT = 0 -- 0 Eseguita in Batch , 1 in Interattivo
)
AS
-- Attenzione!!! Cancella tutti i cartellini degli UDC materia prima del rapporto qualità anche se sono scaricati
-- comunque sono presenti nello StoricoCartellini
SET NOCOUNT ON;
SET ANSI_NULLS OFF;
SET XACT_ABORT ON; -- Se c'è un errore fa il rollback di tutta la transazione e non solo quella in errore
SET LOCK_TIMEOUT 600000; -- 10 min - Setto il tempo massimo di attesa del lock della tabella che è valido solo per la durata
-- della connessione e di default è settato a -1 (infinito). ATTENZIONE che se viene dato un errore
-- di lock deve essere controllato
IF @ExecBatchInter = 1 -- Se interattiva diminuisco il tempo di lock massimo a 15 sec
SET LOCK_TIMEOUT 15000;
-- Se per il rapporto qualità esiste almeno un cartellino UDC ( se nullo non lo conta )
IF ( SELECT COUNT(UDC) FROM RilPro.RapQual WHERE nRapQual = @nRapQual ) > 0
BEGIN
BEGIN TRY;
BEGIN TRANSACTION;
-- =========================================================
-- Cancella tutti gli UDC Materia Prima di un Rapp. Qualità
-- =========================================================
SELECT ROW_NUMBER() OVER (ORDER BY UDC) AS Riga,UDC
INTO #Temp
FROM RilPro.RapQual
WHERE nRapQual = @nRapQual AND UDC IS NOT NULL; -- Rapporto di qualità da cancellare
DECLARE @Riga AS INT = 1
,@Fine AS INT = 0
,@UDC nVarchar(50);
SELECT @Fine = MAX(Riga) FROM #Temp;
WHILE @Riga <= @Fine
BEGIN
-- Leggo UDC da cancellare uno alla volta
SELECT @UDC = UDC FROM #Temp WHERE Riga = @Riga;
-- ======================================================
-- Cancella i dati del singolo UDC
-- =======================================================
-- Attenzione che sulle tabelle ci sono dei trigger
DELETE dbo.PosizioneUdcCorrente WHERE UDC = @UDC
-- DELETE dbo.RelazUDC WHERE UDC_child = @UDC -- mod. 2012-03-02 per mantenere la storia UDC AS400-GMW
-- DELETE dbo.RelazUDC WHERE UDC_parent = @UDC
DELETE dbo.ElencoCartellini WHERE UDC = @UDC
-- sgancio il cartellino AS400 da quello GMW ( cancellato )
UPDATE RilPro.RapQual SET UDC = NULL WHERE UDC = @UDC
--SELECT * FROM dbo.PosizioneUdcCorrente WHERE UDC = @UDC
--SELECT * FROM dbo.RelazUDC WHERE UDC_child = @UDC
--SELECT * FROM dbo.ElencoCartellini WHERE UDC = @UDC
--SELECT * FROM RilPro.RapQual WHERE UDC = @UDC
SET @Riga = @Riga + 1 -- Incremento contatore x UDC in tabella Temp
END
-- Se esiste la tabella #Temp la cancello
IF OBJECT_ID(N'tempdb..#Temp') IS NOT NULL
DROP TABLE #Temp;
COMMIT TRANSACTION;
END TRY
BEGIN CATCH;
--IF (ERROR_NUMBER() = 1222) -- se vi è un lock per troppo tempo posso controllarlo x rieseguire
-- BEGIN; PRINT 'Tabella Bloccata'; -- Segnalo l'errore specifico di lock
-- END;
--ELSE PRINT 'Errore Generico'; -- se l'errore non è un deadlock esco dal WHILE
IF XACT_STATE() <> 0 -- solo se vi sono transazioni aperte faccio il rollback ( da verificare nel caso sia richiamato
ROLLBACK TRANSACTION -- all'interno di un'altra transazione )
-- Cancello La Tabella TEMP se esiste ( messo x per sicurezza )
IF OBJECT_ID(N'tempdb..#Temp') IS NOT NULL
DROP TABLE #Temp;
-- Uso RAISERROR mandare in errore la procedura e x per tornare le info
-- sull'errore originale che ha portato l'esecuzione nel blocco CATCH
DECLARE @ErrorNumber INT;
DECLARE @ErrorMessage NVARCHAR(4000);
DECLARE @ErrorSeverity INT;
DECLARE @ErrorState INT;
SELECT @ErrorMessage = ERROR_MESSAGE(),@ErrorSeverity = ERROR_SEVERITY(),@ErrorState = ERROR_STATE(), @ErrorNumber = ERROR_NUMBER();
IF @ExecBatchInter = 0 -- Sollevo errore solo se richiesto dai parametri ( es. esecuzione da un Job Batch )
RAISERROR (@ErrorMessage,@ErrorSeverity,@ErrorState); -- Se non uso RAISERROR la procedura non mi da errore es. se schedulata
END CATCH;
END
/*---------------------------------------
- Query x eliminazione UDC e tab
- collegate dato un Rapp di Qualità
---------------------------------------*/
/* NON FUNZIONA A CAUSA DEI TRIGGER
WITH cte AS -- Tutti i cartellini su AS400 annullati che hanno un cartellino in RilPro
(
SELECT r.UDC
FROM RilPro.RapQual AS r
INNER JOIN dbo.ElencoCartellini AS e
ON r.UDC = e.UDC
WHERE r.BenesQual = 'A'
)
-- Cancello la posizione degli UDC a magazzino
DELETE dbo.PosizioneUdcCorrente
FROM dbo.PosizioneUdcCorrente AS P
INNER JOIN RilPro.RapQual AS r
ON p.UDC = r.UDC
WHERE r.nRapQual = @nRapQual
-- SELECT * FROM dbo.PosizioneUdcCorrente WHERE r.nRapQual = @nRapQual
-- Se non sono ancora scaricati cancello il record movimento di scarico materia prima
DELETE dbo.AS400_BatchConsumoMP
FROM dbo.AS400_BatchConsumoMP AS b
INNER JOIN RilPro.RapQual AS r
ON b.UDC = r.UDC
WHERE r.nRapQual = @nRapQual AND b.DataInvioAs IS NULL
SELECT * FROM dbo.AS400_BatchConsumoMP
-- Cancellazione Cartellini Materia Prima di un Rapporto qualità
SELECT * FROM dbo.ElencoCartellini
*/
go
commit;
go
/****** Object: StoredProcedure [BatchQueue].[stp_processaGiornaleMagazzino] Script Date: 06/05/2012 19:24:45 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
/*****************************************
* STORED stp_processaGiornaleMagazzino
*
* processa il giornale del magazzino, in modo da controlalre tutte le righe non processate (o eventualmente solo quelle nuove)
* e spostare nella coda di trasferimento con AS400 SOLO i movimenti che soddisfano i criteri specificati nella tabella
* "TabSyncMovMag"
*
* Steamware, S.E.L.
* mod: 2012.05.25
*
****************************************/
ALTER PROCEDURE [BatchQueue].[stp_processaGiornaleMagazzino]
(
@CodCS NCHAR(2),
@lastInsDate DATETIME = NULL -- data-ora da cui cercare i record, se non viene passata è l'ultimo movimento registrato
)
AS
BEGIN TRAN
/**********************************************************************************
*
* PROCEDURA in 4 step:
* - STEP 1: registro rettifiche QUANTITA' in FROM
* - STEP 2: registro prelievi da mag ext "from" (cambio mag)
* - STEP 3: registro depositi a mag ext "to" (cambio mag)
* - STEP 4: registro compensazioni: se from e to corrispondono e mag comp è NON NULLO metto in comp!
**********************************************************************************/
-- in primis: se è nulla la data calcolo l'ultim data di processing...
IF ( @lastInsDate IS NULL )
BEGIN
SET @lastInsDate = ( SELECT ISNULL(MAX(DataOra), '19000101') FROM GiornaleMagazzino WHERE NOT (DataOraProc IS NULL) )
END
-- ATTENZIONE!!! DEVE ESSERCI UN PARTICOLARE NON NULLO e != "n.d."
-- ora prendo tutte le righe che mi interessano e cerco match sulla tab TabSyncMovMag e le inserisco in batch...
-- STEP 1: rettifico quantità!
INSERT INTO AS400_BatchMovimenti(DataIns, numOp, CodEvento, Particolare, UDC, CodMagAS, Quantita)
SELECT DataOra, numOp, 'UDC_MOD', gm.Particolare, gm.UDC, tsmm.codMagExtFrom , gm.QtaTo - gm.QtaFrom
FROM GiornaleMagazzino gm
INNER JOIN TabSyncMovMag tsmm ON
tsmm.CodCS = @CodCS AND
gm.CodStatoFrom = tsmm.CodStatoFrom AND
gm.CodStatoTo = tsmm.CodStatoTo AND
gm.IdxPosizioneFrom = tsmm.IdxPosizioneFrom AND
gm.IdxPosizioneTo = tsmm.IdxPosizioneTo
WHERE (gm.DataOra >= @lastInsDate)
AND (gm.DataOraProc IS NULL)
AND (tsmm.toExt = 1) -- Se devo fare movimento su Sistema EXT
AND gm.Particolare <> '' -- particolare deve essere disponibile!!!!
AND (tsmm.codMagExtTo IS NOT NULL AND tsmm.codMagExtFrom IS NOT NULL ) -- le righe con magazzini ext NULLI non sono permessi
AND (tsmm.codMagExtFrom = tsmm.codMagExtTo) -- Solo se NON VARIA MAG ESTERNO...
AND (tsmm.codMagExtTo > 0 AND codMagExtFrom > 0 ) -- e magazzini non 0 ( usato quando non esiste Mag )
-- STEP 2: genero ora casi con 2 mag ext che cambiano: tolgo da FROM
INSERT INTO AS400_BatchMovimenti(DataIns, numOp, CodEvento, Particolare, UDC, CodMagAS, Quantita)
SELECT DataOra, numOp, 'UDC_MOV', gm.Particolare, gm.UDC, tsmm.codMagExtFrom , - gm.QtaFrom
FROM GiornaleMagazzino gm
INNER JOIN TabSyncMovMag tsmm ON
tsmm.CodCS = @CodCS AND
gm.CodStatoFrom = tsmm.CodStatoFrom AND
gm.CodStatoTo = tsmm.CodStatoTo AND
gm.IdxPosizioneFrom = tsmm.IdxPosizioneFrom AND
gm.IdxPosizioneTo = tsmm.IdxPosizioneTo
WHERE (gm.DataOra >= @lastInsDate)
AND (gm.DataOraProc IS NULL)
AND (tsmm.toExt = 1)
AND gm.Particolare <> '' -- particolare deve essere disponibile!!!!
AND (tsmm.codMagExtTo IS NOT NULL AND tsmm.codMagExtFrom IS NOT NULL ) -- le righe con magazzini ext NULLI non sono permessi
AND (tsmm.codMagExtFrom <> tsmm.codMagExtTo) -- se VARIA MAG ESTERNO...
AND (tsmm.codMagExtFrom > 0) -- e mag. partenza non 0 ( usato se non esiste Mag di partenza es. NEW UDC )
-- e non Negativo ( consumo ) non carica nessun magazzino
-- STEP 3: genero ora casi con 2 mag ext che cambiano: metto in TO
INSERT INTO AS400_BatchMovimenti(DataIns, numOp, CodEvento, Particolare, UDC, CodMagAS, Quantita)
SELECT DataOra, numOp, 'UDC_MOV', gm.Particolare, gm.UDC, tsmm.codMagExtTo , gm.QtaTo
FROM GiornaleMagazzino gm INNER JOIN TabSyncMovMag tsmm ON
tsmm.CodCS = @CodCS AND
gm.CodStatoFrom = tsmm.CodStatoFrom AND
gm.CodStatoTo = tsmm.CodStatoTo AND
gm.IdxPosizioneFrom = tsmm.IdxPosizioneFrom AND
gm.IdxPosizioneTo = tsmm.IdxPosizioneTo
WHERE (gm.DataOra >= @lastInsDate)
AND (gm.DataOraProc IS NULL)
AND (tsmm.toExt = 1)
AND (tsmm.codMagExtTo IS NOT NULL AND tsmm.codMagExtFrom IS NOT NULL ) -- le righe con magazzini ext NULLI non sono permessi
AND gm.Particolare <> '' -- particolare deve essere disponibile!!!!
AND (tsmm.codMagExtFrom <> tsmm.codMagExtTo) -- se VARIA MAG ESTERNO...
AND (tsmm.codMagExtTo > 0) -- e mag. destinazione non 0 ( usato se non esiste Mag di arrivo es. DEL UDC )
-- e non Negativo ( consumo ) non carica nessun magazzino
-- STEP 4: cerco prima casi con magazzini ext origine = destinazione e compensazioni
INSERT INTO AS400_BatchMovimenti(DataIns, numOp, CodEvento, Particolare, UDC, CodMagAS, Quantita)
SELECT DataOra, numOp, 'UDC_COMP', gm.Particolare, gm.UDC, tsmm.codMagExtComp, gm.QtaFrom - gm.QtaTo
FROM GiornaleMagazzino gm
INNER JOIN TabSyncMovMag tsmm ON
tsmm.CodCS = @CodCS AND
gm.CodStatoFrom = tsmm.CodStatoFrom AND
gm.CodStatoTo = tsmm.CodStatoTo AND
gm.IdxPosizioneFrom = tsmm.IdxPosizioneFrom AND
gm.IdxPosizioneTo = tsmm.IdxPosizioneTo
WHERE (gm.DataOra >= @lastInsDate)
AND (gm.DataOraProc IS NULL)
AND (tsmm.toExt = 1)
AND gm.Particolare <> '' -- particolare deve essere disponibile!!!!
AND (tsmm.codMagExtTo IS NOT NULL AND tsmm.codMagExtFrom IS NOT NULL ) -- le righe con magazzini ext NULLI non sono permessi
AND (tsmm.codMagExtTo > 0 AND codMagExtFrom > 0 ) -- e magazzini > 0 ( usato quando non esiste Mag )
AND (tsmm.codMagExtComp IS NOT NULL AND tsmm.codMagExtComp <> 0 ) -- HO compensazioni!!!
AND (tsmm.codMagExtFrom = tsmm.codMagExtTo) -- E NON VARIA MAG ESTERNO...
-- ora aggiorno le stesse righe riportate indicando la data ora di processing...
UPDATE gm
SET DataOraProc = GETDATE()
FROM GiornaleMagazzino gm
INNER JOIN AS400_BatchMovimenti abm
ON gm.numOp = abm.numOp
WHERE (gm.DataOra >= @lastInsDate)
AND (gm.DataOraProc IS NULL)
COMMIT TRAN
RETURN
GO
/****** Object: Trigger [dbo].[trg_updMovAS] Script Date: 06/05/2012 19:26:32 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author: Samuele E. Locatelli
-- Create date: 2009-09-20 mod. 2012-03-14
-- Description: trigger x inserimento movimenti
-- nella tab GiornaleMagazzino
-- =============================================
ALTER TRIGGER [dbo].[trg_updMovAS]
ON [dbo].[ElencoCartellini]
AFTER UPDATE
AS
BEGIN
/*******************************************************************************
* Gestione UPDATE ElencoCartellini --> GiornaleMagazzino
*
* regola1: si fanno registrazioni solo se varia ALMENO UNO tra
* - quantità
* - IdxPosizione
* - CodStato
*
* regola 2:
* - Particolare deve essere valorizzato ALMENO a '' (blank)
*
* regola3: in caso di update SIA di quantità che di posizione/stato
* - si genera UN PRIMO RECORD di modifica quantità a posizione e stato FISSI sulla vecchia posizione/Stato
* - si genera UN SECONDO RECORD con variazione posizione/stato
*
*******************************************************************************/
-- setup variabili e verbosità
SET NOCOUNT ON;
DECLARE @dataOra AS DATETIME
SET @dataOra = GETDATE()
-- PRIMO STEP: quantità! ( vedi Note )
IF( UPDATE(Qta) )
BEGIN
INSERT INTO GiornaleMagazzino(OP, DataOra, CodEvento, ModDate, UDC, Particolare, CodStatoFrom, CodStatoTo, IdxPosizioneFrom, IdxPosizioneTo, QtaFrom, QtaTo)
(
SELECT 'U', @dataOra, i.CodEvento, i.ModDate, d.UDC, ISNULL(d.Particolare,''), d.CodStato, d.CodStato, d.IdxPosizione, d.IdxPosizione, d.Qta, i.Qta
FROM inserted AS i
INNER JOIN deleted AS d ON i.UDC = d.UDC
WHERE ( (i.Qta <> d.Qta) )
)
END
-- ora controllo in caso di modifica di stato o posizione
IF(UPDATE(CodStato) OR UPDATE(IdxPosizione))
BEGIN
INSERT INTO GiornaleMagazzino(OP, DataOra, CodEvento, ModDate, UDC, Particolare, CodStatoFrom, CodStatoTo, IdxPosizioneFrom, IdxPosizioneTo, QtaFrom, QtaTo)
(
SELECT 'U', @dataOra, i.CodEvento, i.ModDate, i.UDC, ISNULL(d.Particolare,''), d.CodStato, i.CodStato, d.IdxPosizione, i.IdxPosizione, i.Qta, i.Qta
FROM inserted AS i
INNER JOIN deleted AS d ON i.UDC = d.UDC
WHERE ( ( i.IdxPosizione <> d.IdxPosizione) OR (i.CodStato <> d.CodStato) )
)
END
END
GO