﻿set xact_abort on;
go

begin transaction;
go

set ANSI_NULLS on;
go

/*************************************
* Function f_lastTempoTecnico
* 	calcola il tempo tecnico per un impianto dato idxMacchina e intervallo di tempo x filtraggio
*	utilizza migliori 10 tempi nell'intervallo e fa media
*
* modif.:	S.E.L.
* il:		2011.03.30
**************************************/
alter FUNCTION f_lastTempoTecnico
(
	@idxMacchina NVARCHAR(50),
	@finestraOre INT
)
RETURNS DECIMAL(18,8)
AS

	
BEGIN
	DECLARE @TcTecnico AS DECIMAL (18,8) 
	;WITH LastTempi AS
	(
		SELECT TOP 5 *
		FROM TempiCicloRilevati
		WHERE IdxMacchina = @idxMacchina
		AND		DataOraRif >= DATEADD(HH,-@finestraOre,getdate())
		ORDER BY TCMedio
	)
	
	SELECT @TcTecnico = ISNULL(MIN(TcMedio),0) FROM LastTempi
	--SELECT @TcTecnico = AVG(TcMedio) FROM LastTempi
	RETURN @TcTecnico
END
go

commit;
go


set xact_abort on;
go

begin transaction;
go

set ANSI_NULLS on;
go

/*************************************
* STORED PROCEDURE stp_repDonati_getDatiProdMacchina
* 	restituisce i dati di produzione di una macchina per l'ULTIMO ODL
*
* modif.:	S.E.L. - 2012.03.08
**************************************/
alter PROCEDURE stp_repDonati_getDatiProdMacchina
(
	@idxMacchina NVARCHAR(50)
)
AS


-- calcolo codice articolo
DECLARE @CodArticolo NVARCHAR (50)
SET @CodArticolo = ( 
					SELECT CodArticolo FROM Kanban k
					INNER JOIN StatoMacchine sm ON k.MatricolaKanban=sm.MatricolaKanban
					WHERE sm.IdxMacchina = @idxMacchina
					)
-- calcolo il codice operatore
DECLARE @CodOperatore INT
SET @CodOperatore = ( 
					SELECT MatrOpr FROM StatoMacchine 
					WHERE IdxMacchina = @idxMacchina
					)
-- calcolo il codice ODL
DECLARE @idxODL INT
SET @idxODL =	( 
					SELECT idxODL FROM ODL
					WHERE CodArticolo = @CodArticolo AND IdxMacchina = @idxMacchina AND (ISNULL(DataFine,DATEADD(hh,1,GETDATE())) > GETDATE())
				)

					
DECLARE @PezziConf INT
SET @PezziConf =	( 
					SELECT ISNULL(SUM(TotPzProd),0) FROM DatiProduzione 
					WHERE idxODL = @idxOdl
					)
										
DECLARE @PezziLanciati INT
SET @PezziLanciati =( 
					SELECT ISNULL(SUM(NumPezzi),0) FROM ODL 
					WHERE idxODL = @idxOdl
					)

DECLARE @TCAss DECIMAL(18,8)
SET @TCAss =		( 
					SELECT ISNULL(SUM(TCAssegnato),0) FROM ODL 
					WHERE idxODL = @idxOdl
					)

-- dato l'ODL calcolo il TC Medio ed i pezzi prodotti per l'ODL
DECLARE @inizioOdl DATETIME
SET @inizioOdl =	( 
					SELECT DataInizio FROM ODL 
					WHERE idxODL = @idxOdl
					)

DECLARE @PezziProd INT
SET @PezziProd =	( 
					SELECT COUNT(*) FROM TempiCicloRilevati
					WHERE	DataOraRif >= @inizioOdl
					AND		idxMacchina = @idxMacchina
					)
					

/****************************************************
* Calcolo tempi apertura confermati
****************************************************/
-- calcolo i tempi di apertura: TempoON (Verde + giallo + rosso)
DECLARE @TempoOn DECIMAL(18,8)
SET @TempoOn =		( 
					SELECT ISNULL(SUM(Tempo),0) FROM DatiProduzione 
					WHERE ClasseTempo NOT IN ('T_OFF', 'T_OFF_ND') AND idxODL = @idxOdl
					)
					
-- calcolo i tempi di apertura: TempoAuto (Verde + giallo) - precedente meno "T_FermoRosso"
DECLARE @TempoAuto DECIMAL(18,8)
SET @TempoAuto =	( 
					SELECT @TempoOn - ISNULL(SUM(Tempo),0) FROM DatiProduzione 
					WHERE ClasseTempo = 'T_FermoRosso' AND idxODL = @idxOdl
					)
					
-- calcolo i tempi di apertura: TempoRun (Verde)
DECLARE @TempoRun DECIMAL(18,8)
SET @TempoRun =		( 
					SELECT ISNULL(SUM(Tempo),0) FROM DatiProduzione 
					WHERE ClasseTempo = 'T_AutoRun' AND idxODL = @idxOdl
					)

/****************************************************
* 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 >= @inizioOdl 
					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 >= @inizioOdl 
					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 >= @inizioOdl 
					AND		IdxMacchina = @idxMacchina
					)

DECLARE @numPezzi INT

/****************************************************
* Calcolo i TEMPI CICLO confermati
****************************************************/

-- DIVISIONE PER ZERO: controllo pezzi conf > 0
SET @numPezzi = @PezziConf - 1 -- divido per n-1 per avere numIntervalli = numPezzi
IF(@numPezzi < 1) SET @numPezzi = 1

DECLARE @TCMed DECIMAL(18,8)
SET @TCMed =		( 
					SELECT @TempoOn * 60 / @numPezzi -- tempo in ore
					)	
DECLARE @TCLav DECIMAL(18,8)
SET @TCLav =		( 
					SELECT @TempoAuto * 60 / @numPezzi -- tempo in ore
					)	
DECLARE @TCEff DECIMAL(18,8) -- è la media degli ultimi 10 migliori tempi minimi nell'ultima giornata
SET @TCEff =		( 
						SELECT @TempoRun * 60 / @numPezzi -- tempo in ore
					)					

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

-- DIVISIONE PER ZERO: controllo pezzi prod > 0...
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 @CodArticolo as CodArticolo, @PezziLanciati as PezziLanciati, @PezziProd as PezziProd, @PezziConf as PezziConf, @TCAss AS TCAssegnato, @CodOperatore AS CodOperatore, @TempoOn AS TempoOn, @TempoAuto AS TempoAuto, @TempoRun AS TempoRun, @TCMed AS TCMedio, @TCLav AS TCLav, @TCEff AS TCEff, @TCMedRT AS TCMedioRT, @TCLavRT AS TCLavRT, @TCEffRT AS TCEffRT


RETURN
go

/*************************************
* STORED PROCEDURE stp_repDonati_getLastStatoDurataMacchina
* 	restituisce l'ultimo stato di una macchina e la durata 
*		andando a filtrare gli eventi sotto una soglia indicata @minDurata (in minuti)
*		e quindi sommando 
*
* modif.:	S.E.L. - 2012.03.08
**************************************/
alter PROCEDURE stp_repDonati_getLastStatoDurataMacchina
(
	@idxMacchina NVARCHAR(50),
	@minDurata	FLOAT
)
AS

-- calcolo codice articolo
DECLARE @idxStato INT
SET		@idxStato	 =	(
					SELECT TOP 1 ISNULL(IdxStato,0) 
						FROM	DiarioDiBordo 
						WHERE	idxMacchina = @idxMacchina 
						--AND ISNULL(durataMinuti, 0) > @minDurata
						ORDER BY	InizioStato DESC
					)
-- calcolo durata filtrata... ovvero evento più recente NON dello stato indicato (changed)
DECLARE @lastChTime DATETIME
SET		@lastChTime =	( 
					SELECT TOP 1 ISNULL(inizioStato, GetDate()) 
						FROM	DiarioDiBordo 
						WHERE	idxMacchina = @idxMacchina
						AND		idxStato <> @idxStato 
						AND ISNULL(durataMinuti, 0) > @minDurata
						ORDER BY	InizioStato DESC
					)

DECLARE	@timeMinuti FLOAT
SET		@timeMinuti =	( SELECT DATEDIFF(n, @lastChTime, GetDate()) )
					
SELECT @idxStato AS idxStato, @timeMinuti AS Minuti


RETURN
go

commit;
go


set xact_abort on;
go

begin transaction;
go

set ANSI_NULLS on;
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) / @PezziProd, 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


set ANSI_NULLS on;
go

/*************************************
* Function f_TC_60-100
* 	converte il tempo in min e sec (60) 
*	in minuti centesimali (100) 
*
* modif.:	S.E.L.
* il:		2012.03.22
**************************************/
create FUNCTION f_TC_60_100
(
	@TC_60 DECIMAL(18,8)
)
RETURNS DECIMAL(18,8)
AS

	
BEGIN
	DECLARE @TC_100 AS DECIMAL (18,8) 

	SELECT @TC_100 = FLOOR(@TC_60) + (@TC_60 - FLOOR(@TC_60)) * 100 / 60
	
	RETURN @TC_100
END
go



update ODL
set TCAssegnato = dbo.f_TC_60_100(TCAssegnato)

update DatiProduzione
set TCAssegnato = dbo.f_TC_60_100(TCAssegnato)

update TempiCicloTeorici
set TCAssegnato = dbo.f_TC_60_100(TCAssegnato)

update DatiConfermati
set TCAssegnato = dbo.f_TC_60_100(TCAssegnato)



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