set xact_abort on go begin transaction go set ANSI_NULLS on go -- ============================================= -- TRIGGER trg_kanban4articoloIns -- -- Author: S.E.L. -- Create date: 2011.05.17 -- Description: Controlla esistenza etichette kanban per l'articolo creato ed in caso sia necessario le crea -- ============================================= create TRIGGER trg_kanban4articoloIns ON AnagArticoli AFTER INSERT AS BEGIN -- SET NOCOUNT ON added to prevent extra result sets from -- interfering with SELECT statements. SET NOCOUNT ON; -- seleziono il nuovo articolo... DECLARE @kanbanTrovati INT DECLARE @CodArticolo NVARCHAR(50) SET @CodArticolo = ( SELECT CodArticolo FROM inserted ) -- ...e cerco se ci sia un kanban x tale articolo tabella SET @kanbanTrovati = ( SELECT ISNULL(COUNT(*),0) FROM Kanban WHERE CodArticolo = @CodArticolo ) -- se non ne ho trovati creo articolo! IF(@kanbanTrovati = 0) BEGIN -- inserisco nuovo articolo! INSERT INTO Kanban(MatricolaKanban, KanbanCode, TempoCicloBase, PzPallet, CodArticolo) VALUES ('KA'+@CodArticolo, @CodArticolo, 1, 1, @CodArticolo) END END go -- ============================================= -- TRIGGER trg_kanban4articoloUpd -- -- Author: S.E.L. -- Create date: 2011.05.17 -- Description: Controlla esistenza etichette kanban per l'articolo modificato ed in caso sia necessario le modifica -- ============================================= create TRIGGER trg_kanban4articoloUpd ON AnagArticoli AFTER UPDATE AS BEGIN -- SET NOCOUNT ON added to prevent extra result sets from -- interfering with SELECT statements. SET NOCOUNT ON; -- solo se è stato aggiornato codice articolo... IF UPDATE(CodArticolo) BEGIN -- seleziono l'articolo... DECLARE @kanbanTrovati INT DECLARE @CodArticoloOld NVARCHAR(50) DECLARE @CodArticoloNew NVARCHAR(50) SET @CodArticoloOld = ( SELECT CodArticolo FROM deleted ) SET @CodArticoloNew = ( SELECT CodArticolo FROM inserted ) -- ...e cerco se ci sia un kanban x tale articolo tabella SET @kanbanTrovati = ( SELECT ISNULL(COUNT(*),0) FROM Kanban WHERE CodArticolo = @CodArticoloOld ) -- se non ne ho trovati creo articolo! IF(@kanbanTrovati = 0) BEGIN -- inserisco nuovo articolo! INSERT INTO Kanban(MatricolaKanban, KanbanCode, TempoCicloBase, PzPallet, CodArticolo) VALUES ('KA'+@CodArticoloNew, @CodArticoloNew, 1, 1, @CodArticoloNew) END ELSE -- altrimenti aggiorno! BEGIN UPDATE Kanban SET MatricolaKanban = 'KA'+@CodArticoloNew, CodArticolo = @CodArticoloNew, KanbanCode = @CodArticoloNew WHERE CodArticolo = @CodArticoloOld END END END go commit go set xact_abort on go begin transaction go set ANSI_NULLS on go create TRIGGER trg_updateKanban 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 /* recupero valori dell'INSERT */ SET @IdxTipo = ( SELECT i.IdxTipo FROM inserted i ) SET @IdxMacchina = ( SELECT i.IdxMacchina FROM inserted i ) /* recupero altri valori */ SET @TabAzione = ( SELECT ISNULL(TabAzione,'') FROM AnagraficaEventi WHERE IdxTipo = @IdxTipo ) SET @Azione = ( SELECT ISNULL(Azione,'') FROM AnagraficaEventi WHERE IdxTipo = @IdxTipo ) /* controllo se l'evento richieda azioni successive */ IF(@TabAzione <> '' AND @Azione <> '') BEGIN /* azioni richieste: seconda dei casi eseguo... */ 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 ) ) /* è in millisecondi, divido per 60'000.00 x avere minuti centesimali*/ SET @TCMedio = ( SELECT (DATEDIFF(ms, @DataOraPrec, @DataOra) / 60000.00 ) ) /* inserisco riga di tempo ciclo */ INSERT INTO TempiCicloRilevati VALUES(@IdxMacchina, @CodArticolo, @DataOra, @TCMedio, @NumPz) END 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 ) ) /* è in millisecondi, divido per 60'000.00 x avere minuti centesimali*/ SET @TCMedio = ( SELECT (DATEDIFF(ms, @DataOraPrec, @DataOra) / 60000.00 ) ) /* inserisco riga di tempo ciclo */ INSERT INTO TempiCicloRilevati VALUES(@IdxMacchina, @CodArticolo, @DataOra, @TCMedio, @NumPz) END 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 ) ) /* è in millisecondi, divido per 60'000.00 x avere minuti centesimali*/ SET @TCMedio = ( SELECT (DATEDIFF(ms, @DataOraPrec, @DataOra) / 60000.00 ) ) /* inserisco riga di tempo ciclo */ INSERT INTO TempiCicloRilevati VALUES(@IdxMacchina, @CodArticolo, @DataOra, @TCMedio, @NumPz) END END 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 /* recupero valori dell'INSERT */ SET @IdxTipo = ( SELECT i.IdxTipo FROM inserted i ) SET @IdxMacchina = ( SELECT i.IdxMacchina FROM inserted i ) /* recupero altri valori */ SET @TabAzione = ( SELECT ISNULL(TabAzione,'') FROM AnagraficaEventi WHERE IdxTipo = @IdxTipo ) SET @Azione = ( SELECT ISNULL(Azione,'') FROM AnagraficaEventi WHERE IdxTipo = @IdxTipo ) /* 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 ) ) /* è in millisecondi, divido per 60'000.00 x avere minuti centesimali*/ 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') 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 ) ) /* è in millisecondi, divido per 60'000.00 x avere minuti centesimali*/ 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/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 ) ) /* è in millisecondi, divido per 60'000.00 x avere minuti centesimali*/ SET @TCMedio = ( SELECT (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') 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 go commit go set xact_abort on go begin transaction go set ANSI_NULLS on go /************************************* * Function f_turnoByDate * calcola il turno in cui cade una data * * modif.: S.E.L. * il: 2011.03.30 **************************************/ create FUNCTION f_oreNdPeriodo ( @dataFrom DATETIME, @dataTo DATETIME ) RETURNS DECIMAL(18,8) AS BEGIN /* per farlo va reinserito codice come GIM in questo modo... - tempo totale iniziale c'è... A) va tolto tempo dell'apertura std B) vanno tolte le fermate tipo ferie, chiusure...x la loro durata std */ RETURN 0.0 END go commit go set xact_abort on go begin transaction go set ANSI_NULLS on go /************************************* * STORED PROCEDURE stp_DP_ricalcolaTempi * * calcola i tempi * - T_AutoRun (lavorazione in auto) * - T_Auto (in auto sia lavora che non lavora) * - T_fermo (tempo fermata) * - T_ND (tempo ND) * * dato una riga di dichairazione produzione (prendendo come riferimento i tempi from/to) * * modif.: S.E.L. - 2011.04.18 **************************************/ alter PROCEDURE stp_DP_ricalcolaTempi ( @idxConferma INT ) AS BEGIN TRAN -- dichiaro variabili DECLARE @DataFrom AS DATETIME DECLARE @DataTo AS DATETIME DECLARE @IdxMacchina AS NVARCHAR(50) -- variabili tempo DECLARE @TempoCron DECIMAL(18,8) DECLARE @TempoND DECIMAL(18,8) DECLARE @TempoApertura DECIMAL(18,8) DECLARE @TempoOFF DECIMAL(18,8) DECLARE @TempoON DECIMAL(18,8) DECLARE @TempoFermoON DECIMAL(18,8) DECLARE @TempoAuto DECIMAL(18,8) DECLARE @TempoFermoAuto DECIMAL(18,8) DECLARE @TempoRun DECIMAL(18,8) -- setto date SET @DataFrom = ( SELECT DataOraFrom FROM DatiConfermati WHERE IdxConferma = @idxConferma ) SET @DataTo = ( SELECT DataOraTo FROM DatiConfermati WHERE IdxConferma = @idxConferma ) SET @IdxMacchina = ( SELECT IdxMacchina FROM DatiConfermati WHERE IdxConferma = @idxConferma ) -- calcolo i tempi SET @TempoCron = ( SELECT CAST(ISNULL(DATEDIFF (n, @DataFrom, @DataTo), 0) AS DECIMAL(18,8)) / 60) SET @TempoND = dbo.f_oreNdPeriodo(@DataFrom, @DataTo)-- 0 -- FARE!!! (SELECT DATEDIFF (n, DataOraFrom, DataOraTo) / 60 FROM DatiConfermati WHERE IdxConferma = @idxConferma ) SET @TempoApertura = @TempoCron - @TempoND SET @TempoOFF = ( SELECT CAST(ISNULL(SUM(ddb.DurataMinuti),0) AS DECIMAL(18,8)) / 60 AS ore FROM DiarioDiBordo ddb INNER JOIN AnagraficaStati a ON ddb.IdxStato = a.IdxStato WHERE (a.ClasseTempo = 'T_OFF') AND (ddb.IdxMacchina = @IdxMacchina) AND (ddb.InizioStato >= @DataFrom) AND (ddb.FineStato <= @DataTo) )-- sistemare eventuali eventi sui bordi inizio/fine SET @TempoON = @TempoApertura - @TempoOFF SET @TempoFermoON = ( SELECT CAST(ISNULL(SUM(ddb.DurataMinuti),0) AS DECIMAL(18,8)) / 60 AS ore FROM DiarioDiBordo ddb INNER JOIN AnagraficaStati a ON ddb.IdxStato = a.IdxStato WHERE (a.ClasseTempo = 'T_FermoOn') AND (ddb.IdxMacchina = @IdxMacchina) AND (ddb.InizioStato >= @DataFrom) AND (ddb.FineStato <= @DataTo) )-- sistemare eventuali eventi sui bordi inizio/fine SET @TempoAuto = @TempoON - @TempoFermoON /* -- lo derivo x riportare eventuali "resti" ed errori riclassifica SET @TempoFermoAuto = (SELECT SUM(ddb.DurataMinuti) / 60 AS ore FROM DiarioDiBordo ddb INNER JOIN AnagraficaStati a ON ddb.IdxStato = a.IdxStato WHERE (a.ClasseTempo = 'T_FermoAuto') AND (ddb.IdxMacchina = @IdxMacchina) AND (ddb.InizioStato >= @DataFrom) AND (ddb.FineStato <= @DataTo) )-- sistemare eventuali eventi sui bordi inizio/fine */ SET @TempoRun = ( SELECT CAST(ISNULL(SUM(ddb.DurataMinuti),0) AS DECIMAL(18,8)) / 60 AS ore FROM DiarioDiBordo ddb INNER JOIN AnagraficaStati a ON ddb.IdxStato = a.IdxStato WHERE (a.ClasseTempo = 'T_Run') AND (ddb.IdxMacchina = @IdxMacchina) AND (ddb.InizioStato >= @DataFrom) AND (ddb.FineStato <= @DataTo) )-- sistemare eventuali eventi sui bordi inizio/fine SET @TempoFermoAuto = @TempoAuto - @TempoRun -- aggiorno record UPDATE DatiConfermati SET TempoCron = @TempoCron, TempoND = @TempoND, TempoApertura = @TempoApertura, TempoOFF = @TempoOFF, TempoON = @TempoON, TempoFermoON = @TempoFermoON, TempoAuto = @TempoAuto, TempoFermoAuto = @TempoFermoAuto, TempoRun = @TempoRun WHERE idxConferma = @idxConferma COMMIT TRAN RETURN go commit go set xact_abort on go begin transaction go UPDATE dbo.AnagraficaEventi SET TabAzione=N'DatiMacchine', Azione=N'Inizio' WHERE IdxTipo=2 UPDATE dbo.AnagraficaEventi SET TabAzione=N'DatiMacchine', Azione=N'Fine' WHERE IdxTipo=7 go commit transaction go set xact_abort on go begin transaction go INSERT INTO dbo.Kanban VALUES (N'KAND', N'ND', 1, 1, N'ND') go commit transaction go -- registro versione... INSERT INTO [dbo].[LogUpdateDb] ([Versione],[Data]) VALUES(245, GETDATE()) GO