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

356 lines
9.3 KiB
Transact-SQL

set xact_abort on;
go
begin transaction;
go
alter table DatiMacchine add
insEnabled bit constraint DF_DatiMacchine_insEnabled default ((1));
go
exec sp_addextendedproperty 'MS_Description', 'definisce se l''INSERT sia abilitato per la macchina (disabilitato in fase di ricostruzione batch...)', 'SCHEMA', 'dbo', 'TABLE', 'DatiMacchine', 'COLUMN', 'insEnabled';
go
update DatiMacchine set insEnabled=((1));
go
set ANSI_NULLS on;
go
/*************************************
* STORED PROCEDURE InsStatoBatch
* inserimento di uno stato nel db (tab DiarioDiBordo)
* inerimento in anagrafica a "nd" dell'operatore se matricola mancasse
*
* modif.: S.E.L.
* il: 2008.08.07
**************************************/
alter PROCEDURE stp_DDB_InsStatoBatch
(
@IdxMacchina varchar(50),
@InizioStato datetime,
@IdxStato int,
@MatricolaKanban varchar(50),
@Value varchar(50),
@MatrOpr int,
@pallet varchar(20)
)
AS
/*************************************
* verifico se esista operatore
**************************************/
DECLARE @matrOut INT = @MatrOpr + 1
SELECT @matrOut = ISNULL (
(
SELECT MatrOpr FROM AnagraficaOperatori
WHERE (MatrOpr = @MatrOpr)
),-999999
)
IF (@matrOut <> @MatrOpr ) -- significa che la matricola NON C'E'...
BEGIN
/* inserisco nuovo record */
INSERT INTO AnagraficaOperatori(MatrOpr, Cognome, Nome)
VALUES (@MatrOpr,'nd (cognome)','nd (nome)')
END
-- controllo se input abilitato
DECLARE @insEnabled BIT
SET @insEnabled = ( SELECT insEnabled FROM DatiMacchine WHERE IdxMacchina = @IdxMacchina )
-- inserisco SOLO SE è abilitato input x quella macchina
IF(@insEnabled = 1)
BEGIN
/* inserisco valori */
INSERT INTO DiarioDiBordo
(IdxMacchina, InizioStato, FineStato, IdxStato, MatricolaKanban, Value, MatrOpr, pallet)
VALUES (@IdxMacchina, @InizioStato, NULL, @IdxStato, @MatricolaKanban, @Value, @MatrOpr, @pallet)
END
RETURN
go
/*************************************
* STORED PROCEDURE InsStato
* inserimento di uno stato nel db (tab DiarioDiBordo)
* inerimento in anagrafica a "nd" dell'operatore se matricola mancasse
*
* modif.: S.E.L.
* il: 2008.08.07
**************************************/
alter PROCEDURE stp_DDB_InsStato
(
@IdxMacchina NVARCHAR(50),
@IdxStato INT,
@MatricolaKanban NVARCHAR(50),
@Value NVARCHAR(50),
@MatrOpr INT,
@pallet NVARCHAR(20)
)
AS
/*************************************
* verifico se esista operatore
**************************************/
DECLARE @matrOut INT = @MatrOpr + 1
SELECT @matrOut = ISNULL (
(
SELECT MatrOpr FROM AnagraficaOperatori
WHERE (MatrOpr = @MatrOpr)
),-999999
)
IF (@matrOut <> @MatrOpr ) -- significa che la matricola NON C'E'...
BEGIN
/* inserisco nuovo record */
INSERT INTO AnagraficaOperatori(MatrOpr, Cognome, Nome)
VALUES (@MatrOpr,'nd (cognome)','nd (nome)')
END
-- controllo se input abilitato
DECLARE @insEnabled BIT
SET @insEnabled = ( SELECT insEnabled FROM DatiMacchine WHERE IdxMacchina = @IdxMacchina )
-- inserisco SOLO SE è abilitato input x quella macchina
IF(@insEnabled = 1)
BEGIN
/* inserisco valori */
INSERT INTO DiarioDiBordo
(IdxMacchina, InizioStato, FineStato, IdxStato, MatricolaKanban, Value, MatrOpr, pallet)
VALUES (@IdxMacchina, GETDATE(), NULL, @IdxStato, @MatricolaKanban, @Value, @MatrOpr, @pallet)
END
RETURN
go
-- ================================================
-- Author: Samuele E. Locatelli
-- Create date: 2012.11.23
--
-- Description: rigenerazioen del diario di bordo
-- a partire da macchina eventi/stati + EventList
-- ================================================
create PROCEDURE stp_ZZZ_rigeneraDDB
(
@idxStatoStart INT = 1,
@idxMacchina NVARCHAR(50),
@inizio DATETIME,
@fine DATETIME
)
AS
DBCC SHOWCONTIG(EventList)
DBCC SHOWCONTIG(DiarioDiBordo)
EXEC USP_DisableEnableNonClusteredIndexes 'MoonPro',null, 1 --disabilito indici
-- svuoto dati che vado a sostituire
PRINT 'svuoto DiarioDiBordo per periodo indicato...'
EXEC stp_DDB_deleteMacchinaPeriodo @idxMacchina, @inizio, @fine
PRINT 'svuoto TempiCicloRilevati per periodo indicato...'
DELETE FROM TempiCicloRilevati WHERE idxMacchina = @idxMacchina AND DataOraRif BETWEEN @inizio AND @fine
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
-- calcolo famiglia macchina!
SET @IdxFamiglia = ( SELECT IdxFamiglia FROM Macchine2FamiglieMacchine WHERE idxMacchina = @idxMacchina )
-- ipotizzo macchina inizialmente in stato richiesto (default: 1 = pronta) e quindi imposto stato current a quello iniziale richiesto...
SET @currIdxStato = @idxStatoStart
-- DISATTIVO inserimento in DiarioDiBordo per la macchina indicata
UPDATE DatiMacchine
SET insEnabled = 0
WHERE IdxMacchina = @IdxMacchina
-- leggo la tabella degli eventi con cursore x percorrere i dati...
DECLARE event2proc CURSOR FOR
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;
WHILE @@FETCH_STATUS = 0
BEGIN
-- calcolo l'eventuale NUOVO idxStato
SET @nextIdxStato = ( SELECT 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
END
-- Get the next values
FETCH NEXT FROM event2proc
INTO @InizioStato, @IdxTipo, @MatricolaKanban, @Value, @MatrOpr, @pallet;
END
CLOSE event2proc;
DEALLOCATE event2proc;
-- RI-ATTIVO inserimento in DiarioDiBordo per la macchina indicata
UPDATE DatiMacchine
SET insEnabled = 1
WHERE IdxMacchina = @IdxMacchina
PRINT 'concluso UPDATE tabelle...'
DBCC SHOWCONTIG(EventList)
DBCC SHOWCONTIG(DiarioDiBordo)
EXEC USP_DisableEnableNonClusteredIndexes 'MoonPro',null, 2 --riattivo indici
--ricostruisco indici
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)
/*
--shrink del db
PRINT 'compatto DB...'
DBCC SHRINKDATABASE (MoonPro)
*/
RETURN
go
commit;
go
set xact_abort on;
go
begin transaction;
go
set ANSI_NULLS on;
go
/*************************************
* STORED PROCEDURE stp_TS_getByIdxMacchIdxTipoEv
* restituisce una riga transizione stati/eventi data macchina ed evento (confrontando lo stato attuale della macchina)
*
* modif.: S.E.L. - 2012.11.23
**************************************/
create PROCEDURE stp_TS_getByIdxMacchIdxTipoEv
(
@IdxMacchina NVARCHAR(50),
@IdxTipo INT
)
AS
SELECT TransizioneStati.IdxFamiglia, TransizioneStati.IdxStato, TransizioneStati.IdxTipo, TransizioneStati.next_IdxStato
FROM TransizioneStati INNER JOIN
Macchine2FamiglieMacchine ON TransizioneStati.IdxFamiglia = Macchine2FamiglieMacchine.IdxFamiglia INNER JOIN
Macchine ON Macchine2FamiglieMacchine.IdxMacchina = Macchine.IdxMacchina INNER JOIN
StatoMacchine ON Macchine.IdxMacchina = StatoMacchine.IdxMacchina AND TransizioneStati.IdxStato = StatoMacchine.IdxStato
WHERE (Macchine.IdxMacchina = @IdxMacchina) AND (TransizioneStati.IdxTipo = @IdxTipo) AND (TransizioneStati.IdxFamiglia <> 1)
RETURN
go
commit;
go
set xact_abort on;
go
begin transaction;
go
set ANSI_NULLS on;
go
/***************************************************
* Trigger trg_EV_filtroIns
*
* filtro operazioni scrittura su tab EventList:
* - scrive un NUOVO recordo SOLO SE la chiave differisce per almeno 2 valori
*
* modificato: S.E.L.
* 2012.11.26
*
***************************************************/
create TRIGGER trg_EV_filtroIns
ON EventList
INSTEAD OF INSERT
AS
IF (@@ROWCOUNT = 1)
BEGIN
DECLARE @IdxMacchina AS NVARCHAR(50)
DECLARE @InizioStato AS DATETIME
DECLARE @IdxTipo AS INT
DECLARE @numMin AS INT=4
DECLARE @trovati AS INT=0
SELECT @IdxMacchina=IdxMacchina, @InizioStato=InizioStato, @IdxTipo=IdxTipo FROM INSERTED
;WITH myCTE AS
(
SELECT TOP(@numMin) ev.*
FROM EventList ev
INNER JOIN INSERTED i ON ev.IdxMacchina=i.IdxMacchina
ORDER BY InizioStato DESC
)
SELECT @trovati=COUNT(IdxTipo) FROM myCTE WHERE idxTipo = @IdxTipo
-- se tutte le righe sono con stesso tipo...
IF(@trovati < @numMin)
BEGIN
INSERT INTO EventList
SELECT * FROM INSERTED
END
END
go
alter table EventList disable trigger trg_doActions;
go
commit;
go
-- registro versione...
INSERT INTO [dbo].[LogUpdateDb] ([Versione],[Data]) VALUES(353, GETDATE())
GO
SELECT TOP 10 * FROM LogUpdateDb ORDER BY Versione DESC
GO