create table LogUpdateDb( Versione int not null constraint PK_LogUpdateDb primary key, Data datetime ) go set xact_abort on go begin transaction go alter table AnagraficaStati add Priorita int go exec sp_addextendedproperty 'MS_Description', 'livello di precedenza (il minore precede e sovrascrive i livelli successivi)', 'SCHEMA', 'dbo', 'TABLE', 'AnagraficaStati', 'COLUMN', 'Priorita' go set ANSI_NULLS on go alter TRIGGER UpdDiarioDiBordo ON DiarioDiBordo FOR INSERT AS /* dichiaro variabili */ DECLARE @IdxMacchina NVARCHAR(50) DECLARE @InizioStato DATETIME DECLARE @soloMinuti FLOAT DECLARE @IdxStatoOld INT DECLARE @IdxStatoNew INT DECLARE @semaforoOld VARCHAR(50) DECLARE @semaforoNew VARCHAR(50) DECLARE @prioritaOld INT DECLARE @prioritaNew INT /* recupero valori x inserting */ SET @IdxMacchina = ( SELECT i.IdxMacchina FROM inserted i ) SET @InizioStato = ( SELECT i.InizioStato FROM inserted i ) SET @soloMinuti = ( SELECT DATEDIFF(n, InizioStato, @InizioStato) FROM DiarioDiBordo WHERE (FineStato IS NULL) AND (IdxMacchina = @IdxMacchina) AND (InizioStato <>@InizioStato) ) /* recupero dati x stati e semafori/priorità x eventuale update a ritroso dello stato */ SET @IdxStatoOld = ( SELECT IdxStato FROM DiarioDiBordo WHERE (FineStato IS NULL) AND (IdxMacchina = @IdxMacchina) AND (InizioStato <>@InizioStato) ) SET @IdxStatoNew = ( SELECT i.IdxStato FROM inserted i ) /* ------------------------------------------------------------------------------------------------------------ */ /* CONTROLLO SE NECESSARIO AGGIORNARE STATO PRECEDENTE guardando le famiglie "semaforiche" e la priorità dello stato vecchio e nuovo*/ /* faccio i controlli SOLO se lo stato è cambiato da vecchio a nuovo */ IF (@IdxStatoOld <> @IdxStatoNew) BEGIN SET @semaforoOld = ( SELECT Semaforo FROM AnagraficaStati WHERE IdxStato = @IdxStatoOld ) SET @semaforoNew = ( SELECT Semaforo FROM AnagraficaStati WHERE IdxStato = @IdxStatoNew ) /* questo controllo ed eventuale update lo faccio SOLO se i semafori corrispondono (stessa "famiglia" */ IF (@semaforoOld = @semaforoNew) BEGIN SET @prioritaOld = ( SELECT Priorita FROM AnagraficaStati WHERE IdxStato = @IdxStatoOld ) SET @prioritaNew = ( SELECT Priorita FROM AnagraficaStati WHERE IdxStato = @IdxStatoNew ) /* controlo se la priorità nuova sia + bassa della precedente e nel caso sovrascrivo */ IF (@prioritaNew < @prioritaOld) BEGIN /* in questo caso imposto lo stato precedente come quello nuovo */ UPDATE DiarioDiBordo SET IdxStato = @IdxStatoNew WHERE (FineStato IS NULL) AND (IdxMacchina = @IdxMacchina) AND (InizioStato <> @InizioStato) END END END /* ------------------------------------------------------------------------------------------------------------ */ /* Chiudo lo stato precedente */ UPDATE DiarioDiBordo SET FineStato = @InizioStato, DurataMinuti = @soloMinuti + CAST((DATEDIFF(ms, DATEADD(n,@soloMinuti,InizioStato), @InizioStato)) AS FLOAT)/60000 WHERE (FineStato IS NULL) AND (IdxMacchina = @IdxMacchina) AND (InizioStato <> @InizioStato) /* Aggiorno tabella stato corrente della macchina */ DELETE FROM StatoMacchine WHERE IdxMacchina = @IdxMacchina INSERT INTO StatoMacchine(IdxMacchina, IdxStato, InizioStato, Value, MatricolaKanban, KanbanCode, TempoCicloBase, PzPalletProd) SELECT IdxMacchina, IdxStato, InizioStato, Value, MatricolaKanban, KanbanCode, TempoCicloBase, PzPalletProd FROM inserted /* aggiorno dati kanban DiarioDiBordo... */ UPDATE DiarioDiBordo SET KanbanCode = k.KanbanCode, TempoCicloBase = k.TempoCicloBase, PzPalletProd = k.PzPallet FROM Kanban AS k INNER JOIN DiarioDiBordo ON k.MatricolaKanban = DiarioDiBordo.MatricolaKanban WHERE (DiarioDiBordo.TempoCicloBase IS NULL) /* aggiorno dati kanban statoMacchine... */ UPDATE StatoMacchine SET KanbanCode = k.KanbanCode, TempoCicloBase = k.TempoCicloBase, PzPalletProd = k.PzPallet FROM Kanban AS k INNER JOIN StatoMacchine ON k.MatricolaKanban = StatoMacchine.MatricolaKanban WHERE (StatoMacchine.TempoCicloBase IS NULL) go commit go set xact_abort on go begin transaction go UPDATE dbo.AnagraficaStati SET Priorita=1 WHERE IdxStato=1 UPDATE dbo.AnagraficaStati SET Priorita=1 WHERE IdxStato=2 UPDATE dbo.AnagraficaStati SET Priorita=1 WHERE IdxStato=3 UPDATE dbo.AnagraficaStati SET Priorita=1 WHERE IdxStato=4 UPDATE dbo.AnagraficaStati SET Priorita=3 WHERE IdxStato=5 UPDATE dbo.AnagraficaStati SET Priorita=1 WHERE IdxStato=6 UPDATE dbo.AnagraficaStati SET Priorita=1 WHERE IdxStato=7 UPDATE dbo.AnagraficaStati SET Priorita=1 WHERE IdxStato=8 UPDATE dbo.AnagraficaStati SET Priorita=1 WHERE IdxStato=9 UPDATE dbo.AnagraficaStati SET Priorita=1 WHERE IdxStato=10 UPDATE dbo.AnagraficaStati SET Priorita=1 WHERE IdxStato=11 UPDATE dbo.AnagraficaStati SET Priorita=4 WHERE IdxStato=12 UPDATE dbo.AnagraficaStati SET Priorita=1 WHERE IdxStato=13 UPDATE dbo.AnagraficaStati SET Priorita=1 WHERE IdxStato=14 UPDATE dbo.AnagraficaStati SET Priorita=5 WHERE IdxStato=15 go commit transaction go -- registro versione... INSERT INTO [dbo].[LogUpdateDb] ([Versione],[Data]) VALUES(10, GETDATE()) GO