Files
Samuele E. Locatelli 2b1479f315 spostamento update SQL
2018-05-03 15:06:47 +02:00

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