set xact_abort on; go begin transaction; go set ANSI_NULLS on; go /************************************* * STORED PROCEDURE stp_ODL_updateChild * aggiorna le tabelle che dipendono dai dati dell'ODL * * modif.: S.E.L. * il: 2013.03.15 **************************************/ create PROCEDURE stp_ODL_updateChild ( @IdxMacchina NVARCHAR(50), @IdxODL INT, @CodArticoloOld NVARCHAR(50), @DataInizioOld DATETIME, @DataFineOld DATETIME, @CodArticoloNew NVARCHAR(50), @DataInizioNew DATETIME, @DataFineNew DATETIME ) AS BEGIN TRAN /***************************************************************************************************** * AGGIORNO TUTTO! * - DatiConfermati * - DatiMacchine * - DatiProduzione * - DiarioDiBordo * - EventList * - StatoMacchine * - TempiCicloRilevati *****************************************************************************************************/ -- DatiConfermati UPDATE DatiConfermati SET CodArticolo = @CodArticoloNew WHERE CodArticolo = @CodArticoloOld AND ( DataRif >= @DataInizioNew AND DataRif <= ISNULL(@DataFineNew, GETDATE()) ) -- DatiMacchine UPDATE DatiMacchine SET kanban_A = CASE WHEN kanban_A = 'KA'+ @CodArticoloOLD THEN 'KA'+ @CodArticoloNew ELSE kanban_A END ,kanban_B = CASE WHEN kanban_B = 'KA'+ @CodArticoloOLD THEN 'KA'+ @CodArticoloNew ELSE kanban_B END WHERE IdxMacchina = @IdxMacchina -- DatiProduzione UPDATE DatiProduzione SET CodArticolo = @CodArticoloNew ,IdxODL = @IdxODL WHERE IdxMacchina = @IdxMacchina AND ( DataRif >= @DataInizioNew AND DataRif <= ISNULL(@DataFineNew, GETDATE()) ) -- DiarioDiBordo UPDATE DiarioDiBordo SET KanbanCode = @CodArticoloNew ,MatricolaKanban = 'KA'+@CodArticoloNew WHERE IdxMacchina = @IdxMacchina AND ( InizioStato >= @DataInizioNew AND InizioStato <= ISNULL(@DataFineNew, GETDATE()) ) AND KanbanCode = @CodArticoloOld -- EventList UPDATE EventList SET MatricolaKanban = 'KA'+@CodArticoloNew WHERE IdxMacchina = @IdxMacchina AND ( InizioStato >= @DataInizioNew AND InizioStato <= ISNULL(@DataFineNew, GETDATE()) ) AND MatricolaKanban = 'KA'+@CodArticoloOld -- StatoMacchine UPDATE StatoMacchine SET KanbanCode = @CodArticoloNew ,MatricolaKanban = 'KA'+@CodArticoloNew WHERE IdxMacchina = @IdxMacchina AND ( InizioStato >= @DataInizioNew AND InizioStato <= ISNULL(@DataFineNew, GETDATE()) ) AND KanbanCode = @CodArticoloOld -- TempiCicloRilevati UPDATE TempiCicloRilevati SET CodArticolo = @CodArticoloNew WHERE IdxMacchina = @IdxMacchina AND ( DataOraRif >= @DataInizioNew AND DataOraRif <= ISNULL(@DataFineNew, GETDATE()) ) AND CodArticolo = @CodArticoloOld COMMIT TRAN RETURN go commit; go set xact_abort on; go begin transaction; go set ANSI_NULLS on; go /*************************************************** * Trigger trg_ODL_updateMSE * * fa un refresh completo della MSE ad ogni intervento sull'ODL * * modificato: S.E.L. * 2013.03.14 * ***************************************************/ create TRIGGER trg_ODL_updateAllChild ON ODL FOR UPDATE AS -- dichiarazione variabili DECLARE @IdxMacchina NVARCHAR(50) DECLARE @IdxODL INT DECLARE @CodArtOld NVARCHAR(50) DECLARE @CodArtNew NVARCHAR(50) DECLARE @DataInizioOld DATETIME DECLARE @DataInizioNew DATETIME DECLARE @DataFineOld DATETIME DECLARE @DataFineNew DATETIME -- calcolo valori articolo, date validità... SELECT @CodArtOld=CodArticolo, @DataInizioOld=DataInizio, @DataFineOld=DataFine FROM deleted SELECT @IdxODL=IdxODL, @IdxMacchina=IdxMacchina, @CodArtNew=CodArticolo, @DataInizioNew=DataInizio, @DataFineNew=DataFine FROM inserted -- PRIMA REGOLA: proseguo SOLO SE la data inizio è NOT NULL IF(NOT (@DataInizioNew IS NULL)) BEGIN /*************************************************************** * Eseguo SOLO SE: * - faccio un update del kanban e se il mio ODL ha un periodo di validità (inizio non nullo) * - cambia inizio periodo validità * - cambia fine validità (MA NON ERA NULL!!!) ***************************************************************/ IF( ( UPDATE(CodArticolo) AND @CodArtOld<>@CodArtNew ) OR ( UPDATE(DataInizio) AND @DataInizioOld<>@DataInizioNew ) OR ( UPDATE(DataFine) AND @DataFineOld<>@DataFineNew AND NOT (@DataFineOld IS NULL) ) ) BEGIN exec stp_ODL_updateChild @IdxMacchina, @IdxODL, @CodArtOld, @DataInizioOld, @DataFineOld, @CodArtNew, @DataInizioNew, @DataFineNew END END -- eseguo RICALCOLO tabella stato expl EXEC stp_MSE_getData 0 go /*************************************************** * Trigger trg_ODL_updateMSE * * fa un refresh completo della MSE ad ogni insert di ODL * * modificato: S.E.L. * 2013.03.14 * ***************************************************/ alter TRIGGER trg_ODL_updateMSE ON ODL FOR INSERT AS -- eseguo RICALCOLO tabella stato expl EXEC stp_MSE_getData 0 go commit; go set xact_abort on; go begin transaction; go set ANSI_NULLS on; go /************************************* * STORED PROCEDURE stp_ODL_updateChild * aggiorna le tabelle che dipendono dai dati dell'ODL * * modif.: S.E.L. * il: 2013.03.15 **************************************/ alter PROCEDURE stp_ODL_updateChild ( @IdxMacchina NVARCHAR(50), @IdxODL INT, @CodArticoloOld NVARCHAR(50), @DataInizioOld DATETIME, @DataFineOld DATETIME, @CodArticoloNew NVARCHAR(50), @DataInizioNew DATETIME, @DataFineNew DATETIME ) AS BEGIN TRAN /***************************************************************************************************** * AGGIORNO TUTTO! * - DatiConfermati * - DatiMacchine * - DatiProduzione * - DiarioDiBordo * - EventList * - StatoMacchine * - TempiCicloRilevati *****************************************************************************************************/ -- DatiConfermati UPDATE DatiConfermati SET CodArticolo = @CodArticoloNew WHERE CodArticolo = @CodArticoloOld AND ( DataRif >= @DataInizioNew AND DataRif <= ISNULL(@DataFineNew, GETDATE()) ) -- DatiMacchine, SOLO SE è ODL corrente IF(@DataFineNew IS NULL) BEGIN UPDATE DatiMacchine SET kanban_A = CASE WHEN kanban_A = 'KA'+ @CodArticoloOLD THEN 'KA'+ @CodArticoloNew ELSE kanban_A END ,kanban_B = CASE WHEN kanban_B = 'KA'+ @CodArticoloOLD THEN 'KA'+ @CodArticoloNew ELSE kanban_B END WHERE IdxMacchina = @IdxMacchina END -- DatiProduzione UPDATE DatiProduzione SET CodArticolo = @CodArticoloNew ,IdxODL = @IdxODL WHERE IdxMacchina = @IdxMacchina AND ( DataRif >= @DataInizioNew AND DataRif <= ISNULL(@DataFineNew, GETDATE()) ) -- DiarioDiBordo UPDATE DiarioDiBordo SET KanbanCode = @CodArticoloNew ,MatricolaKanban = 'KA'+@CodArticoloNew WHERE IdxMacchina = @IdxMacchina AND ( InizioStato >= @DataInizioNew AND InizioStato <= ISNULL(@DataFineNew, GETDATE()) ) AND KanbanCode = @CodArticoloOld -- EventList UPDATE EventList SET MatricolaKanban = 'KA'+@CodArticoloNew WHERE IdxMacchina = @IdxMacchina AND ( InizioStato >= @DataInizioNew AND InizioStato <= ISNULL(@DataFineNew, GETDATE()) ) AND MatricolaKanban = 'KA'+@CodArticoloOld -- StatoMacchine UPDATE StatoMacchine SET KanbanCode = @CodArticoloNew ,MatricolaKanban = 'KA'+@CodArticoloNew WHERE IdxMacchina = @IdxMacchina AND ( InizioStato >= @DataInizioNew AND InizioStato <= ISNULL(@DataFineNew, GETDATE()) ) AND KanbanCode = @CodArticoloOld -- TempiCicloRilevati UPDATE TempiCicloRilevati SET CodArticolo = @CodArticoloNew WHERE IdxMacchina = @IdxMacchina AND ( DataOraRif >= @DataInizioNew AND DataOraRif <= ISNULL(@DataFineNew, GETDATE()) ) AND CodArticolo = @CodArticoloOld COMMIT TRAN RETURN go commit; go drop trigger trg_ODL_updateMSE; go set xact_abort on; go begin transaction; go set ANSI_NULLS on; go /************************************* * STORED PROCEDURE stp_MSE_getData * tabella stato attuale macchine (da mostrare) * * modif.: S.E.L. - 2013.02.28 **************************************/ alter PROCEDURE stp_MSE_getData ( @maxAgeSec INT -- soglia di "vecchiaia" del dato massima accettabile dopo cui parte ricalcolo, in millisec, se < 1000 ignoro! ) AS -- cerco dato + recente DECLARE @adesso DATETIME = GETDATE() DECLARE @lastUpdate DATETIME SELECT TOP 1 @lastUpdate=ISNULL(lastUpdate, '2000/01/01') FROM MappaStatoExpl ORDER BY lastUpdate DESC SELECT @lastUpdate= ISNULL(@lastUpdate, '2000/01/01') -- solo se sup ai 1000 ms! oppure zero... IF(@maxAgeSec > 1000 OR @maxAgeSec=0) BEGIN -- dato vecchio! aggiorno! IF(DATEDIFF(s,@lastUpdate,@adesso)*1000 > @maxAgeSec) BEGIN -- truncate table precedente TRUNCATE TABLE MappaStatoExpl ;WITH cteODL AS ( SELECT TOP 1 * FROM ODL WHERE IdxODL IN ( SELECT IdxODL FROM ODL WHERE DataFine IS NULL UNION SELECT MAX(IdxODL) FROM ODL GROUP BY IdxMacchina ) ) -- inserisco di nuovo i dati INSERT INTO MappaStatoExpl(lastUpdate, IdxMacchina, CodMacchina, Nome, url, IdxODL, CodArticolo, NumPezzi, TCAssegnato, DataInizioODL) SELECT @adesso, ma.IdxMacchina, ma.CodMacchina, ma.Nome, url, ISNULL(o.IdxODL,0), ISNULL(o.CodArticolo,'-'), ISNULL(o.NumPezzi,0), ISNULL(o.TCAssegnato,0), ISNULL(o.DataInizio,'2000/01/01') FROM Macchine ma LEFT OUTER JOIN cteODL o ON ma.IdxMacchina=o.IdxMacchina WHERE NOT (locazione IS NULL) --AND ( (ISNULL(o.IdxODL,0) = 0) OR ((o.DataFine IS NULL) AND NOT (o.DataInizio IS NULL)) ) ORDER BY ma.locazione -- dichiaro le 2 table variables che userò x caricare i dati di stato DECLARE @tvStato TABLE ( IdxMacchina INT NULL, idxStato INT NULL, DescrizioneStato NVARCHAR(50), Semaforo NVARCHAR(50), Minuti INT NULL ) DECLARE @tvODL TABLE ( IdxODL INT NULL, CodArticolo NVARCHAR(50), DescArticolo NVARCHAR(50), IdxMacchina INT NULL, CodMacchina NVARCHAR(50), Nome NVARCHAR(50), NumPezzi INT NULL, TCAssegnato DECIMAL(18,8), DataInizio DATETIME, DataFine DATETIME ) DECLARE @tvProd TABLE ( IdxMacchina INT NULL, CodArticolo NVARCHAR(50), PezziLanciati INT NULL, PezziProd INT NULL, PezziConf INT NULL, TCAssegnato DECIMAL(18,8), CodOperatore INT NULL, TempoOn DECIMAL(18,8), TempoAuto DECIMAL(18,8), TempoRun DECIMAL(18,8), TCMedio DECIMAL(18,8), TCLav DECIMAL(18,8), TCEff DECIMAL(18,8), TCMedioRT DECIMAL(18,8), TCLavRT DECIMAL(18,8), TCEffRT DECIMAL(18,8) ) DECLARE @numRows INT = 0 DECLARE @currRow INT = 1 DECLARE @IdxMacchina INT = 0 SET @numRows = ISNULL((SELECT COUNT(*) FROM MappaStatoExpl),0) -- carico altri dati con ciclo while WHILE (@currRow <= @numRows) BEGIN -- macchina corrente! SELECT @IdxMacchina = IdxMacchina FROM MappaStatoExpl WHERE RowNum = @currRow -- popolo tab stati INSERT @tvStato(idxStato, Minuti) EXEC stp_repDonati_getLastStatoDurataMacchina @IdxMacchina, 0.1 -- fix dati mancanti UPDATE tvs SET tvs.IdxMacchina = @IdxMacchina ,tvs.Semaforo = s.Semaforo ,tvs.DescrizioneStato = s.Descrizione FROM @tvStato tvs INNER JOIN AnagraficaStati s ON tvs.idxStato=s.IdxStato WHERE tvs.IdxMacchina IS NULL -- popolo tab ODL INSERT @tvODL EXEC stp_ODL_getByMacchina @IdxMacchina -- popolo tab pezzi/tempi INSERT @tvProd(CodArticolo,PezziLanciati,PezziProd,PezziConf,TCAssegnato,CodOperatore,TempoOn,TempoAuto,TempoRun,TCMedio,TCLav,TCEff,TCMedioRT,TCLavRT,TCEffRT ) EXEC stp_repDonati_getDatiProdMacchina @IdxMacchina -- fix dati mancanti UPDATE tvp SET tvp.IdxMacchina = @IdxMacchina FROM @tvProd tvp WHERE tvp.IdxMacchina IS NULL -- aggiorno contatore SET @currRow = @currRow + 1 END -- aggiorno in blocco i valori x stato e pezzi prodotti UPDATE mse SET mse.idxStato = ISNULL(tvs.idxStato,0) ,mse.durata = ISNULL(tvs.Minuti,0) ,mse.Semaforo = ISNULL(tvs.Semaforo,'') ,mse.DescrizioneStato = ISNULL(tvs.DescrizioneStato,'') FROM MappaStatoExpl mse INNER JOIN @tvStato tvs ON mse.IdxMacchina=tvs.IdxMacchina -- aggiorno in blocco i valori x ODL UPDATE mse SET mse.TCAssegnato = ISNULL(tvo.TCAssegnato,0) ,mse.NumPezzi = ISNULL(tvo.NumPezzi,0) ,mse.DataInizioODL = ISNULL(tvo.DataInizio,'2000/01/01') FROM MappaStatoExpl mse INNER JOIN @tvODL tvo ON mse.IdxMacchina=tvo.IdxMacchina -- aggiorno in blocco i valori x produzione UPDATE mse SET mse.PezziProd = ISNULL(tvp.PezziProd,0) ,mse.PezziConf = ISNULL(tvp.PezziConf,0) ,mse.TempoOn = ISNULL(tvp.TempoOn,0) ,mse.TempoAuto = ISNULL(tvp.TempoAuto,0) ,mse.TempoRun = ISNULL(tvp.TempoRun,0) ,mse.TCMedio = ISNULL(tvp.TCMedio,0) ,mse.TCLav = ISNULL(tvp.TCLav,0) ,mse.TCEff = ISNULL(tvp.TCEff,0) ,mse.TCMedioRT = ISNULL(tvp.TCMedioRT,0) ,mse.TCLavRT = ISNULL(tvp.TCLavRT,0) ,mse.TCEffRT = ISNULL(tvp.TCEffRT,0) FROM MappaStatoExpl mse INNER JOIN @tvProd tvp ON mse.IdxMacchina=tvp.IdxMacchina END END -- restituisco la tabella finale SELECT * FROM MappaStatoExpl RETURN go /************************************* * STORED PROCEDURE stp_MSE_refresh * AGGIORNA tabella stato attuale macchine x macchina indicata * * modif.: S.E.L. - 2013.02.28 **************************************/ alter PROCEDURE stp_MSE_refresh ( @IdxMacchina NVARCHAR(50) -- macchina da aggiornare ) AS --init variabili! DECLARE @adesso DATETIME = GETDATE() DECLARE @trovate INT = 0 DECLARE @tvStato TABLE ( idxStato INT NULL, DescrizioneStato NVARCHAR(50), Semaforo NVARCHAR(50), Minuti INT NULL ) DECLARE @tvODL TABLE ( IdxODL INT NULL, CodArticolo NVARCHAR(50), DescArticolo NVARCHAR(50), IdxMacchina INT NULL, CodMacchina NVARCHAR(50), Nome NVARCHAR(50), NumPezzi INT NULL, TCAssegnato DECIMAL(18,8), DataInizio DATETIME, DataFine DATETIME ) DECLARE @tvProd TABLE ( CodArticolo NVARCHAR(50), PezziLanciati INT NULL, PezziProd INT NULL, PezziConf INT NULL, TCAssegnato DECIMAL(18,8), CodOperatore INT NULL, TempoOn DECIMAL(18,8), TempoAuto DECIMAL(18,8), TempoRun DECIMAL(18,8), TCMedio DECIMAL(18,8), TCLav DECIMAL(18,8), TCEff DECIMAL(18,8), TCMedioRT DECIMAL(18,8), TCLavRT DECIMAL(18,8), TCEffRT DECIMAL(18,8) ) BEGIN -- controllo: se c'è riga macchina richiesta... SELECT @trovate=COUNT(*) FROM MappaStatoExpl WHERE IdxMacchina = @IdxMacchina -- se NON c'è la creo... IF(@trovate = 0) BEGIN -- calcolo ODL ;WITH cteODL AS ( SELECT top 1 * FROM ODL WHERE IdxODL IN ( SELECT IdxODL FROM ODL WHERE DataFine IS NULL AND (IdxMacchina = @IdxMacchina) UNION SELECT MAX(IdxODL) FROM ODL WHERE IdxMacchina = @IdxMacchina ) ) -- inserisco i nuovi dati INSERT INTO MappaStatoExpl(lastUpdate, IdxMacchina, CodMacchina, Nome, url, IdxODL, CodArticolo, NumPezzi, TCAssegnato, DataInizioODL) SELECT @adesso, ma.IdxMacchina, ma.CodMacchina, ma.Nome, url, ISNULL(o.IdxODL,0), ISNULL(o.CodArticolo,'-'), ISNULL(o.NumPezzi,0), ISNULL(o.TCAssegnato,0), ISNULL(o.DataInizio,'2000/01/01') FROM Macchine ma LEFT OUTER JOIN cteODL o ON ma.IdxMacchina=o.IdxMacchina WHERE ma.IdxMacchina = @IdxMacchina AND NOT (locazione IS NULL) --AND ( (ISNULL(o.IdxODL,0) = 0) OR ((o.DataFine IS NULL) AND NOT (o.DataInizio IS NULL)) ) ORDER BY ma.locazione END -- popolo tab stati INSERT @tvStato(idxStato, Minuti) EXEC stp_repDonati_getLastStatoDurataMacchina @IdxMacchina, 0.1 -- fix dati mancanti UPDATE tvs SET tvs.Semaforo = s.Semaforo ,tvs.DescrizioneStato = s.Descrizione FROM @tvStato tvs INNER JOIN AnagraficaStati s ON tvs.idxStato=s.IdxStato -- popolo tab ODL INSERT @tvODL EXEC stp_ODL_getByMacchina @IdxMacchina -- popolo tab pezzi/tempi INSERT @tvProd(CodArticolo,PezziLanciati,PezziProd,PezziConf,TCAssegnato,CodOperatore,TempoOn,TempoAuto,TempoRun,TCMedio,TCLav,TCEff,TCMedioRT,TCLavRT,TCEffRT ) EXEC stp_repDonati_getDatiProdMacchina @IdxMacchina -- aggiorno in blocco i valori UPDATE mse SET mse.lastUpdate = @adesso ,mse.idxStato = ISNULL(tvs.idxStato,0) ,mse.durata = ISNULL(tvs.Minuti,0) ,mse.Semaforo = ISNULL(tvs.Semaforo,'') ,mse.DescrizioneStato = ISNULL(tvs.DescrizioneStato,'') ,mse.TCAssegnato = ISNULL(tvo.TCAssegnato,0) ,mse.NumPezzi = ISNULL(tvo.NumPezzi,0) ,mse.DataInizioODL = ISNULL(tvo.DataInizio,'2000/01/01') ,mse.PezziProd = ISNULL(tvp.PezziProd,0) ,mse.PezziConf = ISNULL(tvp.PezziConf,0) ,mse.TempoOn = ISNULL(tvp.TempoOn,0) ,mse.TempoAuto = ISNULL(tvp.TempoAuto,0) ,mse.TempoRun = ISNULL(tvp.TempoRun,0) ,mse.TCMedio = ISNULL(tvp.TCMedio,0) ,mse.TCLav = ISNULL(tvp.TCLav,0) ,mse.TCEff = ISNULL(tvp.TCEff,0) ,mse.TCMedioRT = ISNULL(tvp.TCMedioRT,0) ,mse.TCLavRT = ISNULL(tvp.TCLavRT,0) ,mse.TCEffRT = ISNULL(tvp.TCEffRT,0) FROM MappaStatoExpl mse CROSS JOIN @tvStato tvs CROSS JOIN @tvODL tvo CROSS JOIN @tvProd tvp WHERE mse.Idxmacchina = @IdxMacchina END RETURN go commit; go -- registro versione... INSERT INTO [dbo].[LogUpdateDb] ([Versione],[Data]) VALUES(380, GETDATE()) GO SELECT TOP 10 * FROM LogUpdateDb ORDER BY Versione DESC GO