445 lines
12 KiB
Transact-SQL
445 lines
12 KiB
Transact-SQL
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
|