﻿-- schema
create schema man authorization dbo
go

-- stored x trigger...
set xact_abort on
go

begin transaction
go

set ANSI_NULLS on
go

/*************************************
* STORED PROCEDURE stp_EL_processaEvento
* 	Processa un singolo evento
*
*   Note : richiamata anche nel trigger della tabella EventList
*
* modif.:	
**************************************/
create PROCEDURE stp_EL_processaEvento
(
	@IdxTipo INT,
	@IdxMacchina NVARCHAR(50),
	@MatricolaKanban NVARCHAR(50),
	@DataOra DATETIME,
	@NumPz INT,
    @FlgAggStato CHAR(1) = 'Y'     -- Y/N = elabora o meno aggiornamento StatiMacchine e DatiMacchine
)
AS

    ---- parametri x test
    --DECLARE @IdxTipo INT = 0
    --DECLARE @IdxMacchina NVARCHAR(50)
    --DECLARE @DataOra DATETIME
    --DECLARE @MatricolaKanban NVARCHAR(50)
    --DECLARE @TCMedio DECIMAL(18,8)
    --DECLARE @NumPz INT

	--SET @IdxTipo          = ( SELECT i.IdxTipo FROM inserted i )
	--SET @IdxMacchina      = ( SELECT i.IdxMacchina FROM inserted i )
	--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 )

    -- INIZIO DICHIARAZIONI
	DECLARE @TabAzione NVARCHAR(50)   = '';
	DECLARE @Azione NVARCHAR(50)      = '';
	DECLARE @CodArticolo NVARCHAR(50) = ''
	DECLARE @MatricolaKanbanOk NVARCHAR(50);
	DECLARE @DataOraPrec DATETIME;
    DECLARE @TCMedio DECIMAL(18,8) = 0;

	/* recupero altri valori ( se non trova record lascia il valore invariato cioè = '' )*/
    SELECT  @TabAzione = ISNULL(TabAzione,'') 
          , @Azione    = ISNULL(Azione,'') 
    FROM AnagraficaEventi WHERE IdxTipo = @IdxTipo

    --SELECT @TabAzione , @Azione

	IF (@TabAzione <> '' AND @Azione <> '')
		BEGIN
			/* azioni richieste: seconda dei casi eseguo... */
			
			/******************************************
			*
			* Calcolo tempo ciclo per INIZIO
			*
			******************************************/		
			IF(@TabAzione = 'TempiCicloRilevati' AND @Azione = 'Insert')
				BEGIN
                    -- recupero codice articolo
					SET @CodArticolo    = ( SELECT CodArticolo FROM Kanban WHERE MatricolaKanban = @MatricolaKanban )
					/* calcolo tempo tra gli ultimi 2 eventi "contapezzi" */
					SET @DataOraPrec    = ISNULL((SELECT Top 1 InizioStato FROM EventList WHERE IdxMacchina = @IdxMacchina AND IdxTipo = @IdxTipo AND InizioStato < @DataOra ORDER BY InizioStato DESC), @DataOra )

					-- se è oltre 10 gg calcolo in secondi... 2013.8.30
					IF (DATEDIFF(DD, @DataOraPrec, @DataOra) > 10)
							SET @TCMedio    = ( SELECT (DATEDIFF(s, @DataOraPrec, @DataOra) / 60.00 ) ) --calcolo in secondi
					ELSE
							SET @TCMedio    = ( SELECT (DATEDIFF(ms, @DataOraPrec, @DataOra) / 60000.00 ) )

					/* inserisco riga di tempo ciclo */
					INSERT INTO TempiCicloRilevati
						VALUES(@IdxMacchina, @CodArticolo, @DataOra, @TCMedio, @NumPz)
				END
			/******************************************
			*
			* Calcolo tempo ciclo con logica stop/start
			*
			******************************************/
			ELSE IF(@TabAzione = 'TempiCicloRilevati' AND @Azione = 'Stop2StartCiclo')
				BEGIN				
					/* prendo la matricola dall'evento inizio (precedente) */
					SET @MatricolaKanbanOk	= ISNULL((SELECT Top 1 MatricolaKanban FROM EventList WHERE IdxMacchina = @IdxMacchina AND IdxTipo = @IdxTipo - 1 AND InizioStato < @DataOra ORDER BY InizioStato DESC), @MatricolaKanban )
					
					-- calcolare num pezzi da codice...
					SET @CodArticolo = ( SELECT CodArticolo FROM Kanban WHERE MatricolaKanban = @MatricolaKanbanOk )
					/* calcolo tempo tra eventi "contapezzi" inizio - fine NB: idxEvento per fine è idxEvento inizio + 1 ... HARD CODED!!! */
					SET @DataOraPrec = ISNULL((SELECT Top 1 InizioStato FROM EventList WHERE IdxMacchina = @IdxMacchina AND IdxTipo = @IdxTipo - 1 AND InizioStato < @DataOra ORDER BY InizioStato DESC), @DataOra )

					-- se è oltre 10 gg calcolo in secondi... 2013.8.30
					IF (DATEDIFF(DD, @DataOraPrec, @DataOra) > 10)
							SET @TCMedio = ( DATEDIFF(s, @DataOraPrec, @DataOra) / 60.00 ) --calcolo in secondi
					ELSE
							SET @TCMedio = ( DATEDIFF(ms, @DataOraPrec, @DataOra) / 60000.00 )

					/* inserisco riga di tempo ciclo */
					INSERT INTO TempiCicloRilevati
						VALUES(@IdxMacchina, @CodArticolo, @DataOra, @TCMedio, @NumPz)
				END
			/******************************************
			*
			* calcolo tempo ciclo con logica stop/stop
			*
			******************************************/
			ELSE IF(@TabAzione = 'TempiCicloRilevati' AND @Azione = 'Stop2StopCiclo')
				BEGIN				
					/* prendo la matricola dall'evento inizio (precedente) */
					SET @MatricolaKanbanOk	= ISNULL((SELECT Top 1 MatricolaKanban FROM EventList WHERE IdxMacchina = @IdxMacchina AND IdxTipo = @IdxTipo AND InizioStato < @DataOra ORDER BY InizioStato DESC), @MatricolaKanban )
					
					-- calcolare num pezzi da codice...
					SET @NumPz          = ( SELECT PzPallet FROM Kanban WHERE MatricolaKanban = @MatricolaKanbanOk )
					SET @CodArticolo    = ( SELECT CodArticolo FROM Kanban WHERE MatricolaKanban = @MatricolaKanbanOk )
					/* calcolo tempo tra eventi "contapezzi" fine - fine NB: idxEvento per fine è idxEvento inizio + 1 ... HARD CODED!!! */
					SET @DataOraPrec    = ISNULL( (SELECT Top 1 InizioStato FROM EventList WHERE IdxMacchina = @IdxMacchina AND IdxTipo = @IdxTipo AND InizioStato < @DataOra ORDER BY InizioStato DESC), @DataOra )

					-- se è oltre 10 gg calcolo in secondi... 2013.8.30
					IF (DATEDIFF(DD, @DataOraPrec, @DataOra) > 10)
							SET @TCMedio = ( DATEDIFF(s, @DataOraPrec, @DataOra) / 60.00 ) --calcolo in secondi
					ELSE
							SET @TCMedio = ( DATEDIFF(ms, @DataOraPrec, @DataOra) / 60000.00 )

					/* inserisco riga di tempo ciclo */
					    INSERT INTO TempiCicloRilevati
						    VALUES(@IdxMacchina, @CodArticolo, @DataOra, @TCMedio, @NumPz)
				END

			/******************************************
			*
			* Aggiorno kanban in dati macchine per
			* INIZIO ATTREZZAGGIO
			*
			******************************************/
			ELSE IF(@TabAzione = 'DatiMacchine' AND @Azione = 'Inizio' AND @FlgAggStato = 'Y')
				BEGIN				
					/* aggiorno riga di dati macchina */
					UPDATE DatiMacchine
						SET		kanban_A	= @MatricolaKanban,
								kanban_B	= @MatricolaKanban
					WHERE	idxMacchina = @IdxMacchina
					/* aggiorno stato macchina */
					UPDATE StatoMacchine
						SET		MatricolaKanban	= @MatricolaKanban
					WHERE	idxMacchina = @IdxMacchina
					/* 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.idxMacchina = @IdxMacchina)
				END
			/******************************************
			*
			* Aggiorno kanban in dati macchine per
			* FINE PRODUZIONE
			*
			******************************************/
			ELSE IF(@TabAzione = 'DatiMacchine' AND @Azione = 'Fine' AND @FlgAggStato = 'Y')
				BEGIN				
					/* calcolo valori */
					SET @MatricolaKanban	= 'KAND' -- kanban non definito !!!HARD CODED!!!
					/* aggiorno riga di dati macchina */
					UPDATE DatiMacchine
						SET		kanban_A	= @MatricolaKanban,
								kanban_B	= @MatricolaKanban
					WHERE	idxMacchina = @IdxMacchina
					/* aggiorno stato macchina */
					UPDATE StatoMacchine
						SET		MatricolaKanban	= @MatricolaKanban
					WHERE	idxMacchina = @IdxMacchina
					/* 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.idxMacchina = @IdxMacchina)
					
				END
        END

RETURN
go

commit
go


-- indici DDB
create index idx_TempoCicloBase on DiarioDiBordo(TempoCicloBase)
  include(IdxMacchina,InizioStato,MatricolaKanban,KanbanCode)
go


-- trigger EL
set xact_abort on
go

begin transaction
go

set ANSI_NULLS on
go

/***************************************************
* Trigger trg_doActions
*
* processa eventuali azioni legate ad un inserimento evento
*
* modificato: S.E.L.
* 2011.05.18
*
***************************************************/
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 @MatricolaKanbanOk 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 )
	SET @MatricolaKanban  = ( SELECT i.MatricolaKanban FROM inserted i )
	SET @DataOra          = ( SELECT i.InizioStato FROM inserted i )
	SET @NumPz            = ( SELECT CASE WHEN (ISNUMERIC(value)=1) THEN value ELSE 1 END FROM inserted i )

    EXECUTE dbo.stp_EL_processaEvento  @IdxTipo, @IdxMacchina, @MatricolaKanban, @DataOra, @NumPz, 'Y'

/*  SOSTITUITA CON STORED

	/* controllo se l'evento richieda azioni successive */
	IF(@TabAzione <> '' AND @Azione <> '')
		BEGIN
			/* azioni richieste: seconda dei casi eseguo... */
			
			/******************************************
			*
			* Calcolo tempo ciclo per INIZIO
			*
			******************************************/		
			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 ) )
					-- se è oltre 10 gg calcolo in secondi... 2013.8.30
					IF (DATEDIFF(DD, @DataOraPrec, @DataOra) > 10)
						BEGIN
							SET @TCMedio			= ( SELECT (DATEDIFF(s, @DataOraPrec, @DataOra) / 60.00 ) ) --calcolo in secondi
						END
					ELSE
						BEGIN
							SET @TCMedio			= ( SELECT (DATEDIFF(ms, @DataOraPrec, @DataOra) / 60000.00 ) )
						END
					-- versione vecchia	(blocco se oltre 24 gg di fermo...)
					--BEGIN TRY
					--	/* è in millisecondi, divido per 60'000.00 x avere minuti centesimali*/
					--	SET @TCMedio			= ( SELECT (DATEDIFF(ms, @DataOraPrec, @DataOra) / 60000.00 ) )
					--END TRY
					--BEGIN CATCH
					--	SET @TCMedio			= ( SELECT (DATEDIFF(s, @DataOraPrec, @DataOra) / 60.00 ) ) --calcolo in secondi
					--END CATCH
					/* inserisco riga di tempo ciclo */
					INSERT INTO TempiCicloRilevati
						VALUES(@IdxMacchina, @CodArticolo, @DataOra, @TCMedio, @NumPz)
				END
			/******************************************
			*
			* Calcolo tempo ciclo con logica stop/start
			*
			******************************************/
			ELSE IF(@TabAzione = 'TempiCicloRilevati' AND @Azione = 'Stop2StartCiclo')
				BEGIN				
					/* calcolo valori */
					SET @DataOra			= ( SELECT i.InizioStato FROM inserted i )
					SET @MatricolaKanban	= ( SELECT i.MatricolaKanban FROM inserted i )
					/* prendo la matricola dall'evento inizio (precedente) */
					SET @MatricolaKanbanOk	= ( SELECT ISNULL((SELECT Top 1 MatricolaKanban FROM EventList WHERE IdxMacchina = @IdxMacchina AND IdxTipo = @IdxTipo - 1 AND InizioStato < @DataOra ORDER BY InizioStato DESC), @MatricolaKanban ) )
					
					-- calcolare num pezzi da codice...
					SET @NumPz				= ( SELECT CASE WHEN (ISNUMERIC(value)=1) THEN value ELSE 1 END FROM inserted i )
					SET @CodArticolo		= ( SELECT CodArticolo FROM Kanban WHERE MatricolaKanban = @MatricolaKanbanOk )
					/* calcolo tempo tra eventi "contapezzi" inizio - fine NB: idxEvento per fine è idxEvento inizio + 1 ... HARD CODED!!! */
					SET @DataOraPrec		= ( SELECT ISNULL((SELECT Top 1 InizioStato FROM EventList WHERE IdxMacchina = @IdxMacchina AND IdxTipo = @IdxTipo - 1 AND InizioStato < @DataOra ORDER BY InizioStato DESC), @DataOra ) )
					-- se è oltre 10 gg calcolo in secondi... 2013.8.30
					IF (DATEDIFF(DD, @DataOraPrec, @DataOra) > 10)
						BEGIN
							SET @TCMedio			= ( SELECT (DATEDIFF(s, @DataOraPrec, @DataOra) / 60.00 ) ) --calcolo in secondi
						END
					ELSE
						BEGIN
							SET @TCMedio			= ( SELECT (DATEDIFF(ms, @DataOraPrec, @DataOra) / 60000.00 ) )
						END
					-- versione vecchia	(blocco se oltre 24 gg di fermo...)
					--BEGIN TRY
					--	/* è in millisecondi, divido per 60'000.00 x avere minuti centesimali*/
					--	SET @TCMedio			= ( SELECT (DATEDIFF(ms, @DataOraPrec, @DataOra) / 60000.00 ) )
					--END TRY
					--BEGIN CATCH
					--	SET @TCMedio			= ( SELECT (DATEDIFF(s, @DataOraPrec, @DataOra) / 60.00 ) ) --calcolo in secondi
					--END CATCH
					/* inserisco riga di tempo ciclo */
					INSERT INTO TempiCicloRilevati
						VALUES(@IdxMacchina, @CodArticolo, @DataOra, @TCMedio, @NumPz)
				END
			/******************************************
			*
			* calcolo tempo ciclo con logica stop/stop
			*
			******************************************/
			ELSE IF(@TabAzione = 'TempiCicloRilevati' AND @Azione = 'Stop2StopCiclo')
				BEGIN				
					/* calcolo valori */
					SET @DataOra			= ( SELECT i.InizioStato FROM inserted i )
					SET @MatricolaKanban	= ( SELECT i.MatricolaKanban FROM inserted i )
					/* prendo la matricola dall'evento inizio (precedente) */
					SET @MatricolaKanbanOk	= ( SELECT ISNULL((SELECT Top 1 MatricolaKanban FROM EventList WHERE IdxMacchina = @IdxMacchina AND IdxTipo = @IdxTipo AND InizioStato < @DataOra ORDER BY InizioStato DESC), @MatricolaKanban ) )
					
					-- calcolare num pezzi da codice...
					SET @NumPz				= ( SELECT PzPallet FROM Kanban WHERE MatricolaKanban = @MatricolaKanbanOk )
					SET @CodArticolo		= ( SELECT CodArticolo FROM Kanban WHERE MatricolaKanban = @MatricolaKanbanOk )
					/* calcolo tempo tra eventi "contapezzi" fine - fine NB: idxEvento per fine è idxEvento inizio + 1 ... HARD CODED!!! */
					SET @DataOraPrec		= ( SELECT ISNULL((SELECT Top 1 InizioStato FROM EventList WHERE IdxMacchina = @IdxMacchina AND IdxTipo = @IdxTipo AND InizioStato < @DataOra ORDER BY InizioStato DESC), @DataOra ) )
					-- se è oltre 10 gg calcolo in secondi... 2013.8.30
					IF (DATEDIFF(DD, @DataOraPrec, @DataOra) > 10)
						BEGIN
							SET @TCMedio			= ( SELECT (DATEDIFF(s, @DataOraPrec, @DataOra) / 60.00 ) ) --calcolo in secondi
						END
					ELSE
						BEGIN
							SET @TCMedio			= ( SELECT (DATEDIFF(ms, @DataOraPrec, @DataOra) / 60000.00 ) )
						END
					-- versione vecchia	(blocco se oltre 24 gg di fermo...)
					--BEGIN TRY
					--	/* è in millisecondi, divido per 60'000.00 x avere minuti centesimali*/
					--	SET @TCMedio			= ( SELECT (DATEDIFF(ms, @DataOraPrec, @DataOra) / 60000.00 ) )
					--END TRY
					--BEGIN CATCH
					--	SET @TCMedio			= ( SELECT (DATEDIFF(s, @DataOraPrec, @DataOra) / 60.00 ) ) --calcolo in secondi
					--END CATCH
					/* inserisco riga di tempo ciclo */
                    BEGIN TRY
					    INSERT INTO TempiCicloRilevati
						    VALUES(@IdxMacchina, @CodArticolo, @DataOra, @TCMedio, @NumPz)
                    END TRY
                    BEGIN CATCH
						-- dovrei loggare...
					END CATCH
				END
			/******************************************
			*
			* Aggiorno kanban in dati macchine per
			* INIZIO ATTREZZAGGIO
			*
			******************************************/
			ELSE IF(@TabAzione = 'DatiMacchine' AND @Azione = 'Inizio')
				BEGIN				
					/* calcolo valori */
					SET @MatricolaKanban	= ( SELECT i.MatricolaKanban FROM inserted i )
					/* aggiorno riga di dati macchina */
					UPDATE DatiMacchine
						SET		kanban_A	= @MatricolaKanban,
								kanban_B	= @MatricolaKanban
						WHERE	idxMacchina = @IdxMacchina
					/* aggiorno stato macchina */
					UPDATE StatoMacchine
						SET		MatricolaKanban	= @MatricolaKanban
						WHERE	idxMacchina = @IdxMacchina
					/* 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.idxMacchina = @IdxMacchina)
				END
			/******************************************
			*
			* Aggiorno kanban in dati macchine per
			* FINE PRODUZIONE
			*
			******************************************/
			ELSE IF(@TabAzione = 'DatiMacchine' AND @Azione = 'Fine')
				BEGIN				
					/* calcolo valori */
					SET @MatricolaKanban	= 'KAND' -- kanban non definito !!!HARD CODED!!!
					/* aggiorno riga di dati macchina */
					UPDATE DatiMacchine
						SET		kanban_A	= @MatricolaKanban,
								kanban_B	= @MatricolaKanban
						WHERE	idxMacchina = @IdxMacchina
					/* aggiorno stato macchina */
					UPDATE StatoMacchine
						SET		MatricolaKanban	= @MatricolaKanban
						WHERE	idxMacchina = @IdxMacchina
					/* 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.idxMacchina = @IdxMacchina)
					
				END
        END
*/
    
    -- INFINE CHIAMO REFRESH TAB STATO...
    EXEC stp_MSE_refresh @IdxMacchina
go

commit
go


-- viste
set xact_abort on
go

begin transaction
go

set ANSI_NULLS on
go

create VIEW v_Eventi_To_StatiMacchina
AS
/* mostra gli eventi macchina ed eventualmenti gli stati macchina che hanno provocato
   EVENTI -> STATI DIARIO DI BORDO

   FARE FILTRO X MACCHINA E ORDER BY INIZIO STATO

   SELECT * FROM dbo.v_Eventi_To_StatiMacchina
   WHERE IdxMacchina = 1010
    AND InizioStato < '20131009 19:00.000'
   ORDER BY InizioStato DESC;
*/
WITH cteDiario AS 
(
    SELECT d.IdxMacchina, d.InizioStato, d.FineStato, d.IdxStato, d.DurataMinuti, d.[Value], d.MatricolaKanban, d.KanbanCode
          ,d.TempoCicloBase, d.PzPalletProd, d.MatrOpr, d.pallet
          ,a.Descrizione AS DescStato
    FROM DiarioDiBordo AS d
    INNER JOIN dbo.AnagraficaStati AS a ON d.IdxStato = a.IdxStato
)
SELECT e.IdxMacchina, e.InizioStato AS InizioEvento, e.IdxTipo AS IdxTipoEvento, e.MatricolaKanban, e.[Value], e.MatrOpr, e.pallet, 
       ae.Nome AS NomeEvento,ae.TabAzione,ae.Azione,
       di.FineStato AS FineStatoPrec, di.InizioStato AS InizioStatoPrec, di.IdxStato AS IdxStatoIniz, di.DescStato AS DescStatoIniziale,
       df.InizioStato AS FineStato, df.IdxStato AS idxStatoFine, df.DescStato AS DescStatoFine
FROM EventList AS e
INNER JOIN dbo.AnagraficaEventi AS ae ON e.IdxTipo = ae.IdxTipo
--LEFT JOIN cteDiario AS di ON e.IdxMacchina = di.IdxMacchina AND e.InizioStato = di.FineStato
--LEFT JOIN cteDiario AS df ON e.IdxMacchina = df.IdxMacchina AND e.InizioStato = df.InizioStato
LEFT JOIN cteDiario AS di ON e.IdxMacchina = di.IdxMacchina AND ( e.InizioStato >= DATEADD( ms , -80, di.FineStato )   AND e.InizioStato <= di.FineStato )
LEFT JOIN cteDiario AS df ON e.IdxMacchina = df.IdxMacchina AND ( e.InizioStato >= DATEADD( ms , -80, df.InizioStato ) AND e.InizioStato <= df.InizioStato ) 
-- LEFT JOIN cteDiario AS df ON e.IdxMacchina = df.IdxMacchina AND e.InizioStato = df.InizioStato
--WHERE e.IdxMacchina = 1010 
--AND e.InizioStato < '20131009 19:00.000'
--ORDER BY e.InizioStato DESC;
go

create VIEW v_StatiMacchina_From_Eventi
AS
/* 
   mostra gli stati macchina e gli eventi che li hanno generati
   STATI DIARIO DI BORDO -> EVENTI

   FARE FILTRO X MACCHINA E ORDER BY INIZIO STATO

   SELECT * FROM dbo.v_StatiMacchina_From_Eventi
   WHERE IdxMacchina = 1010
    AND InizioStato < '20131009 19:00.000'
   ORDER BY InizioStato DESC;
*/
WITH cteDiario AS 
(
    SELECT d.IdxMacchina, d.InizioStato, d.FineStato, d.IdxStato, d.DurataMinuti, d.[Value], d.MatricolaKanban, d.KanbanCode
          ,d.TempoCicloBase, d.PzPalletProd, d.MatrOpr, d.pallet
          ,a.Descrizione AS DescStato
    FROM DiarioDiBordo AS d
    INNER JOIN dbo.AnagraficaStati AS a ON d.IdxStato = a.IdxStato
)
SELECT e.IdxMacchina, e.InizioStato AS InizioEvento, e.IdxTipo AS IdxTipoEvento, e.MatricolaKanban, e.[Value], e.MatrOpr, e.pallet, 
       ae.Nome AS NomeEvento,ae.TabAzione,ae.Azione,
       di.InizioStato,di.IdxStato AS IdxStatoIniz, di.DescStato AS DescStatoIniziale,
       df.InizioStato AS FineStato, df.IdxStato AS idxStatoFine, df.DescStato AS DescStatoFine
FROM EventList AS e
INNER JOIN dbo.AnagraficaEventi AS ae ON e.IdxTipo = ae.IdxTipo
LEFT JOIN cteDiario AS di ON e.IdxMacchina = di.IdxMacchina AND e.InizioStato = di.FineStato
LEFT JOIN cteDiario AS df ON e.IdxMacchina = df.IdxMacchina AND e.InizioStato = df.InizioStato
--WHERE e.IdxMacchina = 1010 
--AND e.InizioStato < '20131009 19:00.000'
--ORDER BY e.InizioStato DESC;
go

commit
go


-- stored: nuove!!!
set xact_abort on
go

begin transaction
go

set ANSI_NULLS on
go

/*************************************
* STORED PROCEDURE stp_Comm_getLastByMacchina
* 	ottiene l'elenco degli ultimi N commenti per una macchina specificata
*
* modif.:	S.E.L. - 2013.10.16
**************************************/
create PROCEDURE stp_Comm_getLastByMacchina
(
	@IdxMacchina	NVARCHAR(50) = '0',
	@showMax		INT = 10
)
AS

SELECT		TOP (@showMax) o.idxODL, o.CodArticolo, el.IdxMacchina, el.InizioStato, el.Value, 
			ISNULL(ao.Cognome,'cognome') + ' ' + ISNULL(ao.Nome,'') AS Operatore
FROM		EventList el INNER JOIN ODL o ON el.IdxMacchina = o.IdxMacchina AND el.InizioStato BETWEEN o.DataInizio AND ISNULL(o.DataFine, GETDATE())
	LEFT OUTER JOIN AnagraficaOperatori ao ON el.MatrOpr = ao.MatrOpr
WHERE		el.IdxMacchina = CASE WHEN @IdxMacchina = 0 THEN el.IdxMacchina ELSE @IdxMacchina END
	AND		el.IdxTipo = 999 -- 999 = commento! HARD CODED!!!
ORDER BY	el.InizioStato DESC

RETURN
go

/*************************************
* STORED PROCEDURE stp_DDB_getNextByMacchinaFrom
* 	ottiene i dati dell'evento successivo una macchina ed un istante specificati 
*
* modif.:	S.E.L. - 2013.10.24
**************************************/
create PROCEDURE stp_DDB_getNextByMacchinaFrom
(
	@IdxMacchina NVARCHAR(50),
	@dataRif DATETIME	
)
AS

SELECT		TOP 1 *
FROM        DiarioDiBordo
WHERE       (IdxMacchina = @IdxMacchina) AND 
			(InizioStato > @dataRif)
ORDER BY	InizioStato

RETURN
go

/*************************************
* STORED PROCEDURE stp_FNQ_getFilt
* 	ottiene elenco FERMI NON QUALIFICATI filtrati x macchina, gg da guardare a ritroso e durata
*
* modif.:	S.E.L. - 2013.10.23
**************************************/
create PROCEDURE stp_FNQ_getFilt
(
	@IdxMacchina	NVARCHAR(50)	= 0,
	@gg				INT = 3, -- num gg da mostrare a ritroso (da ADESSO)
	@durataMin		FLOAT = 30 -- min 30 min		
)
AS

-- imposto inizio/fine
DECLARE @Inizio DATETIME
DECLARE @Fine DATETIME

SELECT	@Fine = GETDATE(), @Inizio = DATEADD(DAY, -@gg, GETDATE())

SELECT		m.IdxMacchina, InizioStato, m.Nome as Macchina, ddb.IdxStato, Ans.Descrizione AS Stato, Ans.Semaforo,
			ISNULL(DurataMinuti, DATEDIFF(s, InizioStato, @Fine) / 60) AS DurataMinuti, Value, KanbanCode as CodArticolo
FROM        DiarioDiBordo AS ddb INNER JOIN AnagraficaStati AnS ON ddb.IdxStato = AnS.IdxStato INNER JOIN MAcchine m ON ddb.IdxMacchina = m.IdxMacchina
WHERE       Ans.Semaforo IN ('G','R')
		AND	m.IdxMacchina = CASE WHEN @IdxMacchina = 0 THEN m.IdxMacchina ELSE @IdxMacchina END
		AND ((InizioStato BETWEEN @Inizio AND @Fine) OR (FineStato BETWEEN @Inizio AND @Fine))
		AND ISNULL(DurataMinuti, DATEDIFF(s, InizioStato, @Fine) / 60) >= @durataMin
ORDER BY	InizioStato DESC

RETURN
go

commit
go


set xact_abort on
go

begin transaction
go

set ANSI_NULLS on
go

-- =============================================
-- Author:		Samuele E. Locatelli
-- Create date: 2009-03-04
-- mod date:	
--
-- Description:	riallineamento con update massivo dati db
-- aggiorna i dati nel db per portarli ad essere "odierni" ovvero ultimo evento appena successo
-- =============================================
create PROCEDURE man.stp_riallineaDateDb
AS

DECLARE @Database AS SYSNAME;
DECLARE @lastData AS DATETIME
DECLARE @diff_min as INT
DECLARE @idxMacchina AS NVARCHAR(50)
DECLARE @idxMacchinaTest AS NVARCHAR(50) = '1008'

DBCC SHOWCONTIG(EventList)
DBCC SHOWCONTIG(DiarioDiBordo)

SET @Database = DB_NAME()
EXEC USP_DisableEnableNonClusteredIndexes @Database ,null, 1 -- disabilito indici

PRINT 'inizio UPDATE tabelle...'

/* ELIMINO MACCHINA 99 */
/*
-- elimino tutti gli eventi della macchina test
DELETE FROM EventList WHERE IdxMacchina = @idxMacchinaTest
-- elimino da diario di bordo della macchina test
DELETE FROM DiarioDiBordo WHERE IdxMacchina = @idxMacchinaTest
-- elimino da tempi ciclo teorici della macchina test 
DELETE FROM TempiCicloTeorici WHERE IdxMacchina = @idxMacchinaTest
-- elimino da tempi ciclo rilevati della macchina test
DELETE FROM TempiCicloRilevati WHERE IdxMacchina = @idxMacchinaTest

DELETE dbo.KeepAlive WHERE IdxMacchina = @idxMacchinaTest
DELETE DatiMacchine WHERE IdxMacchina = @idxMacchinaTest
DELETE StatoMacchine WHERE IdxMacchina = @idxMacchinaTest
DELETE Macchine WHERE IdxMacchina = @idxMacchinaTest
*/

-- calcolo l'ultima data degli eventi esclusa macchina test
SET @lastData    = ( SELECT MAX(InizioStato) AS inizio FROM DiarioDiBordo WHERE IdxMacchina <> @idxMacchinaTest )
SET @idxMacchina = ( SELECT TOP 1 IdxMacchina FROM DiarioDiBordo WHERE InizioStato = @lastData )

-- SELECT @idxMacchina, @idxMacchinaTest

-- ora calcolo la differenza tra quello e la data/ora odierna
SET @diff_min = (SELECT DATEDIFF(n, @lastData, getdate()))

/* TRASLO GLI EVENTI DELLE MACCHINE A DATA-ORA ATTUALI */

-- aggiorno EventList
UPDATE EventList SET InizioStato = DATEADD(n, @diff_min, InizioStato)
-- aggiorno DiarioDiBordo
UPDATE DiarioDiBordo SET InizioStato = DATEADD(n, @diff_min, InizioStato),FineStato = DATEADD(n, @diff_min, FineStato)
-- aggiorno StatoMacchine
UPDATE StatoMacchine SET InizioStato = DATEADD(n, @diff_min, InizioStato)
-- aggiorno KeepAlive
UPDATE KeepAlive SET DataOraServer = DATEADD(n, @diff_min, DataOraServer), DataOraMacchina = DATEADD(n, @diff_min, DataOraMacchina), DataOraStart = DATEADD(n, @diff_min, DataOraStart)
-- aggiorno TC teorici
UPDATE TempiCicloTeorici SET DataOraFrom = DATEADD(n, @diff_min, DataOraFrom), DataOraTo = DATEADD(n, @diff_min, DataOraTo)
-- aggiorno TC rilevati
UPDATE TempiCicloRilevati SET DataOraRif = DATEADD(n, @diff_min, DataOraRif)
-- aggiorno Dati confermati
UPDATE DatiConfermati SET DataOraApp = DATEADD(n, @diff_min, DataOraApp), DataRif = DATEADD(n, @diff_min, DataRif), DataOraFrom = DATEADD(n, @diff_min, DataOraFrom), DataOraTo = DATEADD(n, @diff_min, DataOraTo) 

-- elimino tutti gli eventi della macchina test superiori a @lastData ( sono i dati di prova )
DELETE FROM EventList WHERE IdxMacchina = @idxMacchinaTest AND InizioStato > DATEADD(n, @diff_min, @lastData )
DELETE FROM DiarioDiBordo WHERE IdxMacchina = @idxMacchinaTest AND InizioStato > DATEADD(n, @diff_min, @lastData )
DELETE FROM TempiCicloRilevati WHERE IdxMacchina = @idxMacchinaTest AND DataOraRif > DATEADD(n, @diff_min, @lastData )

-- aggiorno lo stato macchine
UPDATE StatoMacchine
	SET IdxStato = Diario.IdxStato
FROM StatoMacchine AS s
INNER JOIN (
		SELECT d.IdxMacchina, d.IdxStato,d.InizioStato
		FROM DiarioDiBordo AS d
		INNER JOIN 
            ( 
            SELECT idxMacchina, MAX(InizioStato) As InizioStato
            FROM DiarioDiBordo
            GROUP BY idxMacchina
            ) AS a ON a.IdxMacchina = d.IdxMacchina AND a.InizioStato = d.InizioStato
) AS Diario 
ON s.IdxMacchina = Diario.IdxMacchina

-- aggiornamento x tablet
EXEC [dbo].[stp_MSE_getData] 0

PRINT 'concluso UPDATE tabelle...'

-- --shrink del db
PRINT 'compatto DB...'
DBCC SHRINKDATABASE (@Database)

--ricostruisco indici DOPO shrink
PRINT 'ricostruisco indici...'

-- riabilito tutti gli indici non-cluster ( fa una reindex )
EXEC USP_DisableEnableNonClusteredIndexes @Database ,null, 2 --riattivo indici

-- ricostruisco i cluster
ALTER INDEX PK_EventList     ON dbo.EventList     REBUILD
    WITH (FILLFACTOR = 98, SORT_IN_TEMPDB = ON );
ALTER INDEX PK_DiarioDiBordo ON dbo.DiarioDiBordo REBUILD
    WITH (FILLFACTOR = 98, SORT_IN_TEMPDB = ON );

--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)

/* 

-- ******************************************************
-- *** PROCEDURE VARIE PER CREAZIONE DB DEMO ***
-- ******************************************************

-- FARE il restore del DB

-- Poi faccio pulizia dei vecchi DATI del DB 
USE MoonPro_DEMO;

DECLARE @Database AS SYSNAME;
SET @Database = DB_NAME()
EXEC USP_DisableEnableNonClusteredIndexes @Database ,null, 1 -- disabilito indici

DECLARE @lastData AS datetime
SET @lastData = '20130920'

DELETE FROM EventList WHERE InizioStato < @lastData
DELETE FROM DiarioDiBordo WHERE InizioStato < @lastData
DELETE FROM TempiCicloRilevati WHERE DataOraRif < @lastData

-- riallineo dati a GETDATE()
EXEC [man].[stp_riallineaDateDb]

-- ******************************************************
-- *** CANCELLAZIONE DELLE ultime tre ORE di EVENTI ***
-- ******************************************************

-- riallineo alla data/ora attuale prima della cancellazione
EXEC [man].[stp_riallineaDateDb] 

DELETE FROM EventList WHERE InizioStato > DATEADD(n, -720, GETDATE() )
DELETE FROM DiarioDiBordo WHERE InizioStato > DATEADD(n, -720, GETDATE() )
DELETE FROM TempiCicloRilevati WHERE DataOraRif > DATEADD(n, -720, GETDATE() )
DELETE FROM DatiConfermati WHERE DataRif > DATEADD(n, -720, GETDATE() )

UPDATE KeepAlive
SET DataOraServer   = DATEADD(n, -720, DataOraServer ) ,
    DataOraMacchina = DATEADD(n, -720, DataOraMacchina ) ,
    DataOraStart    = DATEADD(n, -720, DataOraStart )

-- riallineo alla data/ora attuale
EXEC [man].[stp_riallineaDateDb]

*/

RETURN
go

-- ================================================
-- Author:		Samuele E. Locatelli
-- Create date: 2012.11.23
--
-- Description:	rigenerazione del diario di bordo 
-- a partire da macchina eventi/stati + EventList
-- ================================================
create PROCEDURE man.stp_ricalcolaDatiMacchinaFromDate
(
	@idxMacchina	NVARCHAR(50),
	@inizio			DATETIME,
	@idxStatoStart	INT = 1
)
AS

SET NOCOUNT ON;

DECLARE	@fine		DATETIME

--DBCC SHOWCONTIG(EventList)
--DBCC SHOWCONTIG(DiarioDiBordo)

/* DA USARE ?  Verificare */
--DECLARE @Database AS SYSNAME;
--SET @Database = DB_NAME()
--EXEC USP_DisableEnableNonClusteredIndexes @Database ,null, 1 -- disabilito indici


-- update SAM 2013.10.24: "torno indietro" di 2 eventi rispetto alal data ora indicata come start, SE CI SONO
SELECT @inizio = ISNULL(MIN(InizioStato),@inizio) FROM 
(
SELECT TOP 3 InizioStato
FROM DiarioDiBordo 
WHERE IdxMacchina = @idxMacchina AND InizioStato < @inizio  
ORDER BY InizioStato DESC
) AS tbl


-- DISATTIVO inserimento in DiarioDiBordo per la macchina indicata
-- DEVE disattivare anche il caricamento degli eventi
UPDATE DatiMacchine
    SET	insEnabled = 0
WHERE IdxMacchina = @IdxMacchina

-- devo sempre rielaborare tutti gli eventi fino a dataora odierna
SET @fine = ( SELECT MAX(InizioStato) FROM EventList
                   WHERE idxMacchina = @idxMacchina )

-- svuoto dati che vado a sostituire
PRINT 'svuoto TempiCicloRilevati per periodo indicato...'
DELETE FROM TempiCicloRilevati WHERE idxMacchina = @idxMacchina AND DataOraRif BETWEEN @inizio AND @fine

PRINT 'svuoto DiarioDiBordo per periodo indicato...'
EXEC stp_DDB_deleteMacchinaPeriodo @idxMacchina, @inizio, @fine  -- cancella diario di bordo

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
DECLARE @TabAzione          NVARCHAR(50)   = '';
DECLARE @Azione             NVARCHAR(50)   = '';

-- calcolo famiglia macchina!
SET	@IdxFamiglia = ( SELECT IdxFamiglia FROM Macchine2FamiglieMacchine WHERE idxMacchina = @idxMacchina )

-- Recupero stato precedente, altrimenti ipotizzo macchina inizialmente in stato richiesto (default: 1 = pronta) e quindi imposto stato current a quello iniziale richiesto...
SET	@currIdxStato = ISNULL( ( SELECT TOP 1 IdxStato FROM DiarioDiBordo WHERE IdxMacchina = @idxMacchina AND InizioStato < @inizio  
                                ORDER BY InizioStato DESC ) , @idxStatoStart)

-- verifico i record elaborati
SELECT	COUNT(*)
FROM	EventList AS e
LEFT JOIN dbo.AnagraficaEventi AS a ON e.idxTipo = a.IdxTipo
WHERE	e.IdxMacchina = @idxMacchina
AND		e.InizioStato BETWEEN @inizio AND @fine

-- leggo la tabella degli eventi con cursore x percorrere i dati...
DECLARE event2proc CURSOR FOR 
    SELECT	e.InizioStato, e.IdxTipo, e.MatricolaKanban, e.Value, e.MatrOpr, e.pallet,
            a.TabAzione, a.Azione
    FROM	EventList AS e
    LEFT JOIN dbo.AnagraficaEventi AS a ON e.idxTipo = a.IdxTipo
    WHERE	e.IdxMacchina = @idxMacchina
    AND		e.InizioStato BETWEEN @inizio AND @fine
    ORDER BY e.InizioStato;
/*
    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, @TabAzione, @Azione;

DECLARE @NumPz INT = 1;
DECLARE @ContaInsert INT = 0;

WHILE @@FETCH_STATUS = 0
	BEGIN

        IF ( ISNULL(@TabAzione,'') <> '' AND ISNULL(@Azione,'') <> '')
          BEGIN
            SET @NumPz = CASE WHEN (ISNUMERIC(@Value)=1) THEN @Value ELSE 1 END
            EXEC dbo.stp_EL_processaEvento @IdxTipo, @idxMacchina, @MatricolaKanban, @InizioStato, @NumPz , 'N'
          END

		-- calcolo l'eventuale NUOVO idxStato
		SET	@nextIdxStato = 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
            SET @ContaInsert = @ContaInsert + 1
		END

		-- Get the next values
		FETCH NEXT FROM event2proc 
		INTO @InizioStato, @IdxTipo, @MatricolaKanban, @Value, @MatrOpr, @pallet, @TabAzione, @Azione;

	END
CLOSE event2proc;
DEALLOCATE event2proc;

-- resetto microStato a 1
UPDATE dbo.MicroStatoMacchina
  SET IdxMicroStato = 1, 
      InizioStato = @InizioStato,
      Value = '0'
WHERE IdxMacchina = @idxMacchina


-- fa un controllo: elimina eventuali dichairazioni in DDB SE durata < 0...
DELETE FROM DiarioDiBordo WHERE DurataMinuti < 0 AND IdxMacchina = @idxMacchina

-- RI-ATTIVO inserimento in DiarioDiBordo per la macchina indicata
UPDATE	DatiMacchine
SET		insEnabled = 1
WHERE	IdxMacchina = @IdxMacchina

PRINT 'concluso UPDATE tabelle...' + 'INSERT DiarioBordo : ' + CONVERT(VARCHAR(30),@ContaInsert)

--DBCC SHOWCONTIG(EventList)
--DBCC SHOWCONTIG(DiarioDiBordo)
--EXEC USP_DisableEnableNonClusteredIndexes @Database,null, 2 --riattivo indici

--ricostruisco indici   X QUESTE TABELLE DOPPIA RICOSTRUZIONE INDICI NON NECESSARIA
--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)

RETURN
go

commit
go


-- stored update!
set xact_abort on
go

begin transaction
go

set ANSI_NULLS on
go

/*************************************
* STORED PROCEDURE stp_ODL_getByMacchinaPeriodo
* 	ottiene l'elenco degli ODL in lavorazione su una macchina in un dato periodo
*
* modif.:	S.E.L. - 2012.04.02
**************************************/
alter PROCEDURE stp_ODL_getByMacchinaPeriodo
(
	@IdxMacchina	NVARCHAR(50),
	@dataFrom		DATETIME,
	@dataTo			DATETIME
)
AS

BEGIN
	SELECT	*
	FROM	v_ODL_exp 
	WHERE	IdxMacchina = @IdxMacchina 
	AND		((DataInizio BETWEEN @dataFrom AND @dataTo) OR (DataFine BETWEEN @dataFrom AND @dataTo) OR (DataInizio <= @dataFrom AND ISNULL(DataFine,GETDATE()) >= @dataTo)) 
END

RETURN
go

/*************************************
* STORED PROCEDURE stp_repDonati_getDatiProdMacchina
* 	restituisce i dati di produzione di una macchina per PERIODO
*
* modif.:	S.E.L. - 2012.03.21
**************************************/
alter PROCEDURE stp_repDonati_getDatiProdMacchinaPeriodo
(
	@idxMacchina	NVARCHAR(50),
	@dataFrom		DATETIME,
	@dataTo			DATETIME
)
AS

-- calcolo pezzi CONTATI, non quelli poi confermati...					
DECLARE @PezziProd INT
SET @PezziProd =	ISNULL(( 
					SELECT COUNT(*)FROM TempiCicloRilevati 
					WHERE	idxMacchina = @idxMacchina
					AND		DataOraRif BETWEEN @dataFrom AND @dataTo
					), 0)
										
-- calcolo TEMPO MEDIO ponderato in base al num di pezzi per tipo...
DECLARE @TCAss DECIMAL(18,8)

;WITH cte_tabMinProd as
(
	SELECT	ISNULL(COUNT(tcr.DataOraRif), 0) * ISNULL(o.TCAssegnato, 0) AS MinProd
	FROM	TempiCicloRilevati tcr INNER JOIN ODL o
	ON		o.IdxMacchina=tcr.IdxMacchina AND o.CodArticolo = tcr.CodArticolo
	WHERE	tcr.DataOraRif BETWEEN o.DataInizio AND ISNULL(o.DataFine, GETDATE())
	AND		tcr.DataOraRif BETWEEN @dataFrom AND @dataTo
	AND		((o.DataInizio <= @dataTo) AND (ISNULL(o.DataFine, GETDATE()) >= @dataFrom))
	GROUP BY o.TCAssegnato
)
SELECT @TCAss =	ISNULL(SUM(MinProd) / CASE WHEN @PezziProd > 0 THEN @PezziProd ELSE 1 END, 0)
FROM cte_tabMinProd


/****************************************************
* Calcolo tempi apertura realtime
****************************************************/
-- calcolo i tempi di apertura: TempoON (Verde + giallo + rosso)
DECLARE @TempoOnRT DECIMAL(18,8)
SET @TempoOnRT =	( 
					SELECT ISNULL(SUM(DurataMinuti),0) 
					FROM DiarioDiBordo ddb INNER JOIN AnagraficaStati AnSt ON ddb.IdxStato= AnSt.IdxStato
					WHERE AnSt.ClasseTempo NOT IN ('T_OFF', 'T_OFF_ND') AND InizioStato BETWEEN @dataFrom AND @dataTo 
					AND		IdxMacchina = @idxMacchina
					)
					
-- calcolo i tempi di apertura: TempoAuto (Verde + giallo) - precedente meno "T_FermoRosso"
DECLARE @TempoAutoRT DECIMAL(18,8)
SET @TempoAutoRT =	( 
					SELECT @TempoOnRT - ISNULL(SUM(DurataMinuti),0) 
					FROM DiarioDiBordo ddb INNER JOIN AnagraficaStati AnSt ON ddb.IdxStato= AnSt.IdxStato
					WHERE AnSt.ClasseTempo = 'T_FermoRosso' AND InizioStato BETWEEN @dataFrom AND @dataTo 
					AND		IdxMacchina = @idxMacchina
					)
					
-- calcolo i tempi di apertura: TempoRun (Verde)
DECLARE @TempoRunRT DECIMAL(18,8)
SET @TempoRunRT =	(
					SELECT ISNULL(SUM(DurataMinuti),0) 
					FROM DiarioDiBordo ddb INNER JOIN AnagraficaStati AnSt ON ddb.IdxStato= AnSt.IdxStato
					WHERE AnSt.ClasseTempo = 'T_AutoRun' AND InizioStato BETWEEN @dataFrom AND @dataTo
					AND		IdxMacchina = @idxMacchina
					)



/****************************************************
* Calcolo i TEMPI CICLO realtime (anche non confermati)
****************************************************/

-- DIVISIONE PER ZERO: controllo pezzi prod > 0...
DECLARE @numPezzi INT
SET @numPezzi = @PezziProd - 1 -- divido per n-1 per avere numIntervalli = numPezzi
IF(@numPezzi < 1) SET @numPezzi = 1

DECLARE @TCMedRT DECIMAL(18,8)
SET @TCMedRT =		( 
					SELECT @TempoOnRT / @numPezzi
					)	
DECLARE @TCLavRT DECIMAL(18,8)
SET @TCLavRT =		( 
					SELECT @TempoAutoRT / @numPezzi
					)					
DECLARE @TCEffRT DECIMAL(18,8)
SET @TCEffRT =		ISNULL(( SELECT dbo.f_lastTempoTecnico(@idxMacchina, 2) ), -1) -- provo a calcolare ultimi tempi tecnici
IF (@TCEffRT =-1) 
BEGIN
	SET @TCEffRT =		( 
					SELECT @TempoRunRT / @numPezzi
						)					
END
							
					
SELECT @PezziProd as PezziProd, @TCAss AS TCAssegnato, @TCMedRT AS TCMedioRT, @TCLavRT AS TCLavRT, @TCEffRT AS TCEffRT


RETURN
go

commit
go


-- dati eventi/stati/transizioni...
set xact_abort on
go

begin transaction
go

UPDATE dbo.AnagraficaEventi SET 
  Nome=N'Bcode - Cambio Pallet (unused)'
  WHERE IdxTipo=11
UPDATE dbo.AnagraficaEventi SET 
  Nome=N'Barcode - Fermo Organizzativo', TabAzione=N'DatiMacchine', Azione=N'Fine'
  WHERE IdxTipo=19
INSERT INTO dbo.AnagraficaEventi
  VALUES (999, N'Commento', N'', N'')
go

commit transaction
go


set xact_abort on
go

begin transaction
go

UPDATE dbo.AnagraficaStati SET 
  Semaforo=N'S', ClasseTempo=N'T_OFF'
  WHERE IdxStato=27
INSERT INTO dbo.AnagraficaStati
  VALUES (30, N'Fermo Organizzativo', N'S', 1, N'T_OFF', 0)
go

commit transaction
go


-- tab transizioni!
set xact_abort on
go

begin transaction
go

DELETE FROM dbo.TransizioneStati WHERE IdxFamiglia=1 and IdxStato=1 and IdxTipo=1
DELETE FROM dbo.TransizioneStati WHERE IdxFamiglia=4 and IdxStato=1 and IdxTipo=1
go

commit transaction
go


set xact_abort on
go

begin transaction
go

INSERT INTO dbo.TransizioneStati
  VALUES (2, 1, 12, 11)
INSERT INTO dbo.TransizioneStati
  VALUES (2, 2, 12, 11)
INSERT INTO dbo.TransizioneStati
  VALUES (2, 3, 12, 11)
INSERT INTO dbo.TransizioneStati
  VALUES (2, 4, 12, 11)
INSERT INTO dbo.TransizioneStati
  VALUES (2, 5, 12, 11)
INSERT INTO dbo.TransizioneStati
  VALUES (2, 6, 12, 11)
INSERT INTO dbo.TransizioneStati
  VALUES (2, 7, 12, 11)
INSERT INTO dbo.TransizioneStati
  VALUES (2, 8, 12, 11)
INSERT INTO dbo.TransizioneStati
  VALUES (2, 9, 12, 11)
INSERT INTO dbo.TransizioneStati
  VALUES (2, 10, 12, 11)
INSERT INTO dbo.TransizioneStati
  VALUES (2, 12, 12, 11)
INSERT INTO dbo.TransizioneStati
  VALUES (2, 13, 12, 11)
INSERT INTO dbo.TransizioneStati
  VALUES (2, 14, 12, 11)
INSERT INTO dbo.TransizioneStati
  VALUES (2, 15, 12, 11)
INSERT INTO dbo.TransizioneStati
  VALUES (10, 1, 2, 2)
INSERT INTO dbo.TransizioneStati
  VALUES (10, 1, 3, 3)
INSERT INTO dbo.TransizioneStati
  VALUES (10, 1, 4, 4)
INSERT INTO dbo.TransizioneStati
  VALUES (10, 1, 5, 5)
INSERT INTO dbo.TransizioneStati
  VALUES (10, 1, 6, 6)
INSERT INTO dbo.TransizioneStati
  VALUES (10, 1, 7, 7)
INSERT INTO dbo.TransizioneStati
  VALUES (10, 1, 8, 8)
INSERT INTO dbo.TransizioneStati
  VALUES (10, 1, 9, 9)
INSERT INTO dbo.TransizioneStati
  VALUES (10, 1, 10, 10)
INSERT INTO dbo.TransizioneStati
  VALUES (10, 1, 12, 11)
INSERT INTO dbo.TransizioneStati
  VALUES (10, 1, 19, 30)
INSERT INTO dbo.TransizioneStati
  VALUES (10, 1, 29, 28)
INSERT INTO dbo.TransizioneStati
  VALUES (10, 1, 30, 29)
INSERT INTO dbo.TransizioneStati
  VALUES (10, 2, 1, 1)
INSERT INTO dbo.TransizioneStati
  VALUES (10, 3, 1, 1)
INSERT INTO dbo.TransizioneStati
  VALUES (10, 3, 12, 11)
INSERT INTO dbo.TransizioneStati
  VALUES (10, 4, 1, 1)
INSERT INTO dbo.TransizioneStati
  VALUES (10, 4, 12, 11)
INSERT INTO dbo.TransizioneStati
  VALUES (10, 5, 1, 1)
INSERT INTO dbo.TransizioneStati
  VALUES (10, 5, 12, 11)
INSERT INTO dbo.TransizioneStati
  VALUES (10, 5, 19, 30)
INSERT INTO dbo.TransizioneStati
  VALUES (10, 6, 1, 1)
INSERT INTO dbo.TransizioneStati
  VALUES (10, 6, 12, 11)
INSERT INTO dbo.TransizioneStati
  VALUES (10, 6, 19, 30)
INSERT INTO dbo.TransizioneStati
  VALUES (10, 7, 1, 1)
INSERT INTO dbo.TransizioneStati
  VALUES (10, 7, 12, 11)
INSERT INTO dbo.TransizioneStati
  VALUES (10, 7, 19, 30)
INSERT INTO dbo.TransizioneStati
  VALUES (10, 8, 1, 1)
INSERT INTO dbo.TransizioneStati
  VALUES (10, 8, 12, 11)
INSERT INTO dbo.TransizioneStati
  VALUES (10, 8, 19, 30)
INSERT INTO dbo.TransizioneStati
  VALUES (10, 9, 1, 1)
INSERT INTO dbo.TransizioneStati
  VALUES (10, 9, 12, 11)
INSERT INTO dbo.TransizioneStati
  VALUES (10, 9, 19, 30)
INSERT INTO dbo.TransizioneStati
  VALUES (10, 10, 1, 1)
INSERT INTO dbo.TransizioneStati
  VALUES (10, 10, 12, 11)
INSERT INTO dbo.TransizioneStati
  VALUES (10, 10, 19, 30)
INSERT INTO dbo.TransizioneStati
  VALUES (10, 11, 1, 1)
INSERT INTO dbo.TransizioneStati
  VALUES (10, 11, 19, 30)
INSERT INTO dbo.TransizioneStati
  VALUES (10, 11, 29, 28)
INSERT INTO dbo.TransizioneStati
  VALUES (10, 11, 30, 29)
INSERT INTO dbo.TransizioneStati
  VALUES (10, 12, 1, 1)
INSERT INTO dbo.TransizioneStati
  VALUES (10, 12, 2, 2)
INSERT INTO dbo.TransizioneStati
  VALUES (10, 12, 3, 3)
INSERT INTO dbo.TransizioneStati
  VALUES (10, 12, 4, 4)
INSERT INTO dbo.TransizioneStati
  VALUES (10, 12, 5, 5)
INSERT INTO dbo.TransizioneStati
  VALUES (10, 12, 6, 6)
INSERT INTO dbo.TransizioneStati
  VALUES (10, 12, 7, 7)
INSERT INTO dbo.TransizioneStati
  VALUES (10, 12, 8, 8)
INSERT INTO dbo.TransizioneStati
  VALUES (10, 12, 9, 9)
INSERT INTO dbo.TransizioneStati
  VALUES (10, 12, 10, 10)
INSERT INTO dbo.TransizioneStati
  VALUES (10, 12, 12, 11)
INSERT INTO dbo.TransizioneStati
  VALUES (10, 12, 19, 30)
INSERT INTO dbo.TransizioneStati
  VALUES (10, 12, 29, 28)
INSERT INTO dbo.TransizioneStati
  VALUES (10, 12, 30, 29)
INSERT INTO dbo.TransizioneStati
  VALUES (10, 13, 1, 1)
INSERT INTO dbo.TransizioneStati
  VALUES (10, 13, 29, 28)
INSERT INTO dbo.TransizioneStati
  VALUES (10, 13, 30, 29)
INSERT INTO dbo.TransizioneStati
  VALUES (10, 14, 1, 1)
INSERT INTO dbo.TransizioneStati
  VALUES (10, 14, 29, 28)
INSERT INTO dbo.TransizioneStati
  VALUES (10, 14, 30, 29)
INSERT INTO dbo.TransizioneStati
  VALUES (10, 15, 1, 1)
INSERT INTO dbo.TransizioneStati
  VALUES (10, 15, 2, 2)
INSERT INTO dbo.TransizioneStati
  VALUES (10, 15, 3, 3)
INSERT INTO dbo.TransizioneStati
  VALUES (10, 15, 4, 4)
INSERT INTO dbo.TransizioneStati
  VALUES (10, 15, 5, 5)
INSERT INTO dbo.TransizioneStati
  VALUES (10, 15, 6, 6)
INSERT INTO dbo.TransizioneStati
  VALUES (10, 15, 7, 7)
INSERT INTO dbo.TransizioneStati
  VALUES (10, 15, 8, 8)
INSERT INTO dbo.TransizioneStati
  VALUES (10, 15, 9, 9)
INSERT INTO dbo.TransizioneStati
  VALUES (10, 15, 10, 10)
INSERT INTO dbo.TransizioneStati
  VALUES (10, 15, 12, 11)
INSERT INTO dbo.TransizioneStati
  VALUES (10, 15, 19, 30)
INSERT INTO dbo.TransizioneStati
  VALUES (10, 15, 29, 28)
INSERT INTO dbo.TransizioneStati
  VALUES (10, 15, 30, 29)
INSERT INTO dbo.TransizioneStati
  VALUES (10, 23, 1, 1)
INSERT INTO dbo.TransizioneStati
  VALUES (10, 23, 29, 28)
INSERT INTO dbo.TransizioneStati
  VALUES (10, 23, 30, 29)
INSERT INTO dbo.TransizioneStati
  VALUES (10, 24, 1, 1)
INSERT INTO dbo.TransizioneStati
  VALUES (10, 24, 29, 28)
INSERT INTO dbo.TransizioneStati
  VALUES (10, 24, 30, 29)
INSERT INTO dbo.TransizioneStati
  VALUES (10, 25, 1, 1)
INSERT INTO dbo.TransizioneStati
  VALUES (10, 25, 2, 2)
INSERT INTO dbo.TransizioneStati
  VALUES (10, 25, 3, 3)
INSERT INTO dbo.TransizioneStati
  VALUES (10, 25, 4, 4)
INSERT INTO dbo.TransizioneStati
  VALUES (10, 25, 5, 5)
INSERT INTO dbo.TransizioneStati
  VALUES (10, 25, 6, 6)
INSERT INTO dbo.TransizioneStati
  VALUES (10, 25, 7, 7)
INSERT INTO dbo.TransizioneStati
  VALUES (10, 25, 8, 8)
INSERT INTO dbo.TransizioneStati
  VALUES (10, 25, 9, 9)
INSERT INTO dbo.TransizioneStati
  VALUES (10, 25, 10, 10)
INSERT INTO dbo.TransizioneStati
  VALUES (10, 25, 12, 11)
INSERT INTO dbo.TransizioneStati
  VALUES (10, 25, 19, 30)
INSERT INTO dbo.TransizioneStati
  VALUES (10, 25, 26, 27)
INSERT INTO dbo.TransizioneStati
  VALUES (10, 25, 29, 28)
INSERT INTO dbo.TransizioneStati
  VALUES (10, 25, 30, 29)
INSERT INTO dbo.TransizioneStati
  VALUES (10, 26, 1, 1)
INSERT INTO dbo.TransizioneStati
  VALUES (10, 26, 12, 11)
INSERT INTO dbo.TransizioneStati
  VALUES (10, 26, 19, 30)
INSERT INTO dbo.TransizioneStati
  VALUES (10, 26, 29, 28)
INSERT INTO dbo.TransizioneStati
  VALUES (10, 26, 30, 29)
INSERT INTO dbo.TransizioneStati
  VALUES (10, 27, 1, 1)
INSERT INTO dbo.TransizioneStati
  VALUES (10, 27, 12, 11)
INSERT INTO dbo.TransizioneStati
  VALUES (10, 27, 19, 30)
INSERT INTO dbo.TransizioneStati
  VALUES (10, 28, 1, 1)
INSERT INTO dbo.TransizioneStati
  VALUES (10, 28, 14, 11)
INSERT INTO dbo.TransizioneStati
  VALUES (10, 29, 1, 1)
INSERT INTO dbo.TransizioneStati
  VALUES (10, 29, 14, 11)
INSERT INTO dbo.TransizioneStati
  VALUES (10, 30, 1, 1)
INSERT INTO dbo.TransizioneStati
  VALUES (10, 30, 12, 11)
INSERT INTO dbo.TransizioneStati
  VALUES (10, 30, 14, 11)
INSERT INTO dbo.TransizioneStati
  VALUES (10, 30, 26, 27)
go

commit transaction
go


set xact_abort on
go

begin transaction
go

DELETE FROM dbo.TransizioneStati WHERE IdxFamiglia=10 and IdxStato=12 and IdxTipo=15
DELETE FROM dbo.TransizioneStati WHERE IdxFamiglia=10 and IdxStato=13 and IdxTipo=16
DELETE FROM dbo.TransizioneStati WHERE IdxFamiglia=10 and IdxStato=13 and IdxTipo=21
DELETE FROM dbo.TransizioneStati WHERE IdxFamiglia=10 and IdxStato=14 and IdxTipo=17
DELETE FROM dbo.TransizioneStati WHERE IdxFamiglia=10 and IdxStato=14 and IdxTipo=20
DELETE FROM dbo.TransizioneStati WHERE IdxFamiglia=10 and IdxStato=14 and IdxTipo=22
DELETE FROM dbo.TransizioneStati WHERE IdxFamiglia=10 and IdxStato=15 and IdxTipo=18
DELETE FROM dbo.TransizioneStati WHERE IdxFamiglia=10 and IdxStato=23 and IdxTipo=23
DELETE FROM dbo.TransizioneStati WHERE IdxFamiglia=10 and IdxStato=24 and IdxTipo=24
DELETE FROM dbo.TransizioneStati WHERE IdxFamiglia=10 and IdxStato=25 and IdxTipo=15
DELETE FROM dbo.TransizioneStati WHERE IdxFamiglia=10 and IdxStato=25 and IdxTipo=25
go

commit transaction
go


set xact_abort on
go

begin transaction
go

set identity_insert dbo.LinkMenuJQM on
go

INSERT INTO dbo.LinkMenuJQM
  (idxLink, TipoLink, ordine, Testo, NavigateUrl, icona)
  VALUES (12, N'DetMacc', 5, N'Commenti', N'~/Commenti.aspx', N'star')
INSERT INTO dbo.LinkMenuJQM
  (idxLink, TipoLink, ordine, Testo, NavigateUrl, icona)
  VALUES (13, N'EditMacch', 5, N'Commenti', N'~/Commenti.aspx', N'star')
go

set identity_insert dbo.LinkMenuJQM off
go

commit transaction
go






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

SELECT  TOP 10 * FROM LogUpdateDb ORDER BY Versione DESC
GO

-- 5 sec su db SteamWare