Files
Samuele E. Locatelli 2b1479f315 spostamento update SQL
2018-05-03 15:06:47 +02:00

167 lines
5.3 KiB
Transact-SQL

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