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

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