set xact_abort on; go begin transaction; go alter table DatiMacchine add insEnabled bit constraint DF_DatiMacchine_insEnabled default ((1)); go exec sp_addextendedproperty 'MS_Description', 'definisce se l''INSERT sia abilitato per la macchina (disabilitato in fase di ricostruzione batch...)', 'SCHEMA', 'dbo', 'TABLE', 'DatiMacchine', 'COLUMN', 'insEnabled'; go update DatiMacchine set insEnabled=((1)); go set ANSI_NULLS on; go /************************************* * STORED PROCEDURE InsStatoBatch * inserimento di uno stato nel db (tab DiarioDiBordo) * inerimento in anagrafica a "nd" dell'operatore se matricola mancasse * * modif.: S.E.L. * il: 2008.08.07 **************************************/ alter PROCEDURE stp_DDB_InsStatoBatch ( @IdxMacchina varchar(50), @InizioStato datetime, @IdxStato int, @MatricolaKanban varchar(50), @Value varchar(50), @MatrOpr int, @pallet varchar(20) ) AS /************************************* * verifico se esista operatore **************************************/ DECLARE @matrOut INT = @MatrOpr + 1 SELECT @matrOut = ISNULL ( ( SELECT MatrOpr FROM AnagraficaOperatori WHERE (MatrOpr = @MatrOpr) ),-999999 ) IF (@matrOut <> @MatrOpr ) -- significa che la matricola NON C'E'... BEGIN /* inserisco nuovo record */ INSERT INTO AnagraficaOperatori(MatrOpr, Cognome, Nome) VALUES (@MatrOpr,'nd (cognome)','nd (nome)') END -- controllo se input abilitato DECLARE @insEnabled BIT SET @insEnabled = ( SELECT insEnabled FROM DatiMacchine WHERE IdxMacchina = @IdxMacchina ) -- inserisco SOLO SE è abilitato input x quella macchina IF(@insEnabled = 1) BEGIN /* inserisco valori */ INSERT INTO DiarioDiBordo (IdxMacchina, InizioStato, FineStato, IdxStato, MatricolaKanban, Value, MatrOpr, pallet) VALUES (@IdxMacchina, @InizioStato, NULL, @IdxStato, @MatricolaKanban, @Value, @MatrOpr, @pallet) END RETURN go /************************************* * STORED PROCEDURE InsStato * inserimento di uno stato nel db (tab DiarioDiBordo) * inerimento in anagrafica a "nd" dell'operatore se matricola mancasse * * modif.: S.E.L. * il: 2008.08.07 **************************************/ alter PROCEDURE stp_DDB_InsStato ( @IdxMacchina NVARCHAR(50), @IdxStato INT, @MatricolaKanban NVARCHAR(50), @Value NVARCHAR(50), @MatrOpr INT, @pallet NVARCHAR(20) ) AS /************************************* * verifico se esista operatore **************************************/ DECLARE @matrOut INT = @MatrOpr + 1 SELECT @matrOut = ISNULL ( ( SELECT MatrOpr FROM AnagraficaOperatori WHERE (MatrOpr = @MatrOpr) ),-999999 ) IF (@matrOut <> @MatrOpr ) -- significa che la matricola NON C'E'... BEGIN /* inserisco nuovo record */ INSERT INTO AnagraficaOperatori(MatrOpr, Cognome, Nome) VALUES (@MatrOpr,'nd (cognome)','nd (nome)') END -- controllo se input abilitato DECLARE @insEnabled BIT SET @insEnabled = ( SELECT insEnabled FROM DatiMacchine WHERE IdxMacchina = @IdxMacchina ) -- inserisco SOLO SE è abilitato input x quella macchina IF(@insEnabled = 1) BEGIN /* inserisco valori */ INSERT INTO DiarioDiBordo (IdxMacchina, InizioStato, FineStato, IdxStato, MatricolaKanban, Value, MatrOpr, pallet) VALUES (@IdxMacchina, GETDATE(), NULL, @IdxStato, @MatricolaKanban, @Value, @MatrOpr, @pallet) END RETURN go -- ================================================ -- Author: Samuele E. Locatelli -- Create date: 2012.11.23 -- -- Description: rigenerazioen del diario di bordo -- a partire da macchina eventi/stati + EventList -- ================================================ create PROCEDURE stp_ZZZ_rigeneraDDB ( @idxStatoStart INT = 1, @idxMacchina NVARCHAR(50), @inizio DATETIME, @fine DATETIME ) AS DBCC SHOWCONTIG(EventList) DBCC SHOWCONTIG(DiarioDiBordo) EXEC USP_DisableEnableNonClusteredIndexes 'MoonPro',null, 1 --disabilito indici -- svuoto dati che vado a sostituire PRINT 'svuoto DiarioDiBordo per periodo indicato...' EXEC stp_DDB_deleteMacchinaPeriodo @idxMacchina, @inizio, @fine PRINT 'svuoto TempiCicloRilevati per periodo indicato...' DELETE FROM TempiCicloRilevati WHERE idxMacchina = @idxMacchina AND DataOraRif BETWEEN @inizio AND @fine PRINT 'processo EventList per periodo indicato...' DECLARE @InizioStato DATETIME DECLARE @IdxTipo INT DECLARE @MatricolaKanban NVARCHAR(50) DECLARE @Value NVARCHAR(50) DECLARE @MatrOpr INT DECLARE @pallet NVARCHAR(20) DECLARE @nextIdxStato INT DECLARE @currIdxStato INT DECLARE @IdxFamiglia INT -- calcolo famiglia macchina! SET @IdxFamiglia = ( SELECT IdxFamiglia FROM Macchine2FamiglieMacchine WHERE idxMacchina = @idxMacchina ) -- ipotizzo macchina inizialmente in stato richiesto (default: 1 = pronta) e quindi imposto stato current a quello iniziale richiesto... SET @currIdxStato = @idxStatoStart -- DISATTIVO inserimento in DiarioDiBordo per la macchina indicata UPDATE DatiMacchine SET insEnabled = 0 WHERE IdxMacchina = @IdxMacchina -- leggo la tabella degli eventi con cursore x percorrere i dati... DECLARE event2proc CURSOR FOR SELECT InizioStato, IdxTipo, MatricolaKanban, Value, MatrOpr, pallet FROM EventList WHERE IdxMacchina = @idxMacchina AND InizioStato BETWEEN @inizio AND @fine ORDER BY InizioStato; OPEN event2proc; FETCH NEXT FROM event2proc INTO @InizioStato, @IdxTipo, @MatricolaKanban, @Value, @MatrOpr, @pallet; WHILE @@FETCH_STATUS = 0 BEGIN -- calcolo l'eventuale NUOVO idxStato SET @nextIdxStato = ( SELECT ISNULL( (SELECT next_IdxStato FROM TransizioneStati WHERE IdxFamiglia = @IdxFamiglia AND IdxStato = @currIdxStato AND IdxTipo = @IdxTipo ), @currIdxStato) ) -- SE lo stato cambia registro nel DiarioDiBordo! IF(@nextIdxStato <> @currIdxStato) BEGIN -- inserisco in DiarioDiBordo INSERT INTO DiarioDiBordo (IdxMacchina, InizioStato, FineStato, IdxStato, MatricolaKanban, Value, MatrOpr, pallet) VALUES (@IdxMacchina, @InizioStato, NULL, @nextIdxStato, @MatricolaKanban, @Value, @MatrOpr, @pallet) -- infine imposto il nuovo stato current... SET @currIdxStato = @nextIdxStato END -- Get the next values FETCH NEXT FROM event2proc INTO @InizioStato, @IdxTipo, @MatricolaKanban, @Value, @MatrOpr, @pallet; END CLOSE event2proc; DEALLOCATE event2proc; -- RI-ATTIVO inserimento in DiarioDiBordo per la macchina indicata UPDATE DatiMacchine SET insEnabled = 1 WHERE IdxMacchina = @IdxMacchina PRINT 'concluso UPDATE tabelle...' DBCC SHOWCONTIG(EventList) DBCC SHOWCONTIG(DiarioDiBordo) EXEC USP_DisableEnableNonClusteredIndexes 'MoonPro',null, 2 --riattivo indici --ricostruisco indici PRINT 'ricostruisco indici...' DBCC DBREINDEX(EventList) DBCC DBREINDEX(DiarioDiBordo) DBCC DBREINDEX(TransizioneIngressi) DBCC DBREINDEX(Kanban2ins) DBCC DBREINDEX(Kanban) DBCC DBREINDEX(AnagraficaOperatori) DBCC DBREINDEX(AnagraficaOperatori2ins) DBCC SHOWCONTIG(EventList) DBCC SHOWCONTIG(DiarioDiBordo) /* --shrink del db PRINT 'compatto DB...' DBCC SHRINKDATABASE (MoonPro) */ RETURN go commit; go set xact_abort on; go begin transaction; go set ANSI_NULLS on; go /************************************* * STORED PROCEDURE stp_TS_getByIdxMacchIdxTipoEv * restituisce una riga transizione stati/eventi data macchina ed evento (confrontando lo stato attuale della macchina) * * modif.: S.E.L. - 2012.11.23 **************************************/ create PROCEDURE stp_TS_getByIdxMacchIdxTipoEv ( @IdxMacchina NVARCHAR(50), @IdxTipo INT ) AS SELECT TransizioneStati.IdxFamiglia, TransizioneStati.IdxStato, TransizioneStati.IdxTipo, TransizioneStati.next_IdxStato FROM TransizioneStati INNER JOIN Macchine2FamiglieMacchine ON TransizioneStati.IdxFamiglia = Macchine2FamiglieMacchine.IdxFamiglia INNER JOIN Macchine ON Macchine2FamiglieMacchine.IdxMacchina = Macchine.IdxMacchina INNER JOIN StatoMacchine ON Macchine.IdxMacchina = StatoMacchine.IdxMacchina AND TransizioneStati.IdxStato = StatoMacchine.IdxStato WHERE (Macchine.IdxMacchina = @IdxMacchina) AND (TransizioneStati.IdxTipo = @IdxTipo) AND (TransizioneStati.IdxFamiglia <> 1) RETURN go commit; go set xact_abort on; go begin transaction; go set ANSI_NULLS on; go /*************************************************** * Trigger trg_EV_filtroIns * * filtro operazioni scrittura su tab EventList: * - scrive un NUOVO recordo SOLO SE la chiave differisce per almeno 2 valori * * modificato: S.E.L. * 2012.11.26 * ***************************************************/ create TRIGGER trg_EV_filtroIns ON EventList INSTEAD OF INSERT AS IF (@@ROWCOUNT = 1) BEGIN DECLARE @IdxMacchina AS NVARCHAR(50) DECLARE @InizioStato AS DATETIME DECLARE @IdxTipo AS INT DECLARE @numMin AS INT=4 DECLARE @trovati AS INT=0 SELECT @IdxMacchina=IdxMacchina, @InizioStato=InizioStato, @IdxTipo=IdxTipo FROM INSERTED ;WITH myCTE AS ( SELECT TOP(@numMin) ev.* FROM EventList ev INNER JOIN INSERTED i ON ev.IdxMacchina=i.IdxMacchina ORDER BY InizioStato DESC ) SELECT @trovati=COUNT(IdxTipo) FROM myCTE WHERE idxTipo = @IdxTipo -- se tutte le righe sono con stesso tipo... IF(@trovati < @numMin) BEGIN INSERT INTO EventList SELECT * FROM INSERTED END END go alter table EventList disable trigger trg_doActions; go commit; go -- registro versione... INSERT INTO [dbo].[LogUpdateDb] ([Versione],[Data]) VALUES(353, GETDATE()) GO SELECT TOP 10 * FROM LogUpdateDb ORDER BY Versione DESC GO