﻿set xact_abort on;
go

begin transaction;
go

set ANSI_NULLS on;
go

-- ================================================
-- Author:		Samuele E. Locatelli
-- Create date: 2012.11.23
--
-- Description:	rigenerazione del diario di bordo 
-- a partire da macchina eventi/stati + EventList
-- ================================================
alter 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)   = '';
DECLARE @FlgAggTempiC       CHAR(1)        = 'N';   -- Y/N = elabora o meno i tempi ciclo

-- 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
            -- controllo se devo aggiornare i Tempi ciclo in base allo stato macchina ( se null resta precedente )
            SELECT @FlgAggTempiC = ( CASE Semaforo WHEN 'V' THEN 'Y' ELSE 'N' END ) FROM dbo.AnagraficaStati 
                                     WHERE IdxStato = @currIdxStato
            EXEC dbo.stp_EL_processaEvento @IdxTipo, @idxMacchina, @MatricolaKanban, @InizioStato, @NumPz, 'N', @FlgAggTempiC
          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


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.:	
**************************************/
alter 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
    @FlgAggTempiC CHAR(1) = 'N'  -- Y/N = elabora o meno i tempi ciclo
)
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
   
    ---- SOLO se lo stato della macchina è VERDE ( lavora ) devo aggiornare i tempi ciclo
    ---- NON VA BENE QUANDO FA RICALCOLO NON C'é NULL
    --IF EXISTS ( SELECT D.IdxStato FROM dbo.DiarioDiBordo AS D
    --            INNER JOIN dbo.AnagraficaStati AS S ON d.idxStato = S.IdxStato
    --            WHERE d.IdxMacchina = @IdxMacchina AND d.FineStato IS NULL AND s.Semaforo = 'V' )
    --   SET @FlgAggTempiC = 'Y'

	IF (@TabAzione <> '' AND @Azione <> '')
		BEGIN
			/* azioni richieste: seconda dei casi eseguo... */
			
			/******************************************
			*
			* Calcolo tempo ciclo per INIZIO
			*
			******************************************/		
			IF(@TabAzione = 'TempiCicloRilevati' AND @Azione = 'Insert' AND @FlgAggTempiC = 'Y' )
				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' AND @FlgAggTempiC = 'Y' )
				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' AND @FlgAggTempiC = 'Y' )
				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


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
    DECLARE @FlgAggTempiC CHAR(1) = 'N'  -- Y/N = elabora o meno i tempi ciclo


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

    -- SOLO SE lo stato della macchina è VERDE ( lavora ) devo aggiornare i tempi ciclo
    IF EXISTS ( SELECT M.IdxStato FROM dbo.StatoMacchine AS M
                INNER JOIN dbo.AnagraficaStati AS S ON M.idxStato = S.IdxStato
                WHERE M.IdxMacchina = @IdxMacchina AND s.Semaforo = 'V' )
      SET @FlgAggTempiC = 'Y'

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

/*  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

set xact_abort on;
go

begin transaction;
go

set ANSI_NULLS on;
go

-- ================================================
-- Author:		Samuele E. Locatelli
-- Create date: 2012.11.23
--
-- Description:	rigenerazione del diario di bordo 
-- a partire da macchina eventi/stati + EventList
-- ================================================
alter 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 o a ultimo evento in diario di bordo
SET @fine = ( SELECT MAX(InizioStato) FROM DiarioDiBordo
                   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)   = '';
DECLARE @FlgAggTempiC       CHAR(1)        = 'N';   -- Y/N = elabora o meno i tempi ciclo

-- 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
            -- controllo se devo aggiornare i Tempi ciclo in base allo stato macchina ( se null resta precedente )
            SELECT @FlgAggTempiC = ( CASE Semaforo WHEN 'V' THEN 'Y' ELSE 'N' END ) FROM dbo.AnagraficaStati 
                                     WHERE IdxStato = @currIdxStato
            EXEC dbo.stp_EL_processaEvento @IdxTipo, @idxMacchina, @MatricolaKanban, @InizioStato, @NumPz, 'N', @FlgAggTempiC
          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








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

SELECT  TOP 10 * FROM LogUpdateDb ORDER BY Versione DESC
GO
