﻿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