840 lines
32 KiB
Transact-SQL
840 lines
32 KiB
Transact-SQL
set xact_abort on;
|
|
go
|
|
|
|
begin transaction;
|
|
go
|
|
|
|
set ANSI_NULLS on;
|
|
go
|
|
|
|
-- ================================================
|
|
-- Author: Samuele E. Locatelli
|
|
-- Create date: 2012.11.23
|
|
--
|
|
-- Description: rigenerazione del diario di bordo
|
|
-- a partire da macchina eventi/stati + EventList
|
|
-- ================================================
|
|
alter PROCEDURE man.stp_ricalcolaDatiMacchinaFromDate
|
|
(
|
|
@idxMacchina NVARCHAR(50),
|
|
@inizio DATETIME,
|
|
@idxStatoStart INT = 1
|
|
)
|
|
AS
|
|
|
|
SET NOCOUNT ON;
|
|
|
|
DECLARE @fine DATETIME
|
|
|
|
--DBCC SHOWCONTIG(EventList)
|
|
--DBCC SHOWCONTIG(DiarioDiBordo)
|
|
|
|
/* DA USARE ? Verificare */
|
|
--DECLARE @Database AS SYSNAME;
|
|
--SET @Database = DB_NAME()
|
|
--EXEC USP_DisableEnableNonClusteredIndexes @Database ,null, 1 -- disabilito indici
|
|
|
|
-- update SAM 2013.10.24: "torno indietro" di 2 eventi rispetto alal data ora indicata come start, SE CI SONO
|
|
SELECT @inizio = ISNULL(MIN(InizioStato),@inizio) FROM
|
|
(
|
|
SELECT TOP 3 InizioStato
|
|
FROM DiarioDiBordo
|
|
WHERE IdxMacchina = @idxMacchina AND InizioStato < @inizio
|
|
ORDER BY InizioStato DESC
|
|
) AS tbl
|
|
|
|
|
|
-- DISATTIVO inserimento in DiarioDiBordo per la macchina indicata
|
|
-- DEVE disattivare anche il caricamento degli eventi
|
|
UPDATE DatiMacchine
|
|
SET insEnabled = 0
|
|
WHERE IdxMacchina = @IdxMacchina
|
|
|
|
-- devo sempre rielaborare tutti gli eventi fino a dataora odierna
|
|
SET @fine = ( SELECT MAX(InizioStato) FROM EventList
|
|
WHERE idxMacchina = @idxMacchina )
|
|
|
|
-- svuoto dati che vado a sostituire
|
|
PRINT 'svuoto TempiCicloRilevati per periodo indicato...'
|
|
DELETE FROM TempiCicloRilevati WHERE idxMacchina = @idxMacchina AND DataOraRif BETWEEN @inizio AND @fine
|
|
|
|
PRINT 'svuoto DiarioDiBordo per periodo indicato...'
|
|
EXEC stp_DDB_deleteMacchinaPeriodo @idxMacchina, @inizio, @fine -- cancella diario di bordo
|
|
|
|
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
|
|
DECLARE @TabAzione NVARCHAR(50) = '';
|
|
DECLARE @Azione NVARCHAR(50) = '';
|
|
DECLARE @FlgAggTempiC CHAR(1) = 'N'; -- Y/N = elabora o meno i tempi ciclo
|
|
|
|
-- calcolo famiglia macchina!
|
|
SET @IdxFamiglia = ( SELECT IdxFamiglia FROM Macchine2FamiglieMacchine WHERE idxMacchina = @idxMacchina )
|
|
|
|
-- Recupero stato precedente, altrimenti ipotizzo macchina inizialmente in stato richiesto (default: 1 = pronta) e quindi imposto stato current a quello iniziale richiesto...
|
|
SET @currIdxStato = ISNULL( ( SELECT TOP 1 IdxStato FROM DiarioDiBordo WHERE IdxMacchina = @idxMacchina AND InizioStato < @inizio
|
|
ORDER BY InizioStato DESC ) , @idxStatoStart)
|
|
|
|
-- verifico i record elaborati
|
|
SELECT COUNT(*)
|
|
FROM EventList AS e
|
|
LEFT JOIN dbo.AnagraficaEventi AS a ON e.idxTipo = a.IdxTipo
|
|
WHERE e.IdxMacchina = @idxMacchina
|
|
AND e.InizioStato BETWEEN @inizio AND @fine
|
|
|
|
-- leggo la tabella degli eventi con cursore x percorrere i dati...
|
|
DECLARE event2proc CURSOR FOR
|
|
SELECT e.InizioStato, e.IdxTipo, e.MatricolaKanban, e.Value, e.MatrOpr, e.pallet,
|
|
a.TabAzione, a.Azione
|
|
FROM EventList AS e
|
|
LEFT JOIN dbo.AnagraficaEventi AS a ON e.idxTipo = a.IdxTipo
|
|
WHERE e.IdxMacchina = @idxMacchina
|
|
AND e.InizioStato BETWEEN @inizio AND @fine
|
|
ORDER BY e.InizioStato;
|
|
/*
|
|
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, @TabAzione, @Azione;
|
|
|
|
DECLARE @NumPz INT = 1;
|
|
DECLARE @ContaInsert INT = 0;
|
|
|
|
WHILE @@FETCH_STATUS = 0
|
|
BEGIN
|
|
|
|
IF ( ISNULL(@TabAzione,'') <> '' AND ISNULL(@Azione,'') <> '')
|
|
BEGIN
|
|
SET @NumPz = CASE WHEN (ISNUMERIC(@Value)=1) THEN @Value ELSE 1 END
|
|
-- controllo se devo aggiornare i Tempi ciclo in base allo stato macchina ( se null resta precedente )
|
|
SELECT @FlgAggTempiC = ( CASE Semaforo WHEN 'V' THEN 'Y' ELSE 'N' END ) FROM dbo.AnagraficaStati
|
|
WHERE IdxStato = @currIdxStato
|
|
EXEC dbo.stp_EL_processaEvento @IdxTipo, @idxMacchina, @MatricolaKanban, @InizioStato, @NumPz, 'N', @FlgAggTempiC
|
|
END
|
|
|
|
-- calcolo l'eventuale NUOVO idxStato
|
|
SET @nextIdxStato = 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
|
|
SET @ContaInsert = @ContaInsert + 1
|
|
END
|
|
|
|
-- Get the next values
|
|
FETCH NEXT FROM event2proc
|
|
INTO @InizioStato, @IdxTipo, @MatricolaKanban, @Value, @MatrOpr, @pallet, @TabAzione, @Azione;
|
|
|
|
END
|
|
CLOSE event2proc;
|
|
DEALLOCATE event2proc;
|
|
|
|
-- resetto microStato a 1
|
|
UPDATE dbo.MicroStatoMacchina
|
|
SET IdxMicroStato = 1,
|
|
InizioStato = @InizioStato,
|
|
Value = '0'
|
|
WHERE IdxMacchina = @idxMacchina
|
|
|
|
-- fa un controllo: elimina eventuali dichairazioni in DDB SE durata < 0...
|
|
DELETE FROM DiarioDiBordo WHERE DurataMinuti < 0 AND IdxMacchina = @idxMacchina
|
|
|
|
-- RI-ATTIVO inserimento in DiarioDiBordo per la macchina indicata
|
|
UPDATE DatiMacchine
|
|
SET insEnabled = 1
|
|
WHERE IdxMacchina = @IdxMacchina
|
|
|
|
PRINT 'concluso UPDATE tabelle...' + 'INSERT DiarioBordo : ' + CONVERT(VARCHAR(30),@ContaInsert)
|
|
|
|
--DBCC SHOWCONTIG(EventList)
|
|
--DBCC SHOWCONTIG(DiarioDiBordo)
|
|
--EXEC USP_DisableEnableNonClusteredIndexes @Database,null, 2 --riattivo indici
|
|
|
|
--ricostruisco indici X QUESTE TABELLE DOPPIA RICOSTRUZIONE INDICI NON NECESSARIA
|
|
--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)
|
|
|
|
RETURN
|
|
go
|
|
|
|
commit;
|
|
go
|
|
|
|
|
|
set xact_abort on;
|
|
go
|
|
|
|
begin transaction;
|
|
go
|
|
|
|
set ANSI_NULLS on;
|
|
go
|
|
|
|
/*************************************
|
|
* STORED PROCEDURE stp_EL_processaEvento
|
|
* Processa un singolo evento
|
|
*
|
|
* Note : richiamata anche nel trigger della tabella EventList
|
|
*
|
|
* modif.:
|
|
**************************************/
|
|
alter PROCEDURE stp_EL_processaEvento
|
|
(
|
|
@IdxTipo INT,
|
|
@IdxMacchina NVARCHAR(50),
|
|
@MatricolaKanban NVARCHAR(50),
|
|
@DataOra DATETIME,
|
|
@NumPz INT,
|
|
@FlgAggStato CHAR(1) = 'Y', -- Y/N = elabora o meno aggiornamento StatiMacchine e DatiMacchine
|
|
@FlgAggTempiC CHAR(1) = 'N' -- Y/N = elabora o meno i tempi ciclo
|
|
)
|
|
AS
|
|
|
|
---- parametri x test
|
|
--DECLARE @IdxTipo INT = 0
|
|
--DECLARE @IdxMacchina NVARCHAR(50)
|
|
--DECLARE @DataOra DATETIME
|
|
--DECLARE @MatricolaKanban NVARCHAR(50)
|
|
--DECLARE @TCMedio DECIMAL(18,8)
|
|
--DECLARE @NumPz INT
|
|
|
|
--SET @IdxTipo = ( SELECT i.IdxTipo FROM inserted i )
|
|
--SET @IdxMacchina = ( SELECT i.IdxMacchina FROM inserted i )
|
|
--SET @DataOra = ( SELECT i.InizioStato FROM inserted i )
|
|
--SET @MatricolaKanban = ( SELECT i.MatricolaKanban FROM inserted i )
|
|
--SET @NumPz = ( SELECT CASE WHEN (ISNUMERIC(value)=1) THEN value ELSE 1 END FROM inserted i )
|
|
|
|
-- INIZIO DICHIARAZIONI
|
|
DECLARE @TabAzione NVARCHAR(50) = '';
|
|
DECLARE @Azione NVARCHAR(50) = '';
|
|
DECLARE @CodArticolo NVARCHAR(50) = ''
|
|
DECLARE @MatricolaKanbanOk NVARCHAR(50);
|
|
DECLARE @DataOraPrec DATETIME;
|
|
DECLARE @TCMedio DECIMAL(18,8) = 0;
|
|
|
|
/* recupero altri valori ( se non trova record lascia il valore invariato cioè = '' )*/
|
|
SELECT @TabAzione = ISNULL(TabAzione,'')
|
|
, @Azione = ISNULL(Azione,'')
|
|
FROM AnagraficaEventi WHERE IdxTipo = @IdxTipo
|
|
|
|
--SELECT @TabAzione , @Azione
|
|
|
|
---- SOLO se lo stato della macchina è VERDE ( lavora ) devo aggiornare i tempi ciclo
|
|
---- NON VA BENE QUANDO FA RICALCOLO NON C'é NULL
|
|
--IF EXISTS ( SELECT D.IdxStato FROM dbo.DiarioDiBordo AS D
|
|
-- INNER JOIN dbo.AnagraficaStati AS S ON d.idxStato = S.IdxStato
|
|
-- WHERE d.IdxMacchina = @IdxMacchina AND d.FineStato IS NULL AND s.Semaforo = 'V' )
|
|
-- SET @FlgAggTempiC = 'Y'
|
|
|
|
IF (@TabAzione <> '' AND @Azione <> '')
|
|
BEGIN
|
|
/* azioni richieste: seconda dei casi eseguo... */
|
|
|
|
/******************************************
|
|
*
|
|
* Calcolo tempo ciclo per INIZIO
|
|
*
|
|
******************************************/
|
|
IF(@TabAzione = 'TempiCicloRilevati' AND @Azione = 'Insert' AND @FlgAggTempiC = 'Y' )
|
|
BEGIN
|
|
-- recupero codice articolo
|
|
SET @CodArticolo = ( SELECT CodArticolo FROM Kanban WHERE MatricolaKanban = @MatricolaKanban )
|
|
/* calcolo tempo tra gli ultimi 2 eventi "contapezzi" */
|
|
SET @DataOraPrec = ISNULL((SELECT Top 1 InizioStato FROM EventList WHERE IdxMacchina = @IdxMacchina
|
|
AND IdxTipo = @IdxTipo AND InizioStato < @DataOra ORDER BY InizioStato DESC), @DataOra )
|
|
|
|
-- se è oltre 10 gg calcolo in secondi... 2013.8.30
|
|
IF (DATEDIFF(DD, @DataOraPrec, @DataOra) > 10)
|
|
SET @TCMedio = ( SELECT (DATEDIFF(s, @DataOraPrec, @DataOra) / 60.00 ) ) --calcolo in secondi
|
|
ELSE
|
|
SET @TCMedio = ( SELECT (DATEDIFF(ms, @DataOraPrec, @DataOra) / 60000.00 ) )
|
|
|
|
/* inserisco riga di tempo ciclo */
|
|
INSERT INTO TempiCicloRilevati
|
|
VALUES(@IdxMacchina, @CodArticolo, @DataOra, @TCMedio, @NumPz)
|
|
END
|
|
/******************************************
|
|
*
|
|
* Calcolo tempo ciclo con logica stop/start
|
|
*
|
|
******************************************/
|
|
ELSE IF(@TabAzione = 'TempiCicloRilevati' AND @Azione = 'Stop2StartCiclo' AND @FlgAggTempiC = 'Y' )
|
|
BEGIN
|
|
/* prendo la matricola dall'evento inizio (precedente) */
|
|
SET @MatricolaKanbanOk = ISNULL((SELECT Top 1 MatricolaKanban FROM EventList WHERE IdxMacchina = @IdxMacchina AND IdxTipo = @IdxTipo - 1 AND InizioStato < @DataOra ORDER BY InizioStato DESC), @MatricolaKanban )
|
|
|
|
-- calcolare num pezzi da codice...
|
|
SET @CodArticolo = ( SELECT CodArticolo FROM Kanban WHERE MatricolaKanban = @MatricolaKanbanOk )
|
|
/* calcolo tempo tra eventi "contapezzi" inizio - fine NB: idxEvento per fine è idxEvento inizio + 1 ... HARD CODED!!! */
|
|
SET @DataOraPrec = ISNULL((SELECT Top 1 InizioStato FROM EventList WHERE IdxMacchina = @IdxMacchina AND IdxTipo = @IdxTipo - 1 AND InizioStato < @DataOra ORDER BY InizioStato DESC), @DataOra )
|
|
|
|
-- se è oltre 10 gg calcolo in secondi... 2013.8.30
|
|
IF (DATEDIFF(DD, @DataOraPrec, @DataOra) > 10)
|
|
SET @TCMedio = ( DATEDIFF(s, @DataOraPrec, @DataOra) / 60.00 ) --calcolo in secondi
|
|
ELSE
|
|
SET @TCMedio = ( DATEDIFF(ms, @DataOraPrec, @DataOra) / 60000.00 )
|
|
|
|
/* inserisco riga di tempo ciclo */
|
|
INSERT INTO TempiCicloRilevati
|
|
VALUES(@IdxMacchina, @CodArticolo, @DataOra, @TCMedio, @NumPz)
|
|
END
|
|
/******************************************
|
|
*
|
|
* calcolo tempo ciclo con logica stop/stop
|
|
*
|
|
******************************************/
|
|
ELSE IF(@TabAzione = 'TempiCicloRilevati' AND @Azione = 'Stop2StopCiclo' AND @FlgAggTempiC = 'Y' )
|
|
BEGIN
|
|
/* prendo la matricola dall'evento inizio (precedente) */
|
|
SET @MatricolaKanbanOk = ISNULL((SELECT Top 1 MatricolaKanban FROM EventList WHERE IdxMacchina = @IdxMacchina AND IdxTipo = @IdxTipo AND InizioStato < @DataOra ORDER BY InizioStato DESC), @MatricolaKanban )
|
|
|
|
-- calcolare num pezzi da codice...
|
|
SET @NumPz = ( SELECT PzPallet FROM Kanban WHERE MatricolaKanban = @MatricolaKanbanOk )
|
|
SET @CodArticolo = ( SELECT CodArticolo FROM Kanban WHERE MatricolaKanban = @MatricolaKanbanOk )
|
|
/* calcolo tempo tra eventi "contapezzi" fine - fine NB: idxEvento per fine è idxEvento inizio + 1 ... HARD CODED!!! */
|
|
SET @DataOraPrec = ISNULL( (SELECT Top 1 InizioStato FROM EventList WHERE IdxMacchina = @IdxMacchina AND IdxTipo = @IdxTipo AND InizioStato < @DataOra ORDER BY InizioStato DESC), @DataOra )
|
|
|
|
-- se è oltre 10 gg calcolo in secondi... 2013.8.30
|
|
IF (DATEDIFF(DD, @DataOraPrec, @DataOra) > 10)
|
|
SET @TCMedio = ( DATEDIFF(s, @DataOraPrec, @DataOra) / 60.00 ) --calcolo in secondi
|
|
ELSE
|
|
SET @TCMedio = ( DATEDIFF(ms, @DataOraPrec, @DataOra) / 60000.00 )
|
|
|
|
/* inserisco riga di tempo ciclo */
|
|
INSERT INTO TempiCicloRilevati
|
|
VALUES(@IdxMacchina, @CodArticolo, @DataOra, @TCMedio, @NumPz)
|
|
END
|
|
|
|
/******************************************
|
|
*
|
|
* Aggiorno kanban in dati macchine per
|
|
* INIZIO ATTREZZAGGIO
|
|
*
|
|
******************************************/
|
|
ELSE IF(@TabAzione = 'DatiMacchine' AND @Azione = 'Inizio' AND @FlgAggStato = 'Y')
|
|
BEGIN
|
|
/* aggiorno riga di dati macchina */
|
|
UPDATE DatiMacchine
|
|
SET kanban_A = @MatricolaKanban,
|
|
kanban_B = @MatricolaKanban
|
|
WHERE idxMacchina = @IdxMacchina
|
|
/* aggiorno stato macchina */
|
|
UPDATE StatoMacchine
|
|
SET MatricolaKanban = @MatricolaKanban
|
|
WHERE idxMacchina = @IdxMacchina
|
|
/* aggiorno dati kanban statoMacchine... */
|
|
UPDATE StatoMacchine
|
|
SET KanbanCode = k.KanbanCode, TempoCicloBase = k.TempoCicloBase, PzPalletProd = k.PzPallet
|
|
FROM Kanban AS k
|
|
INNER JOIN StatoMacchine ON k.MatricolaKanban = StatoMacchine.MatricolaKanban
|
|
WHERE (StatoMacchine.idxMacchina = @IdxMacchina)
|
|
END
|
|
/******************************************
|
|
*
|
|
* Aggiorno kanban in dati macchine per
|
|
* FINE PRODUZIONE
|
|
*
|
|
******************************************/
|
|
ELSE IF(@TabAzione = 'DatiMacchine' AND @Azione = 'Fine' AND @FlgAggStato = 'Y')
|
|
BEGIN
|
|
/* calcolo valori */
|
|
SET @MatricolaKanban = 'KAND' -- kanban non definito !!!HARD CODED!!!
|
|
/* aggiorno riga di dati macchina */
|
|
UPDATE DatiMacchine
|
|
SET kanban_A = @MatricolaKanban,
|
|
kanban_B = @MatricolaKanban
|
|
WHERE idxMacchina = @IdxMacchina
|
|
/* aggiorno stato macchina */
|
|
UPDATE StatoMacchine
|
|
SET MatricolaKanban = @MatricolaKanban
|
|
WHERE idxMacchina = @IdxMacchina
|
|
/* aggiorno dati kanban statoMacchine... */
|
|
UPDATE StatoMacchine
|
|
SET KanbanCode = k.KanbanCode, TempoCicloBase = k.TempoCicloBase, PzPalletProd = k.PzPallet
|
|
FROM Kanban AS k INNER JOIN StatoMacchine ON k.MatricolaKanban = StatoMacchine.MatricolaKanban
|
|
WHERE (StatoMacchine.idxMacchina = @IdxMacchina)
|
|
|
|
END
|
|
END
|
|
|
|
RETURN
|
|
go
|
|
|
|
commit;
|
|
go
|
|
|
|
|
|
set xact_abort on;
|
|
go
|
|
|
|
begin transaction;
|
|
go
|
|
|
|
set ANSI_NULLS on;
|
|
go
|
|
|
|
/***************************************************
|
|
* Trigger trg_doActions
|
|
*
|
|
* processa eventuali azioni legate ad un inserimento evento
|
|
*
|
|
* modificato: S.E.L.
|
|
* 2011.05.18
|
|
*
|
|
***************************************************/
|
|
alter TRIGGER trg_doActions
|
|
ON EventList
|
|
FOR INSERT
|
|
AS
|
|
/* dichiarazione variabili */
|
|
DECLARE @IdxTipo INT
|
|
DECLARE @TabAzione NVARCHAR(50)
|
|
DECLARE @Azione NVARCHAR(50)
|
|
DECLARE @IdxMacchina NVARCHAR(50)
|
|
DECLARE @MatricolaKanban NVARCHAR(50)
|
|
DECLARE @MatricolaKanbanOk NVARCHAR(50)
|
|
DECLARE @CodArticolo NVARCHAR(50)
|
|
DECLARE @TCMedio DECIMAL(18,8)
|
|
DECLARE @DataOra DATETIME
|
|
DECLARE @DataOraPrec DATETIME
|
|
DECLARE @NumPz INT
|
|
DECLARE @FlgAggTempiC CHAR(1) = 'N' -- Y/N = elabora o meno i tempi ciclo
|
|
|
|
|
|
/* recupero valori dell'INSERT */
|
|
SET @IdxTipo = ( SELECT i.IdxTipo FROM inserted i )
|
|
SET @IdxMacchina = ( SELECT i.IdxMacchina FROM inserted i )
|
|
SET @MatricolaKanban = ( SELECT i.MatricolaKanban FROM inserted i )
|
|
SET @DataOra = ( SELECT i.InizioStato FROM inserted i )
|
|
SET @NumPz = ( SELECT CASE WHEN (ISNUMERIC(value)=1) THEN value ELSE 1 END FROM inserted i )
|
|
|
|
-- SOLO SE lo stato della macchina è VERDE ( lavora ) devo aggiornare i tempi ciclo
|
|
IF EXISTS ( SELECT M.IdxStato FROM dbo.StatoMacchine AS M
|
|
INNER JOIN dbo.AnagraficaStati AS S ON M.idxStato = S.IdxStato
|
|
WHERE M.IdxMacchina = @IdxMacchina AND s.Semaforo = 'V' )
|
|
SET @FlgAggTempiC = 'Y'
|
|
|
|
EXECUTE dbo.stp_EL_processaEvento @IdxTipo, @IdxMacchina, @MatricolaKanban, @DataOra, @NumPz, 'Y', @FlgAggTempiC
|
|
|
|
/* SOSTITUITA CON STORED
|
|
|
|
/* controllo se l'evento richieda azioni successive */
|
|
IF(@TabAzione <> '' AND @Azione <> '')
|
|
BEGIN
|
|
/* azioni richieste: seconda dei casi eseguo... */
|
|
|
|
/******************************************
|
|
*
|
|
* Calcolo tempo ciclo per INIZIO
|
|
*
|
|
******************************************/
|
|
IF(@TabAzione = 'TempiCicloRilevati' AND @Azione = 'Insert')
|
|
BEGIN
|
|
/* calcolo valori */
|
|
SET @DataOra = ( SELECT i.InizioStato FROM inserted i )
|
|
SET @MatricolaKanban = ( SELECT i.MatricolaKanban FROM inserted i )
|
|
SET @NumPz = ( SELECT CASE WHEN (ISNUMERIC(value)=1) THEN value ELSE 1 END FROM inserted i )
|
|
SET @CodArticolo = ( SELECT CodArticolo FROM Kanban WHERE MatricolaKanban = @MatricolaKanban )
|
|
/* calcolo tempo tra gli ultimi 2 eventi "contapezzi" */
|
|
SET @DataOraPrec = ( SELECT ISNULL((SELECT Top 1 InizioStato FROM EventList WHERE IdxMacchina = @IdxMacchina AND IdxTipo = @IdxTipo AND InizioStato < @DataOra ORDER BY InizioStato DESC), @DataOra ) )
|
|
-- se è oltre 10 gg calcolo in secondi... 2013.8.30
|
|
IF (DATEDIFF(DD, @DataOraPrec, @DataOra) > 10)
|
|
BEGIN
|
|
SET @TCMedio = ( SELECT (DATEDIFF(s, @DataOraPrec, @DataOra) / 60.00 ) ) --calcolo in secondi
|
|
END
|
|
ELSE
|
|
BEGIN
|
|
SET @TCMedio = ( SELECT (DATEDIFF(ms, @DataOraPrec, @DataOra) / 60000.00 ) )
|
|
END
|
|
-- versione vecchia (blocco se oltre 24 gg di fermo...)
|
|
--BEGIN TRY
|
|
-- /* è in millisecondi, divido per 60'000.00 x avere minuti centesimali*/
|
|
-- SET @TCMedio = ( SELECT (DATEDIFF(ms, @DataOraPrec, @DataOra) / 60000.00 ) )
|
|
--END TRY
|
|
--BEGIN CATCH
|
|
-- SET @TCMedio = ( SELECT (DATEDIFF(s, @DataOraPrec, @DataOra) / 60.00 ) ) --calcolo in secondi
|
|
--END CATCH
|
|
/* inserisco riga di tempo ciclo */
|
|
INSERT INTO TempiCicloRilevati
|
|
VALUES(@IdxMacchina, @CodArticolo, @DataOra, @TCMedio, @NumPz)
|
|
END
|
|
/******************************************
|
|
*
|
|
* Calcolo tempo ciclo con logica stop/start
|
|
*
|
|
******************************************/
|
|
ELSE IF(@TabAzione = 'TempiCicloRilevati' AND @Azione = 'Stop2StartCiclo')
|
|
BEGIN
|
|
/* calcolo valori */
|
|
SET @DataOra = ( SELECT i.InizioStato FROM inserted i )
|
|
SET @MatricolaKanban = ( SELECT i.MatricolaKanban FROM inserted i )
|
|
/* prendo la matricola dall'evento inizio (precedente) */
|
|
SET @MatricolaKanbanOk = ( SELECT ISNULL((SELECT Top 1 MatricolaKanban FROM EventList WHERE IdxMacchina = @IdxMacchina AND IdxTipo = @IdxTipo - 1 AND InizioStato < @DataOra ORDER BY InizioStato DESC), @MatricolaKanban ) )
|
|
|
|
-- calcolare num pezzi da codice...
|
|
SET @NumPz = ( SELECT CASE WHEN (ISNUMERIC(value)=1) THEN value ELSE 1 END FROM inserted i )
|
|
SET @CodArticolo = ( SELECT CodArticolo FROM Kanban WHERE MatricolaKanban = @MatricolaKanbanOk )
|
|
/* calcolo tempo tra eventi "contapezzi" inizio - fine NB: idxEvento per fine è idxEvento inizio + 1 ... HARD CODED!!! */
|
|
SET @DataOraPrec = ( SELECT ISNULL((SELECT Top 1 InizioStato FROM EventList WHERE IdxMacchina = @IdxMacchina AND IdxTipo = @IdxTipo - 1 AND InizioStato < @DataOra ORDER BY InizioStato DESC), @DataOra ) )
|
|
-- se è oltre 10 gg calcolo in secondi... 2013.8.30
|
|
IF (DATEDIFF(DD, @DataOraPrec, @DataOra) > 10)
|
|
BEGIN
|
|
SET @TCMedio = ( SELECT (DATEDIFF(s, @DataOraPrec, @DataOra) / 60.00 ) ) --calcolo in secondi
|
|
END
|
|
ELSE
|
|
BEGIN
|
|
SET @TCMedio = ( SELECT (DATEDIFF(ms, @DataOraPrec, @DataOra) / 60000.00 ) )
|
|
END
|
|
-- versione vecchia (blocco se oltre 24 gg di fermo...)
|
|
--BEGIN TRY
|
|
-- /* è in millisecondi, divido per 60'000.00 x avere minuti centesimali*/
|
|
-- SET @TCMedio = ( SELECT (DATEDIFF(ms, @DataOraPrec, @DataOra) / 60000.00 ) )
|
|
--END TRY
|
|
--BEGIN CATCH
|
|
-- SET @TCMedio = ( SELECT (DATEDIFF(s, @DataOraPrec, @DataOra) / 60.00 ) ) --calcolo in secondi
|
|
--END CATCH
|
|
/* inserisco riga di tempo ciclo */
|
|
INSERT INTO TempiCicloRilevati
|
|
VALUES(@IdxMacchina, @CodArticolo, @DataOra, @TCMedio, @NumPz)
|
|
END
|
|
/******************************************
|
|
*
|
|
* calcolo tempo ciclo con logica stop/stop
|
|
*
|
|
******************************************/
|
|
ELSE IF(@TabAzione = 'TempiCicloRilevati' AND @Azione = 'Stop2StopCiclo')
|
|
BEGIN
|
|
/* calcolo valori */
|
|
SET @DataOra = ( SELECT i.InizioStato FROM inserted i )
|
|
SET @MatricolaKanban = ( SELECT i.MatricolaKanban FROM inserted i )
|
|
/* prendo la matricola dall'evento inizio (precedente) */
|
|
SET @MatricolaKanbanOk = ( SELECT ISNULL((SELECT Top 1 MatricolaKanban FROM EventList WHERE IdxMacchina = @IdxMacchina AND IdxTipo = @IdxTipo AND InizioStato < @DataOra ORDER BY InizioStato DESC), @MatricolaKanban ) )
|
|
|
|
-- calcolare num pezzi da codice...
|
|
SET @NumPz = ( SELECT PzPallet FROM Kanban WHERE MatricolaKanban = @MatricolaKanbanOk )
|
|
SET @CodArticolo = ( SELECT CodArticolo FROM Kanban WHERE MatricolaKanban = @MatricolaKanbanOk )
|
|
/* calcolo tempo tra eventi "contapezzi" fine - fine NB: idxEvento per fine è idxEvento inizio + 1 ... HARD CODED!!! */
|
|
SET @DataOraPrec = ( SELECT ISNULL((SELECT Top 1 InizioStato FROM EventList WHERE IdxMacchina = @IdxMacchina AND IdxTipo = @IdxTipo AND InizioStato < @DataOra ORDER BY InizioStato DESC), @DataOra ) )
|
|
-- se è oltre 10 gg calcolo in secondi... 2013.8.30
|
|
IF (DATEDIFF(DD, @DataOraPrec, @DataOra) > 10)
|
|
BEGIN
|
|
SET @TCMedio = ( SELECT (DATEDIFF(s, @DataOraPrec, @DataOra) / 60.00 ) ) --calcolo in secondi
|
|
END
|
|
ELSE
|
|
BEGIN
|
|
SET @TCMedio = ( SELECT (DATEDIFF(ms, @DataOraPrec, @DataOra) / 60000.00 ) )
|
|
END
|
|
-- versione vecchia (blocco se oltre 24 gg di fermo...)
|
|
--BEGIN TRY
|
|
-- /* è in millisecondi, divido per 60'000.00 x avere minuti centesimali*/
|
|
-- SET @TCMedio = ( SELECT (DATEDIFF(ms, @DataOraPrec, @DataOra) / 60000.00 ) )
|
|
--END TRY
|
|
--BEGIN CATCH
|
|
-- SET @TCMedio = ( SELECT (DATEDIFF(s, @DataOraPrec, @DataOra) / 60.00 ) ) --calcolo in secondi
|
|
--END CATCH
|
|
/* inserisco riga di tempo ciclo */
|
|
BEGIN TRY
|
|
INSERT INTO TempiCicloRilevati
|
|
VALUES(@IdxMacchina, @CodArticolo, @DataOra, @TCMedio, @NumPz)
|
|
END TRY
|
|
BEGIN CATCH
|
|
-- dovrei loggare...
|
|
END CATCH
|
|
END
|
|
/******************************************
|
|
*
|
|
* Aggiorno kanban in dati macchine per
|
|
* INIZIO ATTREZZAGGIO
|
|
*
|
|
******************************************/
|
|
ELSE IF(@TabAzione = 'DatiMacchine' AND @Azione = 'Inizio')
|
|
BEGIN
|
|
/* calcolo valori */
|
|
SET @MatricolaKanban = ( SELECT i.MatricolaKanban FROM inserted i )
|
|
/* aggiorno riga di dati macchina */
|
|
UPDATE DatiMacchine
|
|
SET kanban_A = @MatricolaKanban,
|
|
kanban_B = @MatricolaKanban
|
|
WHERE idxMacchina = @IdxMacchina
|
|
/* aggiorno stato macchina */
|
|
UPDATE StatoMacchine
|
|
SET MatricolaKanban = @MatricolaKanban
|
|
WHERE idxMacchina = @IdxMacchina
|
|
/* aggiorno dati kanban statoMacchine... */
|
|
UPDATE StatoMacchine
|
|
SET KanbanCode = k.KanbanCode, TempoCicloBase = k.TempoCicloBase, PzPalletProd = k.PzPallet
|
|
FROM Kanban AS k INNER JOIN StatoMacchine ON k.MatricolaKanban = StatoMacchine.MatricolaKanban
|
|
WHERE (StatoMacchine.idxMacchina = @IdxMacchina)
|
|
END
|
|
/******************************************
|
|
*
|
|
* Aggiorno kanban in dati macchine per
|
|
* FINE PRODUZIONE
|
|
*
|
|
******************************************/
|
|
ELSE IF(@TabAzione = 'DatiMacchine' AND @Azione = 'Fine')
|
|
BEGIN
|
|
/* calcolo valori */
|
|
SET @MatricolaKanban = 'KAND' -- kanban non definito !!!HARD CODED!!!
|
|
/* aggiorno riga di dati macchina */
|
|
UPDATE DatiMacchine
|
|
SET kanban_A = @MatricolaKanban,
|
|
kanban_B = @MatricolaKanban
|
|
WHERE idxMacchina = @IdxMacchina
|
|
/* aggiorno stato macchina */
|
|
UPDATE StatoMacchine
|
|
SET MatricolaKanban = @MatricolaKanban
|
|
WHERE idxMacchina = @IdxMacchina
|
|
/* aggiorno dati kanban statoMacchine... */
|
|
UPDATE StatoMacchine
|
|
SET KanbanCode = k.KanbanCode, TempoCicloBase = k.TempoCicloBase, PzPalletProd = k.PzPallet
|
|
FROM Kanban AS k INNER JOIN StatoMacchine ON k.MatricolaKanban = StatoMacchine.MatricolaKanban
|
|
WHERE (StatoMacchine.idxMacchina = @IdxMacchina)
|
|
|
|
END
|
|
END
|
|
*/
|
|
|
|
-- INFINE CHIAMO REFRESH TAB STATO...
|
|
EXEC stp_MSE_refresh @IdxMacchina
|
|
go
|
|
|
|
commit;
|
|
go
|
|
|
|
set xact_abort on;
|
|
go
|
|
|
|
begin transaction;
|
|
go
|
|
|
|
set ANSI_NULLS on;
|
|
go
|
|
|
|
-- ================================================
|
|
-- Author: Samuele E. Locatelli
|
|
-- Create date: 2012.11.23
|
|
--
|
|
-- Description: rigenerazione del diario di bordo
|
|
-- a partire da macchina eventi/stati + EventList
|
|
-- ================================================
|
|
alter PROCEDURE man.stp_ricalcolaDatiMacchinaFromDate
|
|
(
|
|
@idxMacchina NVARCHAR(50),
|
|
@inizio DATETIME,
|
|
@idxStatoStart INT = 1
|
|
)
|
|
AS
|
|
|
|
SET NOCOUNT ON;
|
|
|
|
DECLARE @fine DATETIME
|
|
|
|
--DBCC SHOWCONTIG(EventList)
|
|
--DBCC SHOWCONTIG(DiarioDiBordo)
|
|
|
|
/* DA USARE ? Verificare */
|
|
--DECLARE @Database AS SYSNAME;
|
|
--SET @Database = DB_NAME()
|
|
--EXEC USP_DisableEnableNonClusteredIndexes @Database ,null, 1 -- disabilito indici
|
|
|
|
-- update SAM 2013.10.24: "torno indietro" di 2 eventi rispetto alal data ora indicata come start, SE CI SONO
|
|
SELECT @inizio = ISNULL(MIN(InizioStato),@inizio) FROM
|
|
(
|
|
SELECT TOP 3 InizioStato
|
|
FROM DiarioDiBordo
|
|
WHERE IdxMacchina = @idxMacchina AND InizioStato < @inizio
|
|
ORDER BY InizioStato DESC
|
|
) AS tbl
|
|
|
|
|
|
-- DISATTIVO inserimento in DiarioDiBordo per la macchina indicata
|
|
-- DEVE disattivare anche il caricamento degli eventi
|
|
UPDATE DatiMacchine
|
|
SET insEnabled = 0
|
|
WHERE IdxMacchina = @IdxMacchina
|
|
|
|
-- devo sempre rielaborare tutti gli eventi fino a dataora odierna o a ultimo evento in diario di bordo
|
|
SET @fine = ( SELECT MAX(InizioStato) FROM DiarioDiBordo
|
|
WHERE idxMacchina = @idxMacchina )
|
|
|
|
-- svuoto dati che vado a sostituire
|
|
PRINT 'svuoto TempiCicloRilevati per periodo indicato...'
|
|
DELETE FROM TempiCicloRilevati WHERE idxMacchina = @idxMacchina AND DataOraRif BETWEEN @inizio AND @fine
|
|
|
|
PRINT 'svuoto DiarioDiBordo per periodo indicato...'
|
|
EXEC stp_DDB_deleteMacchinaPeriodo @idxMacchina, @inizio, @fine -- cancella diario di bordo
|
|
|
|
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
|
|
DECLARE @TabAzione NVARCHAR(50) = '';
|
|
DECLARE @Azione NVARCHAR(50) = '';
|
|
DECLARE @FlgAggTempiC CHAR(1) = 'N'; -- Y/N = elabora o meno i tempi ciclo
|
|
|
|
-- calcolo famiglia macchina!
|
|
SET @IdxFamiglia = ( SELECT IdxFamiglia FROM Macchine2FamiglieMacchine WHERE idxMacchina = @idxMacchina )
|
|
|
|
-- Recupero stato precedente, altrimenti ipotizzo macchina inizialmente in stato richiesto (default: 1 = pronta) e quindi imposto stato current a quello iniziale richiesto...
|
|
SET @currIdxStato = ISNULL( ( SELECT TOP 1 IdxStato FROM DiarioDiBordo WHERE IdxMacchina = @idxMacchina AND InizioStato < @inizio
|
|
ORDER BY InizioStato DESC ) , @idxStatoStart)
|
|
|
|
-- verifico i record elaborati
|
|
SELECT COUNT(*)
|
|
FROM EventList AS e
|
|
LEFT JOIN dbo.AnagraficaEventi AS a ON e.idxTipo = a.IdxTipo
|
|
WHERE e.IdxMacchina = @idxMacchina
|
|
AND e.InizioStato BETWEEN @inizio AND @fine
|
|
|
|
-- leggo la tabella degli eventi con cursore x percorrere i dati...
|
|
DECLARE event2proc CURSOR FOR
|
|
SELECT e.InizioStato, e.IdxTipo, e.MatricolaKanban, e.Value, e.MatrOpr, e.pallet,
|
|
a.TabAzione, a.Azione
|
|
FROM EventList AS e
|
|
LEFT JOIN dbo.AnagraficaEventi AS a ON e.idxTipo = a.IdxTipo
|
|
WHERE e.IdxMacchina = @idxMacchina
|
|
AND e.InizioStato BETWEEN @inizio AND @fine
|
|
ORDER BY e.InizioStato;
|
|
/*
|
|
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, @TabAzione, @Azione;
|
|
|
|
DECLARE @NumPz INT = 1;
|
|
DECLARE @ContaInsert INT = 0;
|
|
|
|
WHILE @@FETCH_STATUS = 0
|
|
BEGIN
|
|
|
|
IF ( ISNULL(@TabAzione,'') <> '' AND ISNULL(@Azione,'') <> '')
|
|
BEGIN
|
|
SET @NumPz = CASE WHEN (ISNUMERIC(@Value)=1) THEN @Value ELSE 1 END
|
|
-- controllo se devo aggiornare i Tempi ciclo in base allo stato macchina ( se null resta precedente )
|
|
SELECT @FlgAggTempiC = ( CASE Semaforo WHEN 'V' THEN 'Y' ELSE 'N' END ) FROM dbo.AnagraficaStati
|
|
WHERE IdxStato = @currIdxStato
|
|
EXEC dbo.stp_EL_processaEvento @IdxTipo, @idxMacchina, @MatricolaKanban, @InizioStato, @NumPz, 'N', @FlgAggTempiC
|
|
END
|
|
|
|
-- calcolo l'eventuale NUOVO idxStato
|
|
SET @nextIdxStato = 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
|
|
SET @ContaInsert = @ContaInsert + 1
|
|
END
|
|
|
|
-- Get the next values
|
|
FETCH NEXT FROM event2proc
|
|
INTO @InizioStato, @IdxTipo, @MatricolaKanban, @Value, @MatrOpr, @pallet, @TabAzione, @Azione;
|
|
|
|
END
|
|
CLOSE event2proc;
|
|
DEALLOCATE event2proc;
|
|
|
|
-- resetto microStato a 1
|
|
UPDATE dbo.MicroStatoMacchina
|
|
SET IdxMicroStato = 1,
|
|
InizioStato = @InizioStato,
|
|
Value = '0'
|
|
WHERE IdxMacchina = @idxMacchina
|
|
|
|
-- fa un controllo: elimina eventuali dichairazioni in DDB SE durata < 0...
|
|
DELETE FROM DiarioDiBordo WHERE DurataMinuti < 0 AND IdxMacchina = @idxMacchina
|
|
|
|
-- RI-ATTIVO inserimento in DiarioDiBordo per la macchina indicata
|
|
UPDATE DatiMacchine
|
|
SET insEnabled = 1
|
|
WHERE IdxMacchina = @IdxMacchina
|
|
|
|
PRINT 'concluso UPDATE tabelle...' + 'INSERT DiarioBordo : ' + CONVERT(VARCHAR(30),@ContaInsert)
|
|
|
|
--DBCC SHOWCONTIG(EventList)
|
|
--DBCC SHOWCONTIG(DiarioDiBordo)
|
|
--EXEC USP_DisableEnableNonClusteredIndexes @Database,null, 2 --riattivo indici
|
|
|
|
--ricostruisco indici X QUESTE TABELLE DOPPIA RICOSTRUZIONE INDICI NON NECESSARIA
|
|
--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)
|
|
|
|
RETURN
|
|
go
|
|
|
|
commit;
|
|
go
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
-- registro versione...
|
|
INSERT INTO [dbo].[LogUpdateDb] ([Versione],[Data]) VALUES(409, GETDATE())
|
|
GO
|
|
|
|
SELECT TOP 10 * FROM LogUpdateDb ORDER BY Versione DESC
|
|
GO
|