﻿set xact_abort on
go

begin transaction
go

drop table TempiCicloRilevati
go

create table TempiCicloRilevati(
  IdxMacchina nvarchar(50)  not null,
  CodArticolo nvarchar(50)  not null,
  DataOraRif  datetime      not null,
  TCMedio     decimal(18,8) not null constraint DF_TempiCicloRilevati_TempoMedio default (1),
  PzProd      int           not null constraint DF_TempiCicloRilevati_PzProd default (1),

  constraint PK_TempiCicloRilevati primary key(IdxMacchina,CodArticolo,DataOraRif)
)
go

alter table TempiCicloRilevati add
  constraint FK_TempiCicloRilevati_Macchine foreign key(IdxMacchina) references Macchine(IdxMacchina) on update cascade
go

drop table TempiCicloTeorici
go

create table TempiCicloTeorici(
  IdxMacchina nvarchar(50)  not null,
  CodArticolo nvarchar(50)  not null,
  DataOraFrom datetime      not null,
  DataOraTo   datetime,
  TCAssegnato decimal(18,8) not null constraint DF_TempiCicloTeorici_TempoMedio default (1),

  constraint PK_TempiCicloTeorici primary key(IdxMacchina,CodArticolo,DataOraFrom)
)
go

alter table TempiCicloTeorici add
  constraint FK_TempiCicloTeorici_Macchine foreign key(IdxMacchina) references Macchine(IdxMacchina) on update cascade
go

commit
go


set xact_abort on
go

begin transaction
go

INSERT INTO dbo.AnagraficaEventi
  VALUES (20, N'Contapezzi')
go

commit transaction
go


set xact_abort on
go

begin transaction
go

alter table Kanban add
  CodArticolo nvarchar(50)
go

set ANSI_NULLS on
go


commit
go


set xact_abort on
go

begin transaction
go

alter table AnagraficaEventi add
  TabAzione nvarchar(50) constraint DF_AnagraficaEventi_TabAzione default (''),
  Azione nvarchar(50) constraint DF_AnagraficaEventi_Azione default ('')
go

update AnagraficaEventi set TabAzione='',Azione=''
go

set ANSI_NULLS on
go

create TRIGGER trg_doActions
ON EventList
FOR INSERT
AS

	/* dichiarazione variabili */
	DECLARE @IdxTipo INT
	DECLARE @TabAzione NVARCHAR(50)
	DECLARE @Azione NVARCHAR(50)
	DECLARE @IdxMacchina NVARCHAR(50)
	DECLARE @MatricolaKanban NVARCHAR(50)
	DECLARE @CodArticolo NVARCHAR(50)
	DECLARE @TCMedio DECIMAL(18,8)
	DECLARE @DataOra DATETIME
	DECLARE @DataOraPrec DATETIME
	

	/* recupero valori dell'INSERT */
	SET @IdxTipo		= ( SELECT i.IdxTipo FROM inserted i )
	SET @IdxMacchina	= ( SELECT i.IdxMacchina FROM inserted i )
	/* recupero altri valori */
	SET @TabAzione	= ( SELECT ISNULL(TabAzione,'') FROM AnagraficaEventi WHERE IdxTipo = @IdxTipo )
	SET @Azione		= ( SELECT ISNULL(Azione,'') FROM AnagraficaEventi WHERE IdxTipo = @IdxTipo )
	/* controllo se l'evento richieda azioni successive */
	IF(@TabAzione <> '' AND @Azione <> '')
		BEGIN
			/* azioni richieste: seconda dei casi eseguo... */		
			IF(@TabAzione = 'TempiCicloRilevati' AND @Azione = 'Insert')
				BEGIN
					/* calcolo valori */
					SET @DataOra			= ( SELECT i.InizioStato FROM inserted i )
					SET @MatricolaKanban	= ( SELECT i.MatricolaKanban FROM inserted i )
					SET @CodArticolo		= ( SELECT CodArticolo FROM Kanban WHERE MatricolaKanban = @MatricolaKanban )
					/* calcolo tempo tra gli ultimi 2 eventi "contapezzi" */
					SET @DataOraPrec		= ( SELECT ISNULL((SELECT Top 1 InizioStato FROM EventList WHERE IdxMacchina = @IdxMacchina AND IdxTipo = @IdxTipo AND InizioStato < @DataOra ORDER BY InizioStato DESC), @DataOra ) )
					/* è in millisecondi, divido per 60'000.00 x avere minuti centesimali*/
					SET @TCMedio			= ( SELECT (DATEDIFF(ms, @DataOraPrec, @DataOra) / 60000.00 ) )
					/* inserisco riga di tempo ciclo */
					INSERT INTO TempiCicloRilevati
						VALUES(@IdxMacchina, @CodArticolo, @DataOra, @TCMedio, 1)
				END
		END
go

commit
go

set xact_abort on
go

begin transaction
go

UPDATE dbo.AnagraficaEventi SET 
  TabAzione=N'TempiCicloRilevati', Azione=N'Insert'
  WHERE IdxTipo=20
go

commit transaction
go


set xact_abort on
go

begin transaction
go

set ANSI_NULLS on
go

alter TRIGGER trg_doActions
ON EventList
FOR INSERT
AS

	/* dichiarazione variabili */
	DECLARE @IdxTipo INT
	DECLARE @TabAzione NVARCHAR(50)
	DECLARE @Azione NVARCHAR(50)
	DECLARE @IdxMacchina NVARCHAR(50)
	DECLARE @MatricolaKanban NVARCHAR(50)
	DECLARE @CodArticolo NVARCHAR(50)
	DECLARE @TCMedio DECIMAL(18,8)
	DECLARE @DataOra DATETIME
	DECLARE @DataOraPrec DATETIME
	DECLARE @NumPz INT
	

	/* recupero valori dell'INSERT */
	SET @IdxTipo		= ( SELECT i.IdxTipo FROM inserted i )
	SET @IdxMacchina	= ( SELECT i.IdxMacchina FROM inserted i )
	/* recupero altri valori */
	SET @TabAzione	= ( SELECT ISNULL(TabAzione,'') FROM AnagraficaEventi WHERE IdxTipo = @IdxTipo )
	SET @Azione		= ( SELECT ISNULL(Azione,'') FROM AnagraficaEventi WHERE IdxTipo = @IdxTipo )
	/* controllo se l'evento richieda azioni successive */
	IF(@TabAzione <> '' AND @Azione <> '')
		BEGIN
			/* azioni richieste: seconda dei casi eseguo... */		
			IF(@TabAzione = 'TempiCicloRilevati' AND @Azione = 'Insert')
				BEGIN
					/* calcolo valori */
					SET @DataOra			= ( SELECT i.InizioStato FROM inserted i )
					SET @MatricolaKanban	= ( SELECT i.MatricolaKanban FROM inserted i )
					SET @NumPz				= ( SELECT CASE WHEN (ISNUMERIC(value)=1) THEN value ELSE 1 END FROM inserted i )
					SET @CodArticolo		= ( SELECT CodArticolo FROM Kanban WHERE MatricolaKanban = @MatricolaKanban )
					/* calcolo tempo tra gli ultimi 2 eventi "contapezzi" */
					SET @DataOraPrec		= ( SELECT ISNULL((SELECT Top 1 InizioStato FROM EventList WHERE IdxMacchina = @IdxMacchina AND IdxTipo = @IdxTipo AND InizioStato < @DataOra ORDER BY InizioStato DESC), @DataOra ) )
					/* è in millisecondi, divido per 60'000.00 x avere minuti centesimali*/
					SET @TCMedio			= ( SELECT (DATEDIFF(ms, @DataOraPrec, @DataOra) / 60000.00 ) )
					/* inserisco riga di tempo ciclo */
					INSERT INTO TempiCicloRilevati
						VALUES(@IdxMacchina, @CodArticolo, @DataOra, @TCMedio, @NumPz)
				END
		END
go

commit
go


set xact_abort on
go

begin transaction
go

set ANSI_NULLS on
go

/*************************************
* STORED PROCEDURE stp_TC_getByMacchinaPeriodo
* 	recupera tempi ciclo x machcian e periodo
*
* modif.:	S.E.L. - 2010.12.15
**************************************/
create PROCEDURE stp_TC_getByMacchinaPeriodo
(
	@IdxMacchina NVARCHAR(50),
	@Inizio DATETIME,
	@Fine DATETIME
)
AS

SELECT	* FROM TempiCicloRilevati
WHERE	IdxMacchina = @IdxMacchina AND
		(DataOraRif >= @Inizio) AND (DataOraRif <= @Fine) 

RETURN
go

commit
go







-- registro versione...
INSERT INTO [dbo].[LogUpdateDb] ([Versione],[Data]) VALUES(25, GETDATE())
GO