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