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