﻿set xact_abort on;
go

begin transaction;
go

alter table DatiMacchine add
  insEnabled bit constraint DF_DatiMacchine_insEnabled default ((1));
go

exec sp_addextendedproperty 'MS_Description', 'definisce se l''INSERT sia abilitato per la macchina (disabilitato in fase di ricostruzione batch...)', 'SCHEMA', 'dbo', 'TABLE', 'DatiMacchine', 'COLUMN', 'insEnabled';
go

update DatiMacchine set insEnabled=((1));
go

set ANSI_NULLS on;
go

/*************************************
* STORED PROCEDURE InsStatoBatch
* 	inserimento di uno stato nel db (tab DiarioDiBordo)
*	inerimento in anagrafica a "nd" dell'operatore se matricola mancasse
*
* modif.:	S.E.L.
* il:		2008.08.07
**************************************/
alter PROCEDURE stp_DDB_InsStatoBatch
(
	@IdxMacchina varchar(50),
	@InizioStato datetime,
	@IdxStato int,
	@MatricolaKanban varchar(50),
	@Value varchar(50),
	@MatrOpr int,
	@pallet varchar(20)
)
AS
	/*************************************
	* verifico se esista operatore
	**************************************/
	DECLARE @matrOut INT = @MatrOpr + 1
	SELECT	@matrOut = ISNULL	(
						(
							SELECT MatrOpr FROM AnagraficaOperatori
							WHERE     (MatrOpr = @MatrOpr)
						),-999999
					)
	IF (@matrOut <> @MatrOpr ) -- significa che la matricola NON C'E'...
	BEGIN
		/* inserisco nuovo record */
		INSERT INTO AnagraficaOperatori(MatrOpr, Cognome, Nome)
		VALUES     (@MatrOpr,'nd (cognome)','nd (nome)')
	END
	
	-- controllo se input abilitato
	DECLARE	@insEnabled BIT
	SET		@insEnabled = ( SELECT insEnabled FROM DatiMacchine WHERE IdxMacchina = @IdxMacchina )

	-- inserisco SOLO SE è abilitato input x quella macchina
	IF(@insEnabled = 1)
	BEGIN
		/* inserisco valori */
		INSERT INTO DiarioDiBordo
							  (IdxMacchina, InizioStato, FineStato, IdxStato, MatricolaKanban, Value, MatrOpr, pallet)
		VALUES     (@IdxMacchina, @InizioStato, NULL, @IdxStato, @MatricolaKanban, @Value, @MatrOpr, @pallet) 
	END
	
	RETURN
go

/*************************************
* STORED PROCEDURE InsStato
* 	inserimento di uno stato nel db (tab DiarioDiBordo)
*	inerimento in anagrafica a "nd" dell'operatore se matricola mancasse
*
* modif.:	S.E.L.
* il:		2008.08.07
**************************************/
alter PROCEDURE stp_DDB_InsStato 
(
	@IdxMacchina NVARCHAR(50),
	@IdxStato INT,
	@MatricolaKanban NVARCHAR(50),
	@Value NVARCHAR(50),
	@MatrOpr INT,
	@pallet NVARCHAR(20)
)
AS
	/*************************************
	* verifico se esista operatore
	**************************************/
	DECLARE @matrOut INT = @MatrOpr + 1
	SELECT	@matrOut = ISNULL	(
						(
							SELECT MatrOpr FROM AnagraficaOperatori
							WHERE     (MatrOpr = @MatrOpr)
						),-999999
					)
	IF (@matrOut <> @MatrOpr ) -- significa che la matricola NON C'E'...
	BEGIN
		/* inserisco nuovo record */
		INSERT INTO AnagraficaOperatori(MatrOpr, Cognome, Nome)
		VALUES     (@MatrOpr,'nd (cognome)','nd (nome)')
	END
	
	-- controllo se input abilitato
	DECLARE	@insEnabled BIT
	SET		@insEnabled = ( SELECT insEnabled FROM DatiMacchine WHERE IdxMacchina = @IdxMacchina )

	-- inserisco SOLO SE è abilitato input x quella macchina
	IF(@insEnabled = 1)
	BEGIN
		/* inserisco valori */
		INSERT INTO DiarioDiBordo
							  (IdxMacchina, InizioStato, FineStato, IdxStato, MatricolaKanban, Value, MatrOpr, pallet)
		VALUES     (@IdxMacchina, GETDATE(), NULL, @IdxStato, @MatricolaKanban, @Value, @MatrOpr, @pallet) 
	END
	
	RETURN
go

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

DBCC SHOWCONTIG(EventList)
DBCC SHOWCONTIG(DiarioDiBordo)

EXEC USP_DisableEnableNonClusteredIndexes 'MoonPro',null, 1 --disabilito indici

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

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

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

-- ipotizzo macchina inizialmente in stato richiesto (default: 1 = pronta) e quindi imposto stato current a quello iniziale richiesto...
SET		@currIdxStato = @idxStatoStart

-- DISATTIVO inserimento in DiarioDiBordo per la macchina indicata
UPDATE	DatiMacchine
SET		insEnabled = 0
WHERE	IdxMacchina = @IdxMacchina

-- leggo la tabella degli eventi con cursore x percorrere i dati...
DECLARE event2proc CURSOR FOR 
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;

WHILE @@FETCH_STATUS = 0
	BEGIN
		-- calcolo l'eventuale NUOVO idxStato
		SET	@nextIdxStato = ( SELECT 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
		END

		-- Get the next values
		FETCH NEXT FROM event2proc 
		INTO @InizioStato, @IdxTipo, @MatricolaKanban, @Value, @MatrOpr, @pallet;
	END
CLOSE event2proc;
DEALLOCATE event2proc;

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

PRINT 'concluso UPDATE tabelle...'


DBCC SHOWCONTIG(EventList)
DBCC SHOWCONTIG(DiarioDiBordo)
EXEC USP_DisableEnableNonClusteredIndexes 'MoonPro',null, 2 --riattivo indici


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

/*
--shrink del db
PRINT 'compatto DB...'
DBCC SHRINKDATABASE (MoonPro)
*/

RETURN
go

commit;
go



set xact_abort on;
go

begin transaction;
go

set ANSI_NULLS on;
go

/*************************************
* STORED PROCEDURE stp_TS_getByIdxMacchIdxTipoEv
* 	restituisce una riga transizione stati/eventi data macchina ed evento (confrontando lo stato attuale della macchina)
*
* modif.:	S.E.L. - 2012.11.23
**************************************/
create PROCEDURE stp_TS_getByIdxMacchIdxTipoEv
(
	@IdxMacchina	NVARCHAR(50),
	@IdxTipo		INT
)
AS


SELECT     TransizioneStati.IdxFamiglia, TransizioneStati.IdxStato, TransizioneStati.IdxTipo, TransizioneStati.next_IdxStato
FROM         TransizioneStati INNER JOIN
Macchine2FamiglieMacchine ON TransizioneStati.IdxFamiglia = Macchine2FamiglieMacchine.IdxFamiglia INNER JOIN
Macchine ON Macchine2FamiglieMacchine.IdxMacchina = Macchine.IdxMacchina INNER JOIN
StatoMacchine ON Macchine.IdxMacchina = StatoMacchine.IdxMacchina AND TransizioneStati.IdxStato = StatoMacchine.IdxStato
WHERE     (Macchine.IdxMacchina = @IdxMacchina) AND (TransizioneStati.IdxTipo = @IdxTipo) AND (TransizioneStati.IdxFamiglia <> 1)
                    
RETURN
go

commit;
go



set xact_abort on;
go

begin transaction;
go

set ANSI_NULLS on;
go

/***************************************************
* Trigger trg_EV_filtroIns
*
* filtro operazioni scrittura su tab EventList:
* - scrive un NUOVO recordo SOLO SE la chiave differisce per almeno 2 valori
*
* modificato: S.E.L.
* 2012.11.26
*
***************************************************/
create TRIGGER trg_EV_filtroIns
ON EventList
INSTEAD OF INSERT
AS

IF (@@ROWCOUNT = 1)
BEGIN
	DECLARE	@IdxMacchina AS NVARCHAR(50)
	DECLARE	@InizioStato AS DATETIME
	DECLARE	@IdxTipo	 AS INT
	DECLARE @numMin		 AS INT=4
	DECLARE @trovati	 AS INT=0

	SELECT	@IdxMacchina=IdxMacchina, @InizioStato=InizioStato, @IdxTipo=IdxTipo FROM INSERTED

	;WITH myCTE AS
	(
		SELECT	TOP(@numMin) ev.*
		FROM	EventList ev 
		INNER JOIN INSERTED i ON ev.IdxMacchina=i.IdxMacchina
		ORDER BY InizioStato DESC
	)
	SELECT @trovati=COUNT(IdxTipo) FROM myCTE WHERE idxTipo = @IdxTipo

	-- se tutte le righe sono con stesso tipo...

	IF(@trovati < @numMin)
	BEGIN
		INSERT INTO EventList
		SELECT * FROM INSERTED
	END
END

go

alter table EventList disable trigger trg_doActions;
go

commit;
go






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

SELECT  TOP 10 * FROM LogUpdateDb ORDER BY Versione DESC
GO