aggiunto progetto MapoDb...

This commit is contained in:
Samuele E. Locatelli
2016-11-11 16:02:32 +01:00
parent 011daf120d
commit b3012f5da7
63 changed files with 77511 additions and 22 deletions
@@ -0,0 +1,167 @@
create table LogUpdateDb(
Versione int not null constraint PK_LogUpdateDb primary key,
Data datetime
)
go
set xact_abort on
go
begin transaction
go
alter table AnagraficaStati add
Priorita int
go
exec sp_addextendedproperty 'MS_Description', 'livello di precedenza (il minore precede e sovrascrive i livelli successivi)', 'SCHEMA', 'dbo', 'TABLE', 'AnagraficaStati', 'COLUMN', 'Priorita'
go
set ANSI_NULLS on
go
alter TRIGGER UpdDiarioDiBordo
ON DiarioDiBordo
FOR INSERT
AS
/* dichiaro variabili */
DECLARE @IdxMacchina NVARCHAR(50)
DECLARE @InizioStato DATETIME
DECLARE @soloMinuti FLOAT
DECLARE @IdxStatoOld INT
DECLARE @IdxStatoNew INT
DECLARE @semaforoOld VARCHAR(50)
DECLARE @semaforoNew VARCHAR(50)
DECLARE @prioritaOld INT
DECLARE @prioritaNew INT
/* recupero valori x inserting */
SET @IdxMacchina = ( SELECT i.IdxMacchina FROM inserted i )
SET @InizioStato = ( SELECT i.InizioStato FROM inserted i )
SET @soloMinuti = ( SELECT DATEDIFF(n, InizioStato, @InizioStato) FROM DiarioDiBordo WHERE (FineStato IS NULL) AND (IdxMacchina = @IdxMacchina) AND (InizioStato <>@InizioStato) )
/* recupero dati x stati e semafori/priorità x eventuale update a ritroso dello stato */
SET @IdxStatoOld = ( SELECT IdxStato FROM DiarioDiBordo WHERE (FineStato IS NULL) AND (IdxMacchina = @IdxMacchina) AND (InizioStato <>@InizioStato) )
SET @IdxStatoNew = ( SELECT i.IdxStato FROM inserted i )
/* ------------------------------------------------------------------------------------------------------------ */
/* CONTROLLO SE NECESSARIO AGGIORNARE STATO PRECEDENTE guardando le famiglie "semaforiche" e la priorità dello stato vecchio e nuovo*/
/* faccio i controlli SOLO se lo stato è cambiato da vecchio a nuovo */
IF (@IdxStatoOld <> @IdxStatoNew)
BEGIN
SET @semaforoOld = ( SELECT Semaforo FROM AnagraficaStati WHERE IdxStato = @IdxStatoOld )
SET @semaforoNew = ( SELECT Semaforo FROM AnagraficaStati WHERE IdxStato = @IdxStatoNew )
/* questo controllo ed eventuale update lo faccio SOLO se i semafori corrispondono (stessa "famiglia" */
IF (@semaforoOld = @semaforoNew)
BEGIN
SET @prioritaOld = ( SELECT Priorita FROM AnagraficaStati WHERE IdxStato = @IdxStatoOld )
SET @prioritaNew = ( SELECT Priorita FROM AnagraficaStati WHERE IdxStato = @IdxStatoNew )
/* controlo se la priorità nuova sia + bassa della precedente e nel caso sovrascrivo */
IF (@prioritaNew < @prioritaOld)
BEGIN
/* in questo caso imposto lo stato precedente come quello nuovo */
UPDATE DiarioDiBordo
SET IdxStato = @IdxStatoNew
WHERE (FineStato IS NULL) AND (IdxMacchina = @IdxMacchina) AND (InizioStato <> @InizioStato)
END
END
END
/* ------------------------------------------------------------------------------------------------------------ */
/* Chiudo lo stato precedente */
UPDATE DiarioDiBordo
SET FineStato = @InizioStato, DurataMinuti = @soloMinuti + CAST((DATEDIFF(ms, DATEADD(n,@soloMinuti,InizioStato), @InizioStato)) AS FLOAT)/60000
WHERE (FineStato IS NULL) AND (IdxMacchina = @IdxMacchina) AND (InizioStato <> @InizioStato)
/* Aggiorno tabella stato corrente della macchina */
DELETE FROM StatoMacchine
WHERE IdxMacchina = @IdxMacchina
INSERT INTO StatoMacchine(IdxMacchina, IdxStato, InizioStato, Value, MatricolaKanban, KanbanCode, TempoCicloBase, PzPalletProd)
SELECT IdxMacchina, IdxStato, InizioStato, Value, MatricolaKanban, KanbanCode, TempoCicloBase, PzPalletProd
FROM inserted
/* aggiorno dati kanban DiarioDiBordo... */
UPDATE DiarioDiBordo
SET KanbanCode = k.KanbanCode, TempoCicloBase = k.TempoCicloBase, PzPalletProd = k.PzPallet
FROM Kanban AS k INNER JOIN
DiarioDiBordo ON k.MatricolaKanban = DiarioDiBordo.MatricolaKanban
WHERE (DiarioDiBordo.TempoCicloBase IS NULL)
/* 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.TempoCicloBase IS NULL)
go
commit
go
set xact_abort on
go
begin transaction
go
UPDATE dbo.AnagraficaStati SET
Priorita=1
WHERE IdxStato=1
UPDATE dbo.AnagraficaStati SET
Priorita=1
WHERE IdxStato=2
UPDATE dbo.AnagraficaStati SET
Priorita=1
WHERE IdxStato=3
UPDATE dbo.AnagraficaStati SET
Priorita=1
WHERE IdxStato=4
UPDATE dbo.AnagraficaStati SET
Priorita=3
WHERE IdxStato=5
UPDATE dbo.AnagraficaStati SET
Priorita=1
WHERE IdxStato=6
UPDATE dbo.AnagraficaStati SET
Priorita=1
WHERE IdxStato=7
UPDATE dbo.AnagraficaStati SET
Priorita=1
WHERE IdxStato=8
UPDATE dbo.AnagraficaStati SET
Priorita=1
WHERE IdxStato=9
UPDATE dbo.AnagraficaStati SET
Priorita=1
WHERE IdxStato=10
UPDATE dbo.AnagraficaStati SET
Priorita=1
WHERE IdxStato=11
UPDATE dbo.AnagraficaStati SET
Priorita=4
WHERE IdxStato=12
UPDATE dbo.AnagraficaStati SET
Priorita=1
WHERE IdxStato=13
UPDATE dbo.AnagraficaStati SET
Priorita=1
WHERE IdxStato=14
UPDATE dbo.AnagraficaStati SET
Priorita=5
WHERE IdxStato=15
go
commit transaction
go
-- registro versione...
INSERT INTO [dbo].[LogUpdateDb] ([Versione],[Data]) VALUES(10, GETDATE())
GO
@@ -0,0 +1,45 @@
set xact_abort on
go
begin transaction
go
create table TempiCicloRilevati(
IdxMacchina nvarchar(50) not null,
DataOraRif datetime not null,
TempoMedio decimal(18,8) not null constraint DF_TempiCicloRilevati_TempoMedio default (1),
PzProd int not null constraint DF_TempiCicloRilevati_PzProd default (1),
constraint PK_TempiCicloRilevati primary key(IdxMacchina,DataOraRif)
)
go
alter table TempiCicloRilevati add
constraint FK_TempiCicloRilevati_Macchine foreign key(IdxMacchina) references Macchine(IdxMacchina) on update cascade
go
create table TempiCicloTeorici(
IdxMacchina nvarchar(50) not null,
DataOraFrom datetime not null,
DataOraTo datetime,
TempoAssegnato decimal(18,8) not null constraint DF_TempiCicloTeorici_TempoMedio default (1),
constraint PK_TempiCicloTeorici primary key(IdxMacchina,DataOraFrom)
)
go
alter table TempiCicloTeorici add
constraint FK_TempiCicloTeorici_Macchine foreign key(IdxMacchina) references Macchine(IdxMacchina) on update cascade
go
commit
go
-- registro versione...
INSERT INTO [dbo].[LogUpdateDb] ([Versione],[Data]) VALUES(15, GETDATE())
GO
@@ -0,0 +1,215 @@
create table AnagClassiTempo(
ClasseTempo nvarchar(50) not null constraint PK_AnagClassiTempo primary key,
Descrizione nvarchar(500)
)
go
alter table AnagraficaStati add
ClasseTempo nvarchar(50)
go
set xact_abort on
go
begin transaction
go
INSERT INTO dbo.AnagClassiTempo
VALUES (N'T_Auto', N'Macchina in Automatico')
INSERT INTO dbo.AnagClassiTempo
VALUES (N'T_AutoRun', N'Macchina in Automatico e Lavora')
INSERT INTO dbo.AnagClassiTempo
VALUES (N'T_Fermo', N'Macchina Ferma')
INSERT INTO dbo.AnagClassiTempo
VALUES (N'T_ND', N'Macchina non disponibile')
go
commit transaction
go
set xact_abort on
go
begin transaction
go
UPDATE dbo.AnagraficaStati SET
ClasseTempo=N'T_Auto'
WHERE IdxStato=1
UPDATE dbo.AnagraficaStati SET
ClasseTempo=N'T_ND'
WHERE IdxStato=2
UPDATE dbo.AnagraficaStati SET
ClasseTempo=N'T_ND'
WHERE IdxStato=3
UPDATE dbo.AnagraficaStati SET
ClasseTempo=N'T_Fermo'
WHERE IdxStato=4
UPDATE dbo.AnagraficaStati SET
ClasseTempo=N'T_Fermo'
WHERE IdxStato=5
UPDATE dbo.AnagraficaStati SET
ClasseTempo=N'T_Fermo'
WHERE IdxStato=6
UPDATE dbo.AnagraficaStati SET
ClasseTempo=N'T_Fermo'
WHERE IdxStato=7
UPDATE dbo.AnagraficaStati SET
ClasseTempo=N'T_Fermo'
WHERE IdxStato=8
UPDATE dbo.AnagraficaStati SET
ClasseTempo=N'T_Fermo'
WHERE IdxStato=9
UPDATE dbo.AnagraficaStati SET
ClasseTempo=N'T_ND'
WHERE IdxStato=10
UPDATE dbo.AnagraficaStati SET
ClasseTempo=N'T_ND'
WHERE IdxStato=11
UPDATE dbo.AnagraficaStati SET
ClasseTempo=N'T_Fermo'
WHERE IdxStato=12
UPDATE dbo.AnagraficaStati SET
ClasseTempo=N'T_AutoRun'
WHERE IdxStato=13
UPDATE dbo.AnagraficaStati SET
ClasseTempo=N'T_ND'
WHERE IdxStato=14
UPDATE dbo.AnagraficaStati SET
ClasseTempo=N'T_Auto'
WHERE IdxStato=15
go
commit transaction
go
set xact_abort on
go
begin transaction
go
create table DatiConfermati(
IdxConferma int not null identity constraint PK_DatiConfermati primary key,
DataOraApp datetime not null,
DataRif datetime not null,
TurnoRif int,
CodArticolo nvarchar(50),
IdxMacchina nvarchar(50) not null,
TCAssegnato decimal(18,8),
MatrOpr int,
MatrApp int not null,
DataOraFrom datetime,
DataOraTo datetime,
IdxStato int not null,
TotPzProd int,
TempoProdotto decimal(18,8),
TempoLavoro decimal(18,8),
TempoAuto decimal(18,8),
TempoFermo decimal(18,8),
TotPzFermo int
)
go
exec sp_addextendedproperty 'MS_Description', 'matricola dell''operatore che ha lavorato sulla macchina', 'SCHEMA', 'dbo', 'TABLE', 'DatiConfermati', 'COLUMN', 'MatrOpr'
go
exec sp_addextendedproperty 'MS_Description', 'matricola dell''approvatore del record', 'SCHEMA', 'dbo', 'TABLE', 'DatiConfermati', 'COLUMN', 'MatrApp'
go
exec sp_addextendedproperty 'MS_Description', 'pezzi prodotti in ciclo', 'SCHEMA', 'dbo', 'TABLE', 'DatiConfermati', 'COLUMN', 'TotPzProd'
go
exec sp_addextendedproperty 'MS_Description', 'TCAssegnato x num pezzi prodotti', 'SCHEMA', 'dbo', 'TABLE', 'DatiConfermati', 'COLUMN', 'TempoProdotto'
go
exec sp_addextendedproperty 'MS_Description', 'Totale tempo macchina in automatico ed in lavoro', 'SCHEMA', 'dbo', 'TABLE', 'DatiConfermati', 'COLUMN', 'TempoLavoro'
go
exec sp_addextendedproperty 'MS_Description', 'Totale tempo macchina in automatico', 'SCHEMA', 'dbo', 'TABLE', 'DatiConfermati', 'COLUMN', 'TempoAuto'
go
exec sp_addextendedproperty 'MS_Description', 'Totale tempo macchina in fermo (anche ND)', 'SCHEMA', 'dbo', 'TABLE', 'DatiConfermati', 'COLUMN', 'TempoFermo'
go
exec sp_addextendedproperty 'MS_Description', 'pezzi prodotti durante la fermata (es setup)', 'SCHEMA', 'dbo', 'TABLE', 'DatiConfermati', 'COLUMN', 'TotPzFermo'
go
commit
go
create table TabAvvioProduzione(
IdxProduzione int not null identity constraint PK_TabAvvioProduzione primary key,
CodArticolo nvarchar(50) not null,
NumPezzi int not null,
TCAssegnato decimal(18,8) not null constraint DF_TabAvvioProduzione_TCAssegnato default (1)
)
go
drop table TempiCicloRilevati
go
set xact_abort on
go
begin transaction
go
create table TempiCicloRilevati(
IdxMacchina nvarchar(50) not null,
DataOraRif datetime not null,
TCMedio decimal(18,8) not null constraint DF_TempiCicloRilevati_TempoMedio default (1),
PzProd int not null constraint DF_TempiCicloRilevati_PzProd default (1),
constraint PK_TempiCicloRilevati primary key(IdxMacchina,DataOraRif)
)
go
alter table TempiCicloRilevati add
constraint FK_TempiCicloRilevati_Macchine foreign key(IdxMacchina) references Macchine(IdxMacchina) on update cascade
go
commit
go
drop table TempiCicloTeorici
go
set xact_abort on
go
begin transaction
go
create table TempiCicloTeorici(
IdxMacchina nvarchar(50) not null,
DataOraFrom datetime not null,
DataOraTo datetime,
TCAssegnato decimal(18,8) not null constraint DF_TempiCicloTeorici_TempoMedio default (1),
constraint PK_TempiCicloTeorici primary key(IdxMacchina,DataOraFrom)
)
go
alter table TempiCicloTeorici add
constraint FK_TempiCicloTeorici_Macchine foreign key(IdxMacchina) references Macchine(IdxMacchina) on update cascade
go
commit
go
-- registro versione...
INSERT INTO [dbo].[LogUpdateDb] ([Versione],[Data]) VALUES(20, GETDATE())
GO
@@ -0,0 +1,258 @@
set xact_abort on
go
begin transaction
go
drop table TempiCicloRilevati
go
create table TempiCicloRilevati(
IdxMacchina nvarchar(50) not null,
CodArticolo nvarchar(50) not null,
DataOraRif datetime not null,
TCMedio decimal(18,8) not null constraint DF_TempiCicloRilevati_TempoMedio default (1),
PzProd int not null constraint DF_TempiCicloRilevati_PzProd default (1),
constraint PK_TempiCicloRilevati primary key(IdxMacchina,CodArticolo,DataOraRif)
)
go
alter table TempiCicloRilevati add
constraint FK_TempiCicloRilevati_Macchine foreign key(IdxMacchina) references Macchine(IdxMacchina) on update cascade
go
drop table TempiCicloTeorici
go
create table TempiCicloTeorici(
IdxMacchina nvarchar(50) not null,
CodArticolo nvarchar(50) not null,
DataOraFrom datetime not null,
DataOraTo datetime,
TCAssegnato decimal(18,8) not null constraint DF_TempiCicloTeorici_TempoMedio default (1),
constraint PK_TempiCicloTeorici primary key(IdxMacchina,CodArticolo,DataOraFrom)
)
go
alter table TempiCicloTeorici add
constraint FK_TempiCicloTeorici_Macchine foreign key(IdxMacchina) references Macchine(IdxMacchina) on update cascade
go
commit
go
set xact_abort on
go
begin transaction
go
INSERT INTO dbo.AnagraficaEventi
VALUES (20, N'Contapezzi')
go
commit transaction
go
set xact_abort on
go
begin transaction
go
alter table Kanban add
CodArticolo nvarchar(50)
go
set ANSI_NULLS on
go
commit
go
set xact_abort on
go
begin transaction
go
alter table AnagraficaEventi add
TabAzione nvarchar(50) constraint DF_AnagraficaEventi_TabAzione default (''),
Azione nvarchar(50) constraint DF_AnagraficaEventi_Azione default ('')
go
update AnagraficaEventi set TabAzione='',Azione=''
go
set ANSI_NULLS on
go
create 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 @CodArticolo NVARCHAR(50)
DECLARE @TCMedio DECIMAL(18,8)
DECLARE @DataOra DATETIME
DECLARE @DataOraPrec DATETIME
/* 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 @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, 1)
END
END
go
commit
go
set xact_abort on
go
begin transaction
go
UPDATE dbo.AnagraficaEventi SET
TabAzione=N'TempiCicloRilevati', Azione=N'Insert'
WHERE IdxTipo=20
go
commit transaction
go
set xact_abort on
go
begin transaction
go
set ANSI_NULLS on
go
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 @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
END
go
commit
go
set xact_abort on
go
begin transaction
go
set ANSI_NULLS on
go
/*************************************
* STORED PROCEDURE stp_TC_getByMacchinaPeriodo
* recupera tempi ciclo x machcian e periodo
*
* modif.: S.E.L. - 2010.12.15
**************************************/
create PROCEDURE stp_TC_getByMacchinaPeriodo
(
@IdxMacchina NVARCHAR(50),
@Inizio DATETIME,
@Fine DATETIME
)
AS
SELECT * FROM TempiCicloRilevati
WHERE IdxMacchina = @IdxMacchina AND
(DataOraRif >= @Inizio) AND (DataOraRif <= @Fine)
RETURN
go
commit
go
-- registro versione...
INSERT INTO [dbo].[LogUpdateDb] ([Versione],[Data]) VALUES(25, GETDATE())
GO
@@ -0,0 +1,223 @@
set xact_abort on
go
begin transaction
go
set ANSI_NULLS on
go
/*************************************
* STORED PROCEDURE stp_TC_getMaxByMacchinaPeriodo
* recupera tempi ciclo x macchina e periodo
*
* modif.: S.E.L. - 2010.12.15
**************************************/
create PROCEDURE stp_TC_getMaxByMacchinaPeriodo
(
@IdxMacchina NVARCHAR(50),
@Inizio DATETIME,
@Fine DATETIME
)
AS
SELECT @IdxMacchina AS IdxMacchina, '' AS CodArticolo, GETDATE() as DataOraRif, MAX(TCMedio) AS TCMedio, 0 AS PzProd FROM TempiCicloRilevati
WHERE IdxMacchina = @IdxMacchina AND
(DataOraRif >= @Inizio) AND (DataOraRif <= @Fine)
RETURN
go
/*************************************
* STORED PROCEDURE stp_TC_getMinByMacchinaPeriodo
* recupera tempi ciclo x macchina e periodo
*
* modif.: S.E.L. - 2010.12.15
**************************************/
create PROCEDURE stp_TC_getMinByMacchinaPeriodo
(
@IdxMacchina NVARCHAR(50),
@Inizio DATETIME,
@Fine DATETIME
)
AS
SELECT @IdxMacchina AS IdxMacchina, '' AS CodArticolo, GETDATE() as DataOraRif, MIN(TCMedio) AS TCMedio, 0 AS PzProd FROM TempiCicloRilevati
WHERE IdxMacchina = @IdxMacchina AND
(DataOraRif >= @Inizio) AND (DataOraRif <= @Fine)
RETURN
go
commit
go
set xact_abort on
go
begin transaction
go
set ANSI_NULLS on
go
/*************************************
* STORED PROCEDURE stp_TC_getMaxByMacchinaPeriodo
* recupera tempi ciclo x macchina e periodo
*
* modif.: S.E.L. - 2010.12.15
**************************************/
alter PROCEDURE stp_TC_getMaxByMacchinaPeriodo
(
@IdxMacchina NVARCHAR(50),
@Inizio DATETIME,
@Fine DATETIME
)
AS
SELECT @IdxMacchina AS IdxMacchina, '' AS CodArticolo, GETDATE() as DataOraRif, MAX(TCMedio) AS TCMedio, 0 AS PzProd FROM TempiCicloRilevati
WHERE IdxMacchina = @IdxMacchina AND
(DataOraRif >= @Inizio) AND (DataOraRif <= @Fine)
AND TCMedio > 0
RETURN
go
/*************************************
* STORED PROCEDURE stp_TC_getMedByMacchinaPeriodo
* recupera tempi ciclo x macchina e periodo
*
* modif.: S.E.L. - 2010.12.24
**************************************/
create PROCEDURE stp_TC_getMedByMacchinaPeriodo
(
@IdxMacchina NVARCHAR(50),
@Inizio DATETIME,
@Fine DATETIME
)
AS
SELECT @IdxMacchina AS IdxMacchina, '' AS CodArticolo, GETDATE() as DataOraRif, SUM(TCMedio * PzProd) / SUM(PzProd) AS TCMedio, 0 AS PzProd FROM TempiCicloRilevati
WHERE IdxMacchina = @IdxMacchina AND
(DataOraRif >= @Inizio) AND (DataOraRif <= @Fine)
AND TCMedio > 0
RETURN
go
/*************************************
* STORED PROCEDURE stp_TC_getMinByMacchinaPeriodo
* recupera tempi ciclo x macchina e periodo
*
* modif.: S.E.L. - 2010.12.15
**************************************/
alter PROCEDURE stp_TC_getMinByMacchinaPeriodo
(
@IdxMacchina NVARCHAR(50),
@Inizio DATETIME,
@Fine DATETIME
)
AS
SELECT @IdxMacchina AS IdxMacchina, '' AS CodArticolo, GETDATE() as DataOraRif, MIN(TCMedio) AS TCMedio, 0 AS PzProd FROM TempiCicloRilevati
WHERE IdxMacchina = @IdxMacchina AND
(DataOraRif >= @Inizio) AND (DataOraRif <= @Fine)
AND TCMedio > 0
RETURN
go
-- =============================================
-- Author: Samuele E. Locatelli
-- Create date: 2009-03-04
-- mod date: 2010-07-14
--
-- Description: riallineamento con update massivo dati db
-- aggiorna i dati nel db per portarli ad essere "odierni" ovvero ultimo evento appena successo
-- =============================================
alter PROCEDURE stp_ZZZ_riallineaDateDb
AS
DBCC SHOWCONTIG(EventList)
DBCC SHOWCONTIG(DiarioDiBordo)
EXEC USP_DisableEnableNonClusteredIndexes 'Mapo_ColMecc',null, 1 --disabilito indici
PRINT 'inizio UPDATE tabelle...'
DECLARE @lastData AS DATETIME
DECLARE @diff_min as INT
-- calcolo l'ultima data degli eventi
SET @lastData = (SELECT MAX(InizioStato) AS inizio FROM EventList)
-- ora calcolo la differenza tra quello e la data/ora odierna
SET @diff_min = (SELECT DATEDIFF(n, @lastData, getdate()))
-- aggiorno tabelle di conseguenza modificando le date
-- aggiorno EventList
UPDATE EventList SET InizioStato = DATEADD(n, @diff_min, InizioStato)
-- aggiorno DiarioDiBordo
UPDATE DiarioDiBordo SET InizioStato = DATEADD(n, @diff_min, InizioStato),FineStato = DATEADD(n, @diff_min, FineStato)
-- aggiorno StatoMacchine
UPDATE StatoMacchine SET InizioStato = DATEADD(n, @diff_min, InizioStato)
-- aggiorno KeepAlive
UPDATE KeepAlive SET DataOraServer = DATEADD(n, @diff_min, DataOraServer), DataOraMacchina = DATEADD(n, @diff_min, DataOraMacchina), DataOraStart = DATEADD(n, @diff_min, DataOraStart)
-- aggiorno TC teorici
UPDATE TempiCicloTeorici SET DataOraFrom = DATEADD(n, @diff_min, DataOraFrom), DataOraTo = DATEADD(n, @diff_min, DataOraTo)
-- aggiorno TC rilevati
UPDATE TempiCicloRilevati SET DataOraRif = DATEADD(n, @diff_min, DataOraRif)
PRINT 'concluso UPDATE tabelle...'
DBCC SHOWCONTIG(EventList)
DBCC SHOWCONTIG(DiarioDiBordo)
EXEC USP_DisableEnableNonClusteredIndexes 'Mapo_ColMecc',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 (Mapo_ColMecc)
RETURN
go
commit
go
-- registro versione...
INSERT INTO [dbo].[LogUpdateDb] ([Versione],[Data]) VALUES(30, GETDATE())
GO
@@ -0,0 +1,172 @@
set xact_abort on
go
begin transaction
go
set ANSI_NULLS on
go
-- =============================================
-- Author: Samuele E. Locatelli
-- Create date: 2011-02-20
-- Description:
-- =============================================
create PROCEDURE stp_zzz_rimuoviDuplicatiConsecutivi
-- Add the parameters for the stored procedure here
@idxMacchina int
AS
BEGIN
SET NOCOUNT ON;
DECLARE @InizioStato DATETIME, @IdxTipo INT, @MatricolaKanban NVARCHAR(50);
DECLARE @InizioStatoPrec DATETIME, @IdxTipoPrec INT, @MatricolaKanbanPrec NVARCHAR(50);
DECLARE @messaggio NVARCHAR(500);
-- mostro conteggio eventi
SELECT count(*), DATEPART(DD,InizioStato) AS inizio FROM EventList
WHERE IdxMacchina=37
GROUP BY DATEPART(DD,InizioStato)
-- inizializzo valori precedenti
SET @InizioStatoPrec = (SELECT Top 1 InizioStato FROM EventList WHERE idxMacchina = @idxMacchina ORDER BY InizioStato ASC);
SET @IdxTipoPrec = (SELECT Top 1 IdxTipo FROM EventList WHERE idxMacchina = @idxMacchina ORDER BY InizioStato ASC);
SET @MatricolaKanbanPrec = (SELECT Top 1 MatricolaKanban FROM EventList WHERE idxMacchina = @idxMacchina ORDER BY InizioStato ASC);
-- uso un cursore x percorrere i dati...
DECLARE eventiDuplicati CURSOR FOR
SELECT InizioStato, IdxTipo, MatricolaKanban
FROM EventList
WHERE IdxMacchina = @idxMacchina
ORDER BY InizioStato;
OPEN eventiDuplicati;
FETCH NEXT FROM eventiDuplicati
INTO @InizioStato, @IdxTipo,@MatricolaKanban;
WHILE @@FETCH_STATUS = 0
BEGIN
-- controllo: se uguali i valori ai precedenti elimino attuale...
IF((@InizioStato > @InizioStatoPrec) AND (@IdxTipo = @IdxTipoPrec) AND (@MatricolaKanban = @MatricolaKanbanPrec))
BEGIN
SELECT @messaggio = '--> Old tipo: ' + CAST(@IdxTipoPrec AS NVARCHAR(50)) + ' - new: ' + CAST(@IdxTipo AS NVARCHAR(50)) + ' | old time: ' + CAST(@InizioStatoPrec AS NVARCHAR(250)) + ' - new: ' +CAST(@InizioStato AS NVARCHAR(250)) + ' | old kanban: ' + CAST(@MatricolaKanbanPrec AS NVARCHAR(250)) + ' - new: ' +CAST(@MatricolaKanban AS NVARCHAR(250));
PRINT @messaggio;
-- elimino riga errata
DELETE FROM EventList
WHERE InizioStato=@InizioStato and IdxMacchina=@idxMacchina and IdxTipo=@IdxTipo and MatricolaKanban=@MatricolaKanban;
END
ELSE
BEGIN
SELECT @messaggio = 'Ok Old tipo: ' + CAST(@IdxTipoPrec AS NVARCHAR(50)) + ' - new: ' + CAST(@IdxTipo AS NVARCHAR(50)) + ' | old time: ' + CAST(@InizioStatoPrec AS NVARCHAR(250)) + ' - new: ' +CAST(@InizioStato AS NVARCHAR(250)) + ' | old kanban: ' + CAST(@MatricolaKanbanPrec AS NVARCHAR(250)) + ' - new: ' +CAST(@MatricolaKanban AS NVARCHAR(250));
--PRINT @messaggio;
END
SET @InizioStatoPrec = @InizioStato;
SET @IdxTipoPrec = @IdxTipo;
SET @MatricolaKanbanPrec = @MatricolaKanban;
-- Get the next values.
FETCH NEXT FROM eventiDuplicati
INTO @InizioStato, @IdxTipo, @MatricolaKanban;
END
CLOSE eventiDuplicati;
DEALLOCATE eventiDuplicati;
-- mostro conteggio eventi
SELECT count(*), DATEPART(DD,InizioStato) AS inizio FROM EventList
WHERE IdxMacchina=37
GROUP BY DATEPART(DD,InizioStato)
END
go
commit
go
set xact_abort on
go
begin transaction
go
set ANSI_NULLS on
go
/*************************************
* STORED PROCEDURE stp_TC_getCodArticoliByMacchinaPeriodo
* recupera tempi ciclo x machcian e periodo
*
* modif.: S.E.L. - 2010.12.18
**************************************/
create PROCEDURE stp_TC_getCodArticoliByMacchinaPeriodo
(
@IdxMacchina NVARCHAR(50),
@Inizio DATETIME,
@Fine DATETIME
)
AS
SELECT DISTINCT(CodArticolo) FROM TempiCicloRilevati
WHERE IdxMacchina = @IdxMacchina AND
(DataOraRif >= @Inizio) AND (DataOraRif <= @Fine)
RETURN
go
commit
go
set xact_abort on
go
begin transaction
go
set ANSI_NULLS on
go
/*************************************
* STORED PROCEDURE stp_TC_getByMacchinaPeriodoArticolo
* recupera tempi ciclo x macchina, articolo e periodo
*
* modif.: S.E.L. - 2010.12.18
**************************************/
create PROCEDURE stp_TC_getByMacchinaPeriodoArticolo
(
@IdxMacchina NVARCHAR(50),
@CodArticolo NVARCHAR(50),
@Inizio DATETIME,
@Fine DATETIME
)
AS
SELECT * FROM TempiCicloRilevati
WHERE IdxMacchina = @IdxMacchina AND CodArticolo = @CodArticolo AND
(DataOraRif >= @Inizio) AND (DataOraRif <= @Fine)
ORDER BY DataOraRif
RETURN
go
commit
go
alter table DatiMacchine add
constraint PK_DatiMacchine primary key(idxMacchina)
go
-- registro versione...
INSERT INTO [dbo].[LogUpdateDb] ([Versione],[Data]) VALUES(230, GETDATE())
GO
@@ -0,0 +1,129 @@
set xact_abort on
go
begin transaction
go
set ANSI_NULLS on
go
/*************************************
* STORED PROCEDURE stp_DDB_getDataFiltered
* ottiene i dati nel diario di bordo filtrati x macchina, periodo e durata
*
* modif.: S.E.L. - 2010.07.13
**************************************/
alter PROCEDURE stp_DDB_getDataFiltered
(
@IdxMacchina NVARCHAR(50),
@Inizio DATETIME,
@Fine DATETIME,
@durataMin FLOAT
)
AS
-- controllo fine sia max uguale ad istante attuale
DECLARE @adesso DATETIME
SET @adesso = GETDATE()
IF @fine > @adesso
BEGIN
SET @fine = @adesso
END
SELECT IdxMacchina, InizioStato, ISNULL(FineStato, @Fine) AS FineStato, IdxStato,
ISNULL(DurataMinuti, DATEDIFF(s, InizioStato, @Fine)/60) AS DurataMinuti, Value, MatricolaKanban, KanbanCode, TempoCicloBase,
PzPalletProd, MatrOpr, pallet
FROM DiarioDiBordo
WHERE ((IdxMacchina = @IdxMacchina) AND (InizioStato >= @Inizio) AND (InizioStato <= @Fine)) OR
((IdxMacchina = @IdxMacchina) AND (FineStato >= @Inizio) AND (FineStato <= @Fine))
ORDER BY InizioStato DESC
RETURN
go
commit
go
set xact_abort on
go
begin transaction
go
set ANSI_NULLS on
go
/*************************************
* STORED PROCEDURE stp_DDB_getSequenza
* ottiene la serie in sequenza di dati x macchina-periodo con durata > 0
*
* modif.: S.E.L. - 2010.07.14
**************************************/
alter PROCEDURE stp_DDB_getSequenza
(
@IdxMacchina NVARCHAR(50),
@Inizio DATETIME,
@Fine DATETIME
)
AS
SELECT IdxMacchina, InizioStato, ISNULL(FineStato, @Fine) AS FineStato, IdxStato,
ISNULL(DurataMinuti, DATEDIFF(n, InizioStato, @Fine)) AS DurataMinuti, Value, MatricolaKanban, KanbanCode, TempoCicloBase,
PzPalletProd, MatrOpr, pallet
FROM DiarioDiBordo
WHERE ((IdxMacchina = @IdxMacchina) AND (InizioStato >= @Inizio) AND (InizioStato <= @Fine)) OR
((IdxMacchina = @IdxMacchina) AND (FineStato >= @Inizio) AND (FineStato <= @Fine))
ORDER BY InizioStato
RETURN
go
commit
go
set xact_abort on
go
begin transaction
go
INSERT INTO dbo.Permessi
VALUES ('ADMIN_kanban', 'caricaUpdateKanban.aspx', 5, 3, 'UpdateKanban', 'UpdateKanbanExpl')
INSERT INTO dbo.Permessi
VALUES ('ADMIN_operatori', 'caricaUpdateOperatori.aspx', 5, 4, 'UpdateOperatori', 'UpdateOperatoriExpl')
UPDATE dbo.Permessi SET
URL='~/../MoonPro/MappaStato.aspx'
WHERE COD_PERMESSO='MAP'
go
commit transaction
go
set xact_abort on
go
begin transaction
go
INSERT INTO dbo.Permessi2Funzione
VALUES ('ADMIN_kanban', N'MoonPro_admin', 'S')
INSERT INTO dbo.Permessi2Funzione
VALUES ('ADMIN_operatori', N'MoonPro_admin', 'S')
go
commit transaction
go
-- registro versione...
INSERT INTO [dbo].[LogUpdateDb] ([Versione],[Data]) VALUES(235, GETDATE())
GO
@@ -0,0 +1,55 @@
set xact_abort on
go
begin transaction
go
set ANSI_NULLS on
go
/*************************************
* STORED PROCEDURE stp_DDB_getDataFiltered
* ottiene i dati nel diario di bordo filtrati x macchina, periodo e durata
*
* modif.: S.E.L. - 2010.07.13
**************************************/
alter PROCEDURE stp_DDB_getDataFiltered
(
@IdxMacchina NVARCHAR(50),
@Inizio DATETIME,
@Fine DATETIME,
@durataMin FLOAT
)
AS
-- controllo fine sia max uguale ad istante attuale
DECLARE @adesso DATETIME
SET @adesso = GETDATE()
IF @fine > @adesso
BEGIN
SET @fine = @adesso
END
SELECT IdxMacchina, InizioStato, ISNULL(FineStato, @Fine) AS FineStato, IdxStato,
ISNULL(DurataMinuti, DATEDIFF(s, InizioStato, @Fine)/60) AS DurataMinuti, Value, MatricolaKanban, KanbanCode, TempoCicloBase,
PzPalletProd, MatrOpr, pallet
FROM DiarioDiBordo
WHERE ((IdxMacchina = @IdxMacchina) AND (InizioStato >= @Inizio) AND (InizioStato <= @Fine)) OR
((IdxMacchina = @IdxMacchina) AND (FineStato >= @Inizio) AND (FineStato <= @Fine))
ORDER BY InizioStato DESC
RETURN
go
commit
go
-- registro versione...
INSERT INTO [dbo].[LogUpdateDb] ([Versione],[Data]) VALUES(236, GETDATE())
GO
@@ -0,0 +1,124 @@
-- =============================================
-- Author: Samuele E. Locatelli
-- Create date: 2009-03-04
-- mod date: 2010-07-14
--
-- Description: riallineamento con update massivo dati db
-- aggiorna i dati nel db per portarli ad essere "odierni" ovvero ultimo evento appena successo
-- =============================================
ALTER PROCEDURE [dbo].[stp_ZZZ_riallineaDateDb]
AS
DBCC SHOWCONTIG(EventList)
DBCC SHOWCONTIG(DiarioDiBordo)
EXEC USP_DisableEnableNonClusteredIndexes 'MoonPro',null, 1 --disabilito indici
PRINT 'inizio UPDATE tabelle...'
DECLARE @lastData AS DATETIME
DECLARE @diff_min as INT
-- calcolo l'ultima data degli eventi
SET @lastData = (SELECT MAX(InizioStato) AS inizio FROM DiarioDiBordo )--WHERE IdxMacchina < 99)
-- elimino gli eventi della macchina test DOPO @lastData...
DELETE FROM EventList WHERE IdxMacchina = 99 AND InizioStato > @lastData
-- elimino da diario di bordo della macchina test DOPO @lastData...
DELETE FROM DiarioDiBordo WHERE IdxMacchina = 99 AND InizioStato > @lastData
-- elimino da tempi ciclo teorici della macchina test DOPO @lastData...
DELETE FROM TempiCicloTeorici WHERE IdxMacchina = 99 AND DataOraFrom > @lastData
-- elimino da tempi ciclo rilevati della macchina test DOPO @lastData...
DELETE FROM TempiCicloRilevati WHERE IdxMacchina = 99 AND DataOraRif > @lastData
-- ora calcolo la differenza tra quello e la data/ora odierna
SET @diff_min = (SELECT DATEDIFF(n, @lastData, getdate()))
-- aggiorno tabelle di conseguenza modificando le date
-- aggiorno EventList
UPDATE EventList SET InizioStato = DATEADD(n, @diff_min, InizioStato)
-- aggiorno DiarioDiBordo
UPDATE DiarioDiBordo SET InizioStato = DATEADD(n, @diff_min, InizioStato),FineStato = DATEADD(n, @diff_min, FineStato)
-- aggiorno StatoMacchine
UPDATE StatoMacchine SET InizioStato = DATEADD(n, @diff_min, InizioStato)
-- aggiorno KeepAlive
UPDATE KeepAlive SET DataOraServer = DATEADD(n, @diff_min, DataOraServer), DataOraMacchina = DATEADD(n, @diff_min, DataOraMacchina), DataOraStart = DATEADD(n, @diff_min, DataOraStart)
-- aggiorno TC teorici
UPDATE TempiCicloTeorici SET DataOraFrom = DATEADD(n, @diff_min, DataOraFrom), DataOraTo = DATEADD(n, @diff_min, DataOraTo)
-- aggiorno TC rilevati
UPDATE TempiCicloRilevati SET DataOraRif = DATEADD(n, @diff_min, DataOraRif)
-- aggiorno Dati confermati
UPDATE DatiConfermati SET DataOraApp = DATEADD(n, @diff_min, DataOraApp), DataRif = DATEADD(n, @diff_min, DataRif), DataOraFrom = DATEADD(n, @diff_min, DataOraFrom), DataOraTo = DATEADD(n, @diff_min, DataOraTo)
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
/*************************************
* STORED PROCEDURE stp_DatiCOnf_getByMacchPeriodo
*
* recupera i dati confermati x una amcchina e periodo, ordinati in data DESC
*
* modif.: S.E.L.
* il: 2008.08.07
**************************************/
create PROCEDURE dbo.stp_DatiConf_getByMacchPeriodo
(
@idxMacchina NVARCHAR(50),
@dataFrom DATETIME,
@dataTo DATETIME
)
AS
SELECT *
FROM DatiConfermati
WHERE IdxMacchina = @idxMacchina AND (DataRif >= @dataFrom AND DataRif <= @dataTo)
ORDER BY DataRif DESC
RETURN
-- registro versione...
INSERT INTO [dbo].[LogUpdateDb] ([Versione],[Data]) VALUES(240, GETDATE())
GO
@@ -0,0 +1,538 @@
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
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,100 @@
set xact_abort on;
go
begin transaction;
go
set ANSI_NULLS on;
go
/*************************************
* STORED PROCEDURE stp_repDonati_getDatiProdMacchina
* restituisce i dati di produzione di una macchina
*
* modif.: S.E.L. - 2012.03.08
**************************************/
alter PROCEDURE stp_repDonati_getDatiProdMacchina
(
@idxMacchina NVARCHAR(50)
)
AS
-- calcolo codice articolo
DECLARE @CodArticolo NVARCHAR (50)
SET @CodArticolo = (
SELECT CodArticolo FROM Kanban k
INNER JOIN StatoMacchine sm ON k.MatricolaKanban=sm.MatricolaKanban
WHERE sm.IdxMacchina = @idxMacchina
)
-- calcolo il codice operatore
DECLARE @CodOperatore INT
SET @CodOperatore = (
SELECT MatrOpr FROM StatoMacchine
WHERE IdxMacchina = @idxMacchina
)
-- calcolo il codice ODL
DECLARE @idxODL INT
SET @idxODL = (
SELECT idxODL FROM ODL
WHERE CodArticolo = @CodArticolo AND IdxMacchina = @idxMacchina AND (ISNULL(DataFine,DATEADD(hh,1,GETDATE())) > GETDATE())
)
DECLARE @PezziConf INT
SET @PezziConf = (
SELECT ISNULL(SUM(TotPzProd),0) FROM DatiConfermati
WHERE idxODL = @idxOdl
)
DECLARE @PezziLanciati INT
SET @PezziLanciati =(
SELECT ISNULL(SUM(NumPezzi),0) FROM ODL
WHERE idxODL = @idxOdl
)
DECLARE @TCAss DECIMAL(18,8)
SET @TCAss = (
SELECT ISNULL(SUM(TCAssegnato),0) FROM ODL
WHERE idxODL = @idxOdl
)
-- dato l'ODL calcolo il TC Medio ed i pezzi prodotti per l'ODL
DECLARE @inizioOdl DATETIME
SET @inizioOdl = (
SELECT DataInizio FROM ODL
WHERE idxODL = @idxOdl
)
DECLARE @PezziProd INT
SET @PezziProd = (
SELECT COUNT(*) FROM TempiCicloRilevati
WHERE DataOraRif >= @inizioOdl
AND TCMedio < 3 * @TCAss
)
DECLARE @TCMed DECIMAL(18,8)
SET @TCMed = (
SELECT SUM(TCMedio)/@PezziProd FROM TempiCicloRilevati
WHERE DataOraRif >= @inizioOdl
AND TCMedio < 3 * @TCAss
)
SELECT @CodArticolo as CodArticolo, @PezziLanciati as PezziLanciati, @PezziProd as PezziProd, @PezziConf as PezziConf, @TCAss AS TCAssegnato, @TCMed AS TCMedio, @CodOperatore AS CodOperatore
RETURN
go
commit;
go
-- registro versione...
INSERT INTO [dbo].[LogUpdateDb] ([Versione],[Data]) VALUES(305, GETDATE())
GO
@@ -0,0 +1,328 @@
set xact_abort on;
go
begin transaction;
go
set ANSI_NULLS on;
go
/*************************************
* STORED PROCEDURE stp_TC_getByMacchinaPeriodo
* recupera tempi ciclo x machcian e periodo filtrando il MAX ammissibile
*
* modif.: S.E.L. - 2010.12.15
**************************************/
create PROCEDURE stp_TC_getByMacchinaPeriodoFiltMax
(
@IdxMacchina NVARCHAR(50),
@Inizio DATETIME,
@Fine DATETIME,
@MAX DECIMAL(18, 8)
)
AS
SELECT * FROM TempiCicloRilevati
WHERE IdxMacchina = @IdxMacchina AND
(DataOraRif >= @Inizio) AND (DataOraRif <= @Fine)
AND TCMedio <= @MAX
ORDER BY DataOraRif
RETURN
go
commit;
go
set xact_abort on;
go
begin transaction;
go
set ANSI_NULLS on;
go
/*************************************
* STORED PROCEDURE stp_DDB_getParetoDurate
* ottiene il pareto delle durate eventi diario di bordo
*
* modif.: S.E.L. - 2010.07.13
**************************************/
alter PROCEDURE stp_DDB_getParetoDurateFilt
(
@IdxMacchina NVARCHAR(50),
@minDurata FLOAT,
@fine DATETIME,
@inizio DATETIME
)
AS
WITH my_cte AS
(
SELECT *
FROM DiarioDiBordo
WHERE IdxMacchina=@IdxMacchina AND
DurataMinuti >= @minDurata AND
( (InizioStato BETWEEN @inizio AND @fine) OR (FineStato BETWEEN @inizio AND @fine) )
)
SELECT IdxMacchina,
CASE WHEN MIN(InizioStato) < @inizio THEN @inizio ELSE MIN(InizioStato) END AS InizioStato,
CASE WHEN MAX(FineStato) > @fine THEN @fine ELSE MAX(FineStato) END AS FineStato,
IdxStato,
SUM( DATEDIFF(n, CASE WHEN InizioStato < @inizio THEN @inizio ELSE InizioStato END, CASE WHEN ISNULL(FineStato, GETDATE()) > @fine THEN @fine ELSE FineStato END) ) AS DurataMinuti
FROM my_cte
GROUP BY IdxMacchina, IdxStato
ORDER BY DurataMinuti DESC
/*
SELECT IdxMacchina, MIN(InizioStato) AS InizioStato, MAX(FineStato) AS FineStato, IdxStato,
SUM(ISNULL(DurataMinuti, DATEDIFF(n, InizioStato, GETDATE()))) AS DurataMinuti
FROM DiarioDiBordo
WHERE IdxMacchina=@IdxMacchina AND DurataMinuti >= @minDurata AND
(((FineStato <= @fine) AND (InizioStato >= @inizio)) OR ((FineStato IS NULL) AND (InizioStato >= @inizio AND InizioStato <= @fine)))
GROUP BY IdxMacchina, IdxStato
ORDER BY DurataMinuti DESC
*/
RETURN
go
/*************************************
* STORED PROCEDURE stp_DDB_getParetoDurateHideSpentaFilt
* ottiene il pareto delle durate eventi diario di bordo filtrato eventi spenta
*
* modif.: S.E.L. - 2010.07.14
**************************************/
alter PROCEDURE stp_DDB_getParetoDurateHideSpentaFilt
(
@IdxMacchina NVARCHAR(50),
@minDurata FLOAT,
@fine DATETIME,
@inizio DATETIME
)
AS
WITH my_cte AS
(
SELECT *
FROM DiarioDiBordo
WHERE IdxMacchina=@IdxMacchina AND
DurataMinuti >= @minDurata AND
IdxStato <>11 AND
( (InizioStato BETWEEN @inizio AND @fine) OR (FineStato BETWEEN @inizio AND @fine) )
)
SELECT IdxMacchina,
CASE WHEN MIN(InizioStato) < @inizio THEN @inizio ELSE MIN(InizioStato) END AS InizioStato,
CASE WHEN MAX(FineStato) > @fine THEN @fine ELSE MAX(FineStato) END AS FineStato,
IdxStato,
SUM( DATEDIFF(n, CASE WHEN InizioStato < @inizio THEN @inizio ELSE InizioStato END, CASE WHEN ISNULL(FineStato, GETDATE()) > @fine THEN @fine ELSE FineStato END) ) AS DurataMinuti
FROM my_cte
GROUP BY IdxMacchina, IdxStato
ORDER BY DurataMinuti DESC
/*
SELECT IdxMacchina, MIN(InizioStato) AS InizioStato, MAX(FineStato) AS FineStato, IdxStato,
SUM(ISNULL(DurataMinuti, DATEDIFF(n, InizioStato, GETDATE()))) AS DurataMinuti
FROM DiarioDiBordo
WHERE IdxMacchina=@IdxMacchina AND
DurataMinuti >= @minDurata AND
IdxStato <>11 AND
(((FineStato <= @fine) AND (InizioStato >= @inizio)) OR ((FineStato IS NULL) AND (InizioStato >= @inizio AND InizioStato <= @fine)))
GROUP BY IdxMacchina, IdxStato
ORDER BY DurataMinuti DESC
*/
RETURN
go
commit;
go
drop table AnagraficaStatiOld;
go
set xact_abort on;
go
begin transaction;
go
set ANSI_NULLS on;
go
/*************************************
* STORED PROCEDURE stp_repDonati_getDatiProdMacchina
* restituisce i dati di produzione di una macchina
*
* modif.: S.E.L. - 2012.03.08
**************************************/
alter PROCEDURE stp_repDonati_getDatiProdMacchina
(
@idxMacchina NVARCHAR(50)
)
AS
-- calcolo codice articolo
DECLARE @CodArticolo NVARCHAR (50)
SET @CodArticolo = (
SELECT CodArticolo FROM Kanban k
INNER JOIN StatoMacchine sm ON k.MatricolaKanban=sm.MatricolaKanban
WHERE sm.IdxMacchina = @idxMacchina
)
-- calcolo il codice operatore
DECLARE @CodOperatore INT
SET @CodOperatore = (
SELECT MatrOpr FROM StatoMacchine
WHERE IdxMacchina = @idxMacchina
)
-- calcolo il codice ODL
DECLARE @idxODL INT
SET @idxODL = (
SELECT idxODL FROM ODL
WHERE CodArticolo = @CodArticolo AND IdxMacchina = @idxMacchina AND (ISNULL(DataFine,DATEADD(hh,1,GETDATE())) > GETDATE())
)
DECLARE @PezziConf INT
SET @PezziConf = (
SELECT ISNULL(SUM(TotPzProd),0) FROM DatiProduzione
WHERE idxODL = @idxOdl
)
DECLARE @PezziLanciati INT
SET @PezziLanciati =(
SELECT ISNULL(SUM(NumPezzi),0) FROM ODL
WHERE idxODL = @idxOdl
)
DECLARE @TCAss DECIMAL(18,8)
SET @TCAss = (
SELECT ISNULL(SUM(TCAssegnato),0) FROM ODL
WHERE idxODL = @idxOdl
)
-- dato l'ODL calcolo il TC Medio ed i pezzi prodotti per l'ODL
DECLARE @inizioOdl DATETIME
SET @inizioOdl = (
SELECT DataInizio FROM ODL
WHERE idxODL = @idxOdl
)
DECLARE @PezziProd INT
SET @PezziProd = (
SELECT COUNT(*) FROM TempiCicloRilevati
WHERE DataOraRif >= @inizioOdl
)
/****************************************************
* Calcolo tempi apertura confermati
****************************************************/
-- calcolo i tempi di apertura: TempoON (Verde + giallo + rosso)
DECLARE @TempoOn DECIMAL(18,8)
SET @TempoOn = (
SELECT ISNULL(SUM(Tempo),0) FROM DatiProduzione
WHERE ClasseTempo NOT IN ('T_OFF', 'T_OFF_ND') AND idxODL = @idxOdl
)
-- calcolo i tempi di apertura: TempoAuto (Verde + giallo) - precedente meno "T_FermoRosso"
DECLARE @TempoAuto DECIMAL(18,8)
SET @TempoAuto = (
SELECT @TempoOn - ISNULL(SUM(Tempo),0) FROM DatiProduzione
WHERE ClasseTempo = 'T_FermoRosso' AND idxODL = @idxOdl
)
-- calcolo i tempi di apertura: TempoRun (Verde)
DECLARE @TempoRun DECIMAL(18,8)
SET @TempoRun = (
SELECT ISNULL(SUM(Tempo),0) FROM DatiProduzione
WHERE ClasseTempo = 'T_AutoRun' AND idxODL = @idxOdl
)
/****************************************************
* Calcolo tempi apertura realtime
****************************************************/
-- calcolo i tempi di apertura: TempoON (Verde + giallo + rosso)
DECLARE @TempoOnRT DECIMAL(18,8)
SET @TempoOnRT = (
SELECT ISNULL(SUM(DurataMinuti),0)
FROM DiarioDiBordo ddb INNER JOIN AnagraficaStati AnSt ON ddb.IdxStato= AnSt.IdxStato
WHERE AnSt.ClasseTempo NOT IN ('T_OFF', 'T_OFF_ND') AND InizioStato >= @inizioOdl
)
-- calcolo i tempi di apertura: TempoAuto (Verde + giallo) - precedente meno "T_FermoRosso"
DECLARE @TempoAutoRT DECIMAL(18,8)
SET @TempoAutoRT = (
SELECT @TempoOnRT - ISNULL(SUM(DurataMinuti),0)
FROM DiarioDiBordo ddb INNER JOIN AnagraficaStati AnSt ON ddb.IdxStato= AnSt.IdxStato
WHERE AnSt.ClasseTempo = 'T_FermoRosso' AND InizioStato >= @inizioOdl
)
-- calcolo i tempi di apertura: TempoRun (Verde)
DECLARE @TempoRunRT DECIMAL(18,8)
SET @TempoRunRT = (
SELECT ISNULL(SUM(DurataMinuti),0)
FROM DiarioDiBordo ddb INNER JOIN AnagraficaStati AnSt ON ddb.IdxStato= AnSt.IdxStato
WHERE AnSt.ClasseTempo = 'T_AutoRun' AND InizioStato >= @inizioOdl
)
/****************************************************
* Calcolo i TEMPI CICLO confermati
****************************************************/
DECLARE @TCMed DECIMAL(18,8)
SET @TCMed = (
SELECT @TempoOn * 60 / @PezziConf -- tempo in ore
)
DECLARE @TCLav DECIMAL(18,8)
SET @TCLav = (
SELECT @TempoAuto * 60 / @PezziConf -- tempo in ore
)
DECLARE @TCEff DECIMAL(18,8)
SET @TCEff = (
SELECT @TempoRun * 60 / @PezziConf -- tempo in ore
)
/****************************************************
* Calcolo i TEMPI CICLO realtime (anche non confermati)
****************************************************/
DECLARE @TCMedRT DECIMAL(18,8)
SET @TCMedRT = (
SELECT @TempoOnRT / @PezziProd
)
DECLARE @TCLavRT DECIMAL(18,8)
SET @TCLavRT = (
SELECT @TempoAutoRT / @PezziProd
)
DECLARE @TCEffRT DECIMAL(18,8)
SET @TCEffRT = (
SELECT @TempoRunRT / @PezziProd
)
SELECT @CodArticolo as CodArticolo, @PezziLanciati as PezziLanciati, @PezziProd as PezziProd, @PezziConf as PezziConf, @TCAss AS TCAssegnato, @CodOperatore AS CodOperatore, @TempoOn AS TempoOn, @TempoAuto AS TempoAuto, @TempoRun AS TempoRun, @TCMed AS TCMedio, @TCLav AS TCLav, @TCEff AS TCEff, @TCMedRT AS TCMedioRT, @TCLavRT AS TCLavRT, @TCEffRT AS TCEffRT
RETURN
go
commit;
go
-- registro versione...
INSERT INTO [dbo].[LogUpdateDb] ([Versione],[Data]) VALUES(310, GETDATE())
GO
@@ -0,0 +1,182 @@
set xact_abort on;
go
begin transaction;
go
set ANSI_NULLS on;
go
/*************************************
* STORED PROCEDURE stp_repDonati_getDatiProdMacchina
* restituisce i dati di produzione di una macchina
*
* modif.: S.E.L. - 2012.03.08
**************************************/
alter PROCEDURE stp_repDonati_getDatiProdMacchina
(
@idxMacchina NVARCHAR(50)
)
AS
-- calcolo codice articolo
DECLARE @CodArticolo NVARCHAR (50)
SET @CodArticolo = (
SELECT CodArticolo FROM Kanban k
INNER JOIN StatoMacchine sm ON k.MatricolaKanban=sm.MatricolaKanban
WHERE sm.IdxMacchina = @idxMacchina
)
-- calcolo il codice operatore
DECLARE @CodOperatore INT
SET @CodOperatore = (
SELECT MatrOpr FROM StatoMacchine
WHERE IdxMacchina = @idxMacchina
)
-- calcolo il codice ODL
DECLARE @idxODL INT
SET @idxODL = (
SELECT idxODL FROM ODL
WHERE CodArticolo = @CodArticolo AND IdxMacchina = @idxMacchina AND (ISNULL(DataFine,DATEADD(hh,1,GETDATE())) > GETDATE())
)
DECLARE @PezziConf INT
SET @PezziConf = (
SELECT ISNULL(SUM(TotPzProd),0) FROM DatiProduzione
WHERE idxODL = @idxOdl
)
DECLARE @PezziLanciati INT
SET @PezziLanciati =(
SELECT ISNULL(SUM(NumPezzi),0) FROM ODL
WHERE idxODL = @idxOdl
)
DECLARE @TCAss DECIMAL(18,8)
SET @TCAss = (
SELECT ISNULL(SUM(TCAssegnato),0) FROM ODL
WHERE idxODL = @idxOdl
)
-- dato l'ODL calcolo il TC Medio ed i pezzi prodotti per l'ODL
DECLARE @inizioOdl DATETIME
SET @inizioOdl = (
SELECT DataInizio FROM ODL
WHERE idxODL = @idxOdl
)
DECLARE @PezziProd INT
SET @PezziProd = (
SELECT COUNT(*) FROM TempiCicloRilevati
WHERE DataOraRif >= @inizioOdl
)
/****************************************************
* Calcolo tempi apertura confermati
****************************************************/
-- calcolo i tempi di apertura: TempoON (Verde + giallo + rosso)
DECLARE @TempoOn DECIMAL(18,8)
SET @TempoOn = (
SELECT ISNULL(SUM(Tempo),0) FROM DatiProduzione
WHERE ClasseTempo NOT IN ('T_OFF', 'T_OFF_ND') AND idxODL = @idxOdl
)
-- calcolo i tempi di apertura: TempoAuto (Verde + giallo) - precedente meno "T_FermoRosso"
DECLARE @TempoAuto DECIMAL(18,8)
SET @TempoAuto = (
SELECT @TempoOn - ISNULL(SUM(Tempo),0) FROM DatiProduzione
WHERE ClasseTempo = 'T_FermoRosso' AND idxODL = @idxOdl
)
-- calcolo i tempi di apertura: TempoRun (Verde)
DECLARE @TempoRun DECIMAL(18,8)
SET @TempoRun = (
SELECT ISNULL(SUM(Tempo),0) FROM DatiProduzione
WHERE ClasseTempo = 'T_AutoRun' AND idxODL = @idxOdl
)
/****************************************************
* Calcolo tempi apertura realtime
****************************************************/
-- calcolo i tempi di apertura: TempoON (Verde + giallo + rosso)
DECLARE @TempoOnRT DECIMAL(18,8)
SET @TempoOnRT = (
SELECT ISNULL(SUM(DurataMinuti),0)
FROM DiarioDiBordo ddb INNER JOIN AnagraficaStati AnSt ON ddb.IdxStato= AnSt.IdxStato
WHERE AnSt.ClasseTempo NOT IN ('T_OFF', 'T_OFF_ND') AND InizioStato >= @inizioOdl
)
-- calcolo i tempi di apertura: TempoAuto (Verde + giallo) - precedente meno "T_FermoRosso"
DECLARE @TempoAutoRT DECIMAL(18,8)
SET @TempoAutoRT = (
SELECT @TempoOnRT - ISNULL(SUM(DurataMinuti),0)
FROM DiarioDiBordo ddb INNER JOIN AnagraficaStati AnSt ON ddb.IdxStato= AnSt.IdxStato
WHERE AnSt.ClasseTempo = 'T_FermoRosso' AND InizioStato >= @inizioOdl
)
-- calcolo i tempi di apertura: TempoRun (Verde)
DECLARE @TempoRunRT DECIMAL(18,8)
SET @TempoRunRT = (
SELECT ISNULL(SUM(DurataMinuti),0)
FROM DiarioDiBordo ddb INNER JOIN AnagraficaStati AnSt ON ddb.IdxStato= AnSt.IdxStato
WHERE AnSt.ClasseTempo = 'T_AutoRun' AND InizioStato >= @inizioOdl
)
/****************************************************
* Calcolo i TEMPI CICLO confermati
****************************************************/
-- DIVISIONE PER ZERO: controllo pezzi conf > 0...
IF(@PezziConf = 0) SET @PezziConf = 1
DECLARE @TCMed DECIMAL(18,8)
SET @TCMed = (
SELECT @TempoOn * 60 / @PezziConf -- tempo in ore
)
DECLARE @TCLav DECIMAL(18,8)
SET @TCLav = (
SELECT @TempoAuto * 60 / @PezziConf -- tempo in ore
)
DECLARE @TCEff DECIMAL(18,8)
SET @TCEff = (
SELECT @TempoRun * 60 / @PezziConf -- tempo in ore
)
/****************************************************
* Calcolo i TEMPI CICLO realtime (anche non confermati)
****************************************************/
-- DIVISIONE PER ZERO: controllo pezzi prod > 0...
IF(@PezziProd = 0) SET @PezziProd = 1
DECLARE @TCMedRT DECIMAL(18,8)
SET @TCMedRT = (
SELECT @TempoOnRT / @PezziProd
)
DECLARE @TCLavRT DECIMAL(18,8)
SET @TCLavRT = (
SELECT @TempoAutoRT / @PezziProd
)
DECLARE @TCEffRT DECIMAL(18,8)
SET @TCEffRT = (
SELECT @TempoRunRT / @PezziProd
)
SELECT @CodArticolo as CodArticolo, @PezziLanciati as PezziLanciati, @PezziProd as PezziProd, @PezziConf as PezziConf, @TCAss AS TCAssegnato, @CodOperatore AS CodOperatore, @TempoOn AS TempoOn, @TempoAuto AS TempoAuto, @TempoRun AS TempoRun, @TCMed AS TCMedio, @TCLav AS TCLav, @TCEff AS TCEff, @TCMedRT AS TCMedioRT, @TCLavRT AS TCLavRT, @TCEffRT AS TCEffRT
RETURN
go
commit;
go
-- registro versione...
INSERT INTO [dbo].[LogUpdateDb] ([Versione],[Data]) VALUES(315, GETDATE())
GO
@@ -0,0 +1,275 @@
set ANSI_NULLS on;
go
/*************************************
* Function f_lastTempoTecnico
* calcola il tempo tecnico per un impianto dato idxMacchina e intervallo di tempo x filtraggio
* utilizza migliori 10 tempi nell'intervallo e fa media
*
* modif.: S.E.L.
* il: 2011.03.30
**************************************/
create FUNCTION f_lastTempoTecnico
(
@idxMacchina NVARCHAR(50),
@finestraOre INT
)
RETURNS DECIMAL(18,8)
AS
BEGIN
DECLARE @TcTecnico AS DECIMAL (18,8)
;WITH LastTempi AS
(
SELECT TOP 10 *
FROM TempiCicloRilevati
WHERE IdxMacchina = @idxMacchina
AND DataOraRif >= DATEADD(HH,-@finestraOre,getdate())
ORDER BY TCMedio
)
SELECT @TcTecnico = AVG(TcMedio) FROM LastTempi
RETURN @TcTecnico
END
go
set xact_abort on;
go
begin transaction;
go
set ANSI_NULLS on;
go
/*************************************
* STORED PROCEDURE stp_repDonati_getDatiProdMacchina
* restituisce i dati di produzione di una macchina
*
* modif.: S.E.L. - 2012.03.08
**************************************/
alter PROCEDURE stp_repDonati_getDatiProdMacchina
(
@idxMacchina NVARCHAR(50)
)
AS
-- calcolo codice articolo
DECLARE @CodArticolo NVARCHAR (50)
SET @CodArticolo = (
SELECT CodArticolo FROM Kanban k
INNER JOIN StatoMacchine sm ON k.MatricolaKanban=sm.MatricolaKanban
WHERE sm.IdxMacchina = @idxMacchina
)
-- calcolo il codice operatore
DECLARE @CodOperatore INT
SET @CodOperatore = (
SELECT MatrOpr FROM StatoMacchine
WHERE IdxMacchina = @idxMacchina
)
-- calcolo il codice ODL
DECLARE @idxODL INT
SET @idxODL = (
SELECT idxODL FROM ODL
WHERE CodArticolo = @CodArticolo AND IdxMacchina = @idxMacchina AND (ISNULL(DataFine,DATEADD(hh,1,GETDATE())) > GETDATE())
)
DECLARE @PezziConf INT
SET @PezziConf = (
SELECT ISNULL(SUM(TotPzProd),0) FROM DatiProduzione
WHERE idxODL = @idxOdl
)
DECLARE @PezziLanciati INT
SET @PezziLanciati =(
SELECT ISNULL(SUM(NumPezzi),0) FROM ODL
WHERE idxODL = @idxOdl
)
DECLARE @TCAss DECIMAL(18,8)
SET @TCAss = (
SELECT ISNULL(SUM(TCAssegnato),0) FROM ODL
WHERE idxODL = @idxOdl
)
-- dato l'ODL calcolo il TC Medio ed i pezzi prodotti per l'ODL
DECLARE @inizioOdl DATETIME
SET @inizioOdl = (
SELECT DataInizio FROM ODL
WHERE idxODL = @idxOdl
)
DECLARE @PezziProd INT
SET @PezziProd = (
SELECT COUNT(*) FROM TempiCicloRilevati
WHERE DataOraRif >= @inizioOdl
)
/****************************************************
* Calcolo tempi apertura confermati
****************************************************/
-- calcolo i tempi di apertura: TempoON (Verde + giallo + rosso)
DECLARE @TempoOn DECIMAL(18,8)
SET @TempoOn = (
SELECT ISNULL(SUM(Tempo),0) FROM DatiProduzione
WHERE ClasseTempo NOT IN ('T_OFF', 'T_OFF_ND') AND idxODL = @idxOdl
)
-- calcolo i tempi di apertura: TempoAuto (Verde + giallo) - precedente meno "T_FermoRosso"
DECLARE @TempoAuto DECIMAL(18,8)
SET @TempoAuto = (
SELECT @TempoOn - ISNULL(SUM(Tempo),0) FROM DatiProduzione
WHERE ClasseTempo = 'T_FermoRosso' AND idxODL = @idxOdl
)
-- calcolo i tempi di apertura: TempoRun (Verde)
DECLARE @TempoRun DECIMAL(18,8)
SET @TempoRun = (
SELECT ISNULL(SUM(Tempo),0) FROM DatiProduzione
WHERE ClasseTempo = 'T_AutoRun' AND idxODL = @idxOdl
)
/****************************************************
* Calcolo tempi apertura realtime
****************************************************/
-- calcolo i tempi di apertura: TempoON (Verde + giallo + rosso)
DECLARE @TempoOnRT DECIMAL(18,8)
SET @TempoOnRT = (
SELECT ISNULL(SUM(DurataMinuti),0)
FROM DiarioDiBordo ddb INNER JOIN AnagraficaStati AnSt ON ddb.IdxStato= AnSt.IdxStato
WHERE AnSt.ClasseTempo NOT IN ('T_OFF', 'T_OFF_ND') AND InizioStato >= @inizioOdl
)
-- calcolo i tempi di apertura: TempoAuto (Verde + giallo) - precedente meno "T_FermoRosso"
DECLARE @TempoAutoRT DECIMAL(18,8)
SET @TempoAutoRT = (
SELECT @TempoOnRT - ISNULL(SUM(DurataMinuti),0)
FROM DiarioDiBordo ddb INNER JOIN AnagraficaStati AnSt ON ddb.IdxStato= AnSt.IdxStato
WHERE AnSt.ClasseTempo = 'T_FermoRosso' AND InizioStato >= @inizioOdl
)
-- calcolo i tempi di apertura: TempoRun (Verde)
DECLARE @TempoRunRT DECIMAL(18,8)
SET @TempoRunRT = (
SELECT ISNULL(SUM(DurataMinuti),0)
FROM DiarioDiBordo ddb INNER JOIN AnagraficaStati AnSt ON ddb.IdxStato= AnSt.IdxStato
WHERE AnSt.ClasseTempo = 'T_AutoRun' AND InizioStato >= @inizioOdl
)
DECLARE @numPezzi INT
/****************************************************
* Calcolo i TEMPI CICLO confermati
****************************************************/
-- DIVISIONE PER ZERO: controllo pezzi conf > 0
SET @numPezzi = @PezziConf
IF(@numPezzi = 0) SET @numPezzi = 1
DECLARE @TCMed DECIMAL(18,8)
SET @TCMed = (
SELECT @TempoOn * 60 / @numPezzi -- tempo in ore
)
DECLARE @TCLav DECIMAL(18,8)
SET @TCLav = (
SELECT @TempoAuto * 60 / @numPezzi -- tempo in ore
)
DECLARE @TCEff DECIMAL(18,8) -- è la media degli ultimi 10 migliori tempi minimi nell'ultima giornata
SET @TCEff = ISNULL(( SELECT dbo.f_lastTempoTecnico(@idxMacchina, 8) ), -1) -- provo a calcolare ultimi tempi tecnici
IF (@TCEff =-1)
BEGIN
SET @TCEff = (
SELECT @TempoRun * 60 / @numPezzi -- tempo in ore
)
END
/****************************************************
* Calcolo i TEMPI CICLO realtime (anche non confermati)
****************************************************/
-- DIVISIONE PER ZERO: controllo pezzi prod > 0...
SET @numPezzi = @PezziProd
IF(@numPezzi = 0) SET @numPezzi = 1
DECLARE @TCMedRT DECIMAL(18,8)
SET @TCMedRT = (
SELECT @TempoOnRT / @numPezzi
)
DECLARE @TCLavRT DECIMAL(18,8)
SET @TCLavRT = (
SELECT @TempoAutoRT / @numPezzi
)
DECLARE @TCEffRT DECIMAL(18,8)
SET @TCEffRT = (
SELECT @TempoRunRT / @numPezzi
)
SELECT @CodArticolo as CodArticolo, @PezziLanciati as PezziLanciati, @PezziProd as PezziProd, @PezziConf as PezziConf, @TCAss AS TCAssegnato, @CodOperatore AS CodOperatore, @TempoOn AS TempoOn, @TempoAuto AS TempoAuto, @TempoRun AS TempoRun, @TCMed AS TCMedio, @TCLav AS TCLav, @TCEff AS TCEff, @TCMedRT AS TCMedioRT, @TCLavRT AS TCLavRT, @TCEffRT AS TCEffRT
RETURN
go
/*************************************
* STORED PROCEDURE stp_repDonati_getLastStatoDurataMacchina
* restituisce l'ultimo stato di una macchina e la durata
* andando a filtrare gli eventi sotto una soglia indicata (default 6 sec)
* e quindi sommando
*
* modif.: S.E.L. - 2012.03.08
**************************************/
create PROCEDURE stp_repDonati_getLastStatoDurataMacchina
(
@idxMacchina NVARCHAR(50),
@minDurata FLOAT
)
AS
-- calcolo codice articolo
DECLARE @idxStato INT
SET @idxStato = (
SELECT TOP 1 ISNULL(IdxStato,0)
FROM DiarioDiBordo
WHERE idxMacchina = @idxMacchina
AND ISNULL(durataMinuti, 0) > @minDurata
ORDER BY InizioStato DESC
)
-- calcolo durata filtrata... ovvero evento più recente NON dello stato indicato (changed)
DECLARE @lastChTime DATETIME
SET @lastChTime = (
SELECT TOP 1 ISNULL(inizioStato, GetDate())
FROM DiarioDiBordo
WHERE idxMacchina = @idxMacchina
AND idxStato <> @idxStato
AND ISNULL(durataMinuti, 0) > @minDurata
ORDER BY InizioStato DESC
)
DECLARE @timeMinuti FLOAT
SET @timeMinuti = ( SELECT DATEDIFF(n, @lastChTime, GetDate()) )
SELECT @idxStato AS idxStato, @timeMinuti AS Minuti
RETURN
go
commit;
go
-- registro versione...
INSERT INTO [dbo].[LogUpdateDb] ([Versione],[Data]) VALUES(316, GETDATE())
GO
@@ -0,0 +1,291 @@
drop table DiarioDiBordo_backup;
go
set xact_abort on;
go
begin transaction;
go
set ANSI_NULLS on;
go
/*************************************
* STORED PROCEDURE stp_repDonati_getDatiProdMacchina
* restituisce i dati di produzione di una macchina
*
* modif.: S.E.L. - 2012.03.08
**************************************/
alter PROCEDURE stp_repDonati_getDatiProdMacchina
(
@idxMacchina NVARCHAR(50)
)
AS
-- calcolo codice articolo
DECLARE @CodArticolo NVARCHAR (50)
SET @CodArticolo = (
SELECT CodArticolo FROM Kanban k
INNER JOIN StatoMacchine sm ON k.MatricolaKanban=sm.MatricolaKanban
WHERE sm.IdxMacchina = @idxMacchina
)
-- calcolo il codice operatore
DECLARE @CodOperatore INT
SET @CodOperatore = (
SELECT MatrOpr FROM StatoMacchine
WHERE IdxMacchina = @idxMacchina
)
-- calcolo il codice ODL
DECLARE @idxODL INT
SET @idxODL = (
SELECT idxODL FROM ODL
WHERE CodArticolo = @CodArticolo AND IdxMacchina = @idxMacchina AND (ISNULL(DataFine,DATEADD(hh,1,GETDATE())) > GETDATE())
)
DECLARE @PezziConf INT
SET @PezziConf = (
SELECT ISNULL(SUM(TotPzProd),0) FROM DatiProduzione
WHERE idxODL = @idxOdl
)
DECLARE @PezziLanciati INT
SET @PezziLanciati =(
SELECT ISNULL(SUM(NumPezzi),0) FROM ODL
WHERE idxODL = @idxOdl
)
DECLARE @TCAss DECIMAL(18,8)
SET @TCAss = (
SELECT ISNULL(SUM(TCAssegnato),0) FROM ODL
WHERE idxODL = @idxOdl
)
-- dato l'ODL calcolo il TC Medio ed i pezzi prodotti per l'ODL
DECLARE @inizioOdl DATETIME
SET @inizioOdl = (
SELECT DataInizio FROM ODL
WHERE idxODL = @idxOdl
)
DECLARE @PezziProd INT
SET @PezziProd = (
SELECT COUNT(*) FROM TempiCicloRilevati
WHERE DataOraRif >= @inizioOdl
)
/****************************************************
* Calcolo tempi apertura confermati
****************************************************/
-- calcolo i tempi di apertura: TempoON (Verde + giallo + rosso)
DECLARE @TempoOn DECIMAL(18,8)
SET @TempoOn = (
SELECT ISNULL(SUM(Tempo),0) FROM DatiProduzione
WHERE ClasseTempo NOT IN ('T_OFF', 'T_OFF_ND') AND idxODL = @idxOdl
)
-- calcolo i tempi di apertura: TempoAuto (Verde + giallo) - precedente meno "T_FermoRosso"
DECLARE @TempoAuto DECIMAL(18,8)
SET @TempoAuto = (
SELECT @TempoOn - ISNULL(SUM(Tempo),0) FROM DatiProduzione
WHERE ClasseTempo = 'T_FermoRosso' AND idxODL = @idxOdl
)
-- calcolo i tempi di apertura: TempoRun (Verde)
DECLARE @TempoRun DECIMAL(18,8)
SET @TempoRun = (
SELECT ISNULL(SUM(Tempo),0) FROM DatiProduzione
WHERE ClasseTempo = 'T_AutoRun' AND idxODL = @idxOdl
)
/****************************************************
* Calcolo tempi apertura realtime
****************************************************/
-- calcolo i tempi di apertura: TempoON (Verde + giallo + rosso)
DECLARE @TempoOnRT DECIMAL(18,8)
SET @TempoOnRT = (
SELECT ISNULL(SUM(DurataMinuti),0)
FROM DiarioDiBordo ddb INNER JOIN AnagraficaStati AnSt ON ddb.IdxStato= AnSt.IdxStato
WHERE AnSt.ClasseTempo NOT IN ('T_OFF', 'T_OFF_ND') AND InizioStato >= @inizioOdl
)
-- calcolo i tempi di apertura: TempoAuto (Verde + giallo) - precedente meno "T_FermoRosso"
DECLARE @TempoAutoRT DECIMAL(18,8)
SET @TempoAutoRT = (
SELECT @TempoOnRT - ISNULL(SUM(DurataMinuti),0)
FROM DiarioDiBordo ddb INNER JOIN AnagraficaStati AnSt ON ddb.IdxStato= AnSt.IdxStato
WHERE AnSt.ClasseTempo = 'T_FermoRosso' AND InizioStato >= @inizioOdl
)
-- calcolo i tempi di apertura: TempoRun (Verde)
DECLARE @TempoRunRT DECIMAL(18,8)
SET @TempoRunRT = (
SELECT ISNULL(SUM(DurataMinuti),0)
FROM DiarioDiBordo ddb INNER JOIN AnagraficaStati AnSt ON ddb.IdxStato= AnSt.IdxStato
WHERE AnSt.ClasseTempo = 'T_AutoRun' AND InizioStato >= @inizioOdl
)
DECLARE @numPezzi INT
/****************************************************
* Calcolo i TEMPI CICLO confermati
****************************************************/
-- DIVISIONE PER ZERO: controllo pezzi conf > 0
SET @numPezzi = @PezziConf
IF(@numPezzi = 0) SET @numPezzi = 1
DECLARE @TCMed DECIMAL(18,8)
SET @TCMed = (
SELECT @TempoOn * 60 / @numPezzi -- tempo in ore
)
DECLARE @TCLav DECIMAL(18,8)
SET @TCLav = (
SELECT @TempoAuto * 60 / @numPezzi -- tempo in ore
)
DECLARE @TCEff DECIMAL(18,8) -- è la media degli ultimi 10 migliori tempi minimi nell'ultima giornata
SET @TCEff = (
SELECT @TempoRun * 60 / @numPezzi -- tempo in ore
)
/****************************************************
* Calcolo i TEMPI CICLO realtime (anche non confermati)
****************************************************/
-- DIVISIONE PER ZERO: controllo pezzi prod > 0...
SET @numPezzi = @PezziProd
IF(@numPezzi = 0) SET @numPezzi = 1
DECLARE @TCMedRT DECIMAL(18,8)
SET @TCMedRT = (
SELECT @TempoOnRT / @numPezzi
)
DECLARE @TCLavRT DECIMAL(18,8)
SET @TCLavRT = (
SELECT @TempoAutoRT / @numPezzi
)
DECLARE @TCEffRT DECIMAL(18,8)
SET @TCEffRT = ISNULL(( SELECT dbo.f_lastTempoTecnico(@idxMacchina, 2) ), -1) -- provo a calcolare ultimi tempi tecnici
IF (@TCEffRT =-1)
BEGIN
SET @TCEffRT = (
SELECT @TempoRunRT / @numPezzi
)
END
SELECT @CodArticolo as CodArticolo, @PezziLanciati as PezziLanciati, @PezziProd as PezziProd, @PezziConf as PezziConf, @TCAss AS TCAssegnato, @CodOperatore AS CodOperatore, @TempoOn AS TempoOn, @TempoAuto AS TempoAuto, @TempoRun AS TempoRun, @TCMed AS TCMedio, @TCLav AS TCLav, @TCEff AS TCEff, @TCMedRT AS TCMedioRT, @TCLavRT AS TCLavRT, @TCEffRT AS TCEffRT
RETURN
go
/*************************************
* STORED PROCEDURE stp_repDonati_getLastStatoDurataMacchina
* restituisce l'ultimo stato di una macchina e la durata
* andando a filtrare gli eventi sotto una soglia indicata (default 6 sec)
* e quindi sommando
*
* modif.: S.E.L. - 2012.03.08
**************************************/
alter PROCEDURE stp_repDonati_getLastStatoDurataMacchina
(
@idxMacchina NVARCHAR(50),
@minDurata FLOAT
)
AS
-- calcolo codice articolo
DECLARE @idxStato INT
SET @idxStato = (
SELECT TOP 1 ISNULL(IdxStato,0)
FROM DiarioDiBordo
WHERE idxMacchina = @idxMacchina
--AND ISNULL(durataMinuti, 0) > @minDurata
ORDER BY InizioStato DESC
)
-- calcolo durata filtrata... ovvero evento più recente NON dello stato indicato (changed)
DECLARE @lastChTime DATETIME
SET @lastChTime = (
SELECT TOP 1 ISNULL(inizioStato, GetDate())
FROM DiarioDiBordo
WHERE idxMacchina = @idxMacchina
AND idxStato <> @idxStato
AND ISNULL(durataMinuti, 0) > @minDurata
ORDER BY InizioStato DESC
)
DECLARE @timeMinuti FLOAT
SET @timeMinuti = ( SELECT DATEDIFF(n, @lastChTime, GetDate()) )
SELECT @idxStato AS idxStato, @timeMinuti AS Minuti
RETURN
go
commit;
go
set xact_abort on;
go
begin transaction;
go
set ANSI_NULLS on;
go
/*************************************
* Function f_lastTempoTecnico
* calcola il tempo tecnico per un impianto dato idxMacchina e intervallo di tempo x filtraggio
* utilizza migliori 10 tempi nell'intervallo e fa media
*
* modif.: S.E.L.
* il: 2011.03.30
**************************************/
alter FUNCTION f_lastTempoTecnico
(
@idxMacchina NVARCHAR(50),
@finestraOre INT
)
RETURNS DECIMAL(18,8)
AS
BEGIN
DECLARE @TcTecnico AS DECIMAL (18,8)
;WITH LastTempi AS
(
SELECT TOP 5 *
FROM TempiCicloRilevati
WHERE IdxMacchina = @idxMacchina
AND DataOraRif >= DATEADD(HH,-@finestraOre,getdate())
ORDER BY TCMedio
)
SELECT @TcTecnico = AVG(TcMedio) FROM LastTempi
RETURN @TcTecnico
END
go
commit;
go
-- registro versione...
INSERT INTO [dbo].[LogUpdateDb] ([Versione],[Data]) VALUES(317, GETDATE())
GO
@@ -0,0 +1,420 @@
set xact_abort on;
go
begin transaction;
go
set ANSI_NULLS on;
go
/*************************************
* STORED PROCEDURE stp_repDonati_getDatiProdMacchina
* restituisce i dati di produzione di una macchina per l'ULTIMO ODL
*
* modif.: S.E.L. - 2012.03.08
**************************************/
alter PROCEDURE stp_repDonati_getDatiProdMacchina
(
@idxMacchina NVARCHAR(50)
)
AS
-- calcolo codice articolo
DECLARE @CodArticolo NVARCHAR (50)
SET @CodArticolo = (
SELECT CodArticolo FROM Kanban k
INNER JOIN StatoMacchine sm ON k.MatricolaKanban=sm.MatricolaKanban
WHERE sm.IdxMacchina = @idxMacchina
)
-- calcolo il codice operatore
DECLARE @CodOperatore INT
SET @CodOperatore = (
SELECT MatrOpr FROM StatoMacchine
WHERE IdxMacchina = @idxMacchina
)
-- calcolo il codice ODL
DECLARE @idxODL INT
SET @idxODL = (
SELECT idxODL FROM ODL
WHERE CodArticolo = @CodArticolo AND IdxMacchina = @idxMacchina AND (ISNULL(DataFine,DATEADD(hh,1,GETDATE())) > GETDATE())
)
DECLARE @PezziConf INT
SET @PezziConf = (
SELECT ISNULL(SUM(TotPzProd),0) FROM DatiProduzione
WHERE idxODL = @idxOdl
)
DECLARE @PezziLanciati INT
SET @PezziLanciati =(
SELECT ISNULL(SUM(NumPezzi),0) FROM ODL
WHERE idxODL = @idxOdl
)
DECLARE @TCAss DECIMAL(18,8)
SET @TCAss = (
SELECT ISNULL(SUM(TCAssegnato),0) FROM ODL
WHERE idxODL = @idxOdl
)
-- dato l'ODL calcolo il TC Medio ed i pezzi prodotti per l'ODL
DECLARE @inizioOdl DATETIME
SET @inizioOdl = (
SELECT DataInizio FROM ODL
WHERE idxODL = @idxOdl
)
DECLARE @PezziProd INT
SET @PezziProd = (
SELECT COUNT(*) FROM TempiCicloRilevati
WHERE DataOraRif >= @inizioOdl
AND idxMacchina = @idxMacchina
)
/****************************************************
* Calcolo tempi apertura confermati
****************************************************/
-- calcolo i tempi di apertura: TempoON (Verde + giallo + rosso)
DECLARE @TempoOn DECIMAL(18,8)
SET @TempoOn = (
SELECT ISNULL(SUM(Tempo),0) FROM DatiProduzione
WHERE ClasseTempo NOT IN ('T_OFF', 'T_OFF_ND') AND idxODL = @idxOdl
)
-- calcolo i tempi di apertura: TempoAuto (Verde + giallo) - precedente meno "T_FermoRosso"
DECLARE @TempoAuto DECIMAL(18,8)
SET @TempoAuto = (
SELECT @TempoOn - ISNULL(SUM(Tempo),0) FROM DatiProduzione
WHERE ClasseTempo = 'T_FermoRosso' AND idxODL = @idxOdl
)
-- calcolo i tempi di apertura: TempoRun (Verde)
DECLARE @TempoRun DECIMAL(18,8)
SET @TempoRun = (
SELECT ISNULL(SUM(Tempo),0) FROM DatiProduzione
WHERE ClasseTempo = 'T_AutoRun' AND idxODL = @idxOdl
)
/****************************************************
* Calcolo tempi apertura realtime
****************************************************/
-- calcolo i tempi di apertura: TempoON (Verde + giallo + rosso)
DECLARE @TempoOnRT DECIMAL(18,8)
SET @TempoOnRT = (
SELECT ISNULL(SUM(DurataMinuti),0)
FROM DiarioDiBordo ddb INNER JOIN AnagraficaStati AnSt ON ddb.IdxStato= AnSt.IdxStato
WHERE AnSt.ClasseTempo NOT IN ('T_OFF', 'T_OFF_ND') AND InizioStato >= @inizioOdl
AND IdxMacchina = @idxMacchina
)
-- calcolo i tempi di apertura: TempoAuto (Verde + giallo) - precedente meno "T_FermoRosso"
DECLARE @TempoAutoRT DECIMAL(18,8)
SET @TempoAutoRT = (
SELECT @TempoOnRT - ISNULL(SUM(DurataMinuti),0)
FROM DiarioDiBordo ddb INNER JOIN AnagraficaStati AnSt ON ddb.IdxStato= AnSt.IdxStato
WHERE AnSt.ClasseTempo = 'T_FermoRosso' AND InizioStato >= @inizioOdl
AND IdxMacchina = @idxMacchina
)
-- calcolo i tempi di apertura: TempoRun (Verde)
DECLARE @TempoRunRT DECIMAL(18,8)
SET @TempoRunRT = (
SELECT ISNULL(SUM(DurataMinuti),0)
FROM DiarioDiBordo ddb INNER JOIN AnagraficaStati AnSt ON ddb.IdxStato= AnSt.IdxStato
WHERE AnSt.ClasseTempo = 'T_AutoRun' AND InizioStato >= @inizioOdl
AND IdxMacchina = @idxMacchina
)
DECLARE @numPezzi INT
/****************************************************
* Calcolo i TEMPI CICLO confermati
****************************************************/
-- DIVISIONE PER ZERO: controllo pezzi conf > 0
SET @numPezzi = @PezziConf
IF(@numPezzi = 0) SET @numPezzi = 1
DECLARE @TCMed DECIMAL(18,8)
SET @TCMed = (
SELECT @TempoOn * 60 / @numPezzi -- tempo in ore
)
DECLARE @TCLav DECIMAL(18,8)
SET @TCLav = (
SELECT @TempoAuto * 60 / @numPezzi -- tempo in ore
)
DECLARE @TCEff DECIMAL(18,8) -- è la media degli ultimi 10 migliori tempi minimi nell'ultima giornata
SET @TCEff = (
SELECT @TempoRun * 60 / @numPezzi -- tempo in ore
)
/****************************************************
* Calcolo i TEMPI CICLO realtime (anche non confermati)
****************************************************/
-- DIVISIONE PER ZERO: controllo pezzi prod > 0...
SET @numPezzi = @PezziProd
IF(@numPezzi = 0) SET @numPezzi = 1
DECLARE @TCMedRT DECIMAL(18,8)
SET @TCMedRT = (
SELECT @TempoOnRT / @numPezzi
)
DECLARE @TCLavRT DECIMAL(18,8)
SET @TCLavRT = (
SELECT @TempoAutoRT / @numPezzi
)
DECLARE @TCEffRT DECIMAL(18,8)
SET @TCEffRT = ISNULL(( SELECT dbo.f_lastTempoTecnico(@idxMacchina, 2) ), -1) -- provo a calcolare ultimi tempi tecnici
IF (@TCEffRT =-1)
BEGIN
SET @TCEffRT = (
SELECT @TempoRunRT / @numPezzi
)
END
SELECT @CodArticolo as CodArticolo, @PezziLanciati as PezziLanciati, @PezziProd as PezziProd, @PezziConf as PezziConf, @TCAss AS TCAssegnato, @CodOperatore AS CodOperatore, @TempoOn AS TempoOn, @TempoAuto AS TempoAuto, @TempoRun AS TempoRun, @TCMed AS TCMedio, @TCLav AS TCLav, @TCEff AS TCEff, @TCMedRT AS TCMedioRT, @TCLavRT AS TCLavRT, @TCEffRT AS TCEffRT
RETURN
go
/*************************************
* STORED PROCEDURE stp_repDonati_getDatiProdMacchina
* restituisce i dati di produzione di una macchina per PERIODO
*
* modif.: S.E.L. - 2012.03.21
**************************************/
create PROCEDURE stp_repDonati_getDatiProdMacchinaPeriodo
(
@idxMacchina NVARCHAR(50),
@dataFrom DATETIME,
@dataTo DATETIME
)
AS
-- calcolo pezzi CONTATI, non quelli poi confermati...
DECLARE @PezziProd INT
SET @PezziProd = ISNULL((
SELECT COUNT(*)FROM TempiCicloRilevati
WHERE idxMacchina = @idxMacchina
AND DataOraRif BETWEEN @dataFrom AND @dataTo
), 0)
-- calcolo TEMPO MEDIO ponderato in base al num di pezzi per tipo...
DECLARE @TCAss DECIMAL(18,8)
;WITH cte_tabMinProd as
(
SELECT ISNULL(COUNT(tcr.DataOraRif), 0) * ISNULL(o.TCAssegnato, 0) AS MinProd
FROM TempiCicloRilevati tcr INNER JOIN ODL o
ON o.IdxMacchina=tcr.IdxMacchina AND o.CodArticolo = tcr.CodArticolo
WHERE tcr.DataOraRif BETWEEN o.DataInizio and o.DataFine
AND tcr.DataOraRif BETWEEN @dataFrom AND @dataTo
AND ((o.DataInizio <= @dataTo) AND (o.DataFine >= @dataFrom))
GROUP BY o.TCAssegnato--, tcr.IdxMacchina, tcr.CodArticolo,
)
SELECT @TCAss = ISNULL(SUM(MinProd) / @PezziProd, 0)
FROM cte_tabMinProd
/****************************************************
* Calcolo tempi apertura realtime
****************************************************/
-- calcolo i tempi di apertura: TempoON (Verde + giallo + rosso)
DECLARE @TempoOnRT DECIMAL(18,8)
SET @TempoOnRT = (
SELECT ISNULL(SUM(DurataMinuti),0)
FROM DiarioDiBordo ddb INNER JOIN AnagraficaStati AnSt ON ddb.IdxStato= AnSt.IdxStato
WHERE AnSt.ClasseTempo NOT IN ('T_OFF', 'T_OFF_ND') AND InizioStato BETWEEN @dataFrom AND @dataTo
AND IdxMacchina = @idxMacchina
)
-- calcolo i tempi di apertura: TempoAuto (Verde + giallo) - precedente meno "T_FermoRosso"
DECLARE @TempoAutoRT DECIMAL(18,8)
SET @TempoAutoRT = (
SELECT @TempoOnRT - ISNULL(SUM(DurataMinuti),0)
FROM DiarioDiBordo ddb INNER JOIN AnagraficaStati AnSt ON ddb.IdxStato= AnSt.IdxStato
WHERE AnSt.ClasseTempo = 'T_FermoRosso' AND InizioStato BETWEEN @dataFrom AND @dataTo
AND IdxMacchina = @idxMacchina
)
-- calcolo i tempi di apertura: TempoRun (Verde)
DECLARE @TempoRunRT DECIMAL(18,8)
SET @TempoRunRT = (
SELECT ISNULL(SUM(DurataMinuti),0)
FROM DiarioDiBordo ddb INNER JOIN AnagraficaStati AnSt ON ddb.IdxStato= AnSt.IdxStato
WHERE AnSt.ClasseTempo = 'T_AutoRun' AND InizioStato BETWEEN @dataFrom AND @dataTo
AND IdxMacchina = @idxMacchina
)
/****************************************************
* Calcolo i TEMPI CICLO realtime (anche non confermati)
****************************************************/
-- DIVISIONE PER ZERO: controllo pezzi prod > 0...
DECLARE @numPezzi INT
SET @numPezzi = @PezziProd
IF(@numPezzi = 0) SET @numPezzi = 1
DECLARE @TCMedRT DECIMAL(18,8)
SET @TCMedRT = (
SELECT @TempoOnRT / @numPezzi
)
DECLARE @TCLavRT DECIMAL(18,8)
SET @TCLavRT = (
SELECT @TempoAutoRT / @numPezzi
)
DECLARE @TCEffRT DECIMAL(18,8)
SET @TCEffRT = ISNULL(( SELECT dbo.f_lastTempoTecnico(@idxMacchina, 2) ), -1) -- provo a calcolare ultimi tempi tecnici
IF (@TCEffRT =-1)
BEGIN
SET @TCEffRT = (
SELECT @TempoRunRT / @numPezzi
)
END
SELECT @PezziProd as PezziProd, @TCAss AS TCAssegnato, @TCMedRT AS TCMedioRT, @TCLavRT AS TCLavRT, @TCEffRT AS TCEffRT
RETURN
go
commit;
go
set xact_abort on;
go
begin transaction;
go
set ANSI_NULLS on;
go
/*************************************
* STORED PROCEDURE stp_repDonati_getDatiProdMacchina
* restituisce i dati di produzione di una macchina per PERIODO
*
* modif.: S.E.L. - 2012.03.21
**************************************/
alter PROCEDURE stp_repDonati_getDatiProdMacchinaPeriodo
(
@idxMacchina NVARCHAR(50),
@dataFrom DATETIME,
@dataTo DATETIME
)
AS
-- calcolo pezzi CONTATI, non quelli poi confermati...
DECLARE @PezziProd INT
SET @PezziProd = ISNULL((
SELECT COUNT(*)FROM TempiCicloRilevati
WHERE idxMacchina = @idxMacchina
AND DataOraRif BETWEEN @dataFrom AND @dataTo
), 0)
-- calcolo TEMPO MEDIO ponderato in base al num di pezzi per tipo...
DECLARE @TCAss DECIMAL(18,8)
;WITH cte_tabMinProd as
(
SELECT ISNULL(COUNT(tcr.DataOraRif), 0) * ISNULL(o.TCAssegnato, 0) AS MinProd
FROM TempiCicloRilevati tcr INNER JOIN ODL o
ON o.IdxMacchina=tcr.IdxMacchina AND o.CodArticolo = tcr.CodArticolo
WHERE tcr.DataOraRif BETWEEN o.DataInizio AND ISNULL(o.DataFine, GETDATE())
AND tcr.DataOraRif BETWEEN @dataFrom AND @dataTo
AND ((o.DataInizio <= @dataTo) AND (ISNULL(o.DataFine, GETDATE()) >= @dataFrom))
GROUP BY o.TCAssegnato
)
SELECT @TCAss = ISNULL(SUM(MinProd) / @PezziProd, 0)
FROM cte_tabMinProd
/****************************************************
* Calcolo tempi apertura realtime
****************************************************/
-- calcolo i tempi di apertura: TempoON (Verde + giallo + rosso)
DECLARE @TempoOnRT DECIMAL(18,8)
SET @TempoOnRT = (
SELECT ISNULL(SUM(DurataMinuti),0)
FROM DiarioDiBordo ddb INNER JOIN AnagraficaStati AnSt ON ddb.IdxStato= AnSt.IdxStato
WHERE AnSt.ClasseTempo NOT IN ('T_OFF', 'T_OFF_ND') AND InizioStato BETWEEN @dataFrom AND @dataTo
AND IdxMacchina = @idxMacchina
)
-- calcolo i tempi di apertura: TempoAuto (Verde + giallo) - precedente meno "T_FermoRosso"
DECLARE @TempoAutoRT DECIMAL(18,8)
SET @TempoAutoRT = (
SELECT @TempoOnRT - ISNULL(SUM(DurataMinuti),0)
FROM DiarioDiBordo ddb INNER JOIN AnagraficaStati AnSt ON ddb.IdxStato= AnSt.IdxStato
WHERE AnSt.ClasseTempo = 'T_FermoRosso' AND InizioStato BETWEEN @dataFrom AND @dataTo
AND IdxMacchina = @idxMacchina
)
-- calcolo i tempi di apertura: TempoRun (Verde)
DECLARE @TempoRunRT DECIMAL(18,8)
SET @TempoRunRT = (
SELECT ISNULL(SUM(DurataMinuti),0)
FROM DiarioDiBordo ddb INNER JOIN AnagraficaStati AnSt ON ddb.IdxStato= AnSt.IdxStato
WHERE AnSt.ClasseTempo = 'T_AutoRun' AND InizioStato BETWEEN @dataFrom AND @dataTo
AND IdxMacchina = @idxMacchina
)
/****************************************************
* Calcolo i TEMPI CICLO realtime (anche non confermati)
****************************************************/
-- DIVISIONE PER ZERO: controllo pezzi prod > 0...
DECLARE @numPezzi INT
SET @numPezzi = @PezziProd
IF(@numPezzi = 0) SET @numPezzi = 1
DECLARE @TCMedRT DECIMAL(18,8)
SET @TCMedRT = (
SELECT @TempoOnRT / @numPezzi
)
DECLARE @TCLavRT DECIMAL(18,8)
SET @TCLavRT = (
SELECT @TempoAutoRT / @numPezzi
)
DECLARE @TCEffRT DECIMAL(18,8)
SET @TCEffRT = ISNULL(( SELECT dbo.f_lastTempoTecnico(@idxMacchina, 2) ), -1) -- provo a calcolare ultimi tempi tecnici
IF (@TCEffRT =-1)
BEGIN
SET @TCEffRT = (
SELECT @TempoRunRT / @numPezzi
)
END
SELECT @PezziProd as PezziProd, @TCAss AS TCAssegnato, @TCMedRT AS TCMedioRT, @TCLavRT AS TCLavRT, @TCEffRT AS TCEffRT
RETURN
go
commit;
go
-- registro versione...
INSERT INTO [dbo].[LogUpdateDb] ([Versione],[Data]) VALUES(318, GETDATE())
GO
@@ -0,0 +1,444 @@
set xact_abort on;
go
begin transaction;
go
set ANSI_NULLS on;
go
/*************************************
* Function f_lastTempoTecnico
* calcola il tempo tecnico per un impianto dato idxMacchina e intervallo di tempo x filtraggio
* utilizza migliori 10 tempi nell'intervallo e fa media
*
* modif.: S.E.L.
* il: 2011.03.30
**************************************/
alter FUNCTION f_lastTempoTecnico
(
@idxMacchina NVARCHAR(50),
@finestraOre INT
)
RETURNS DECIMAL(18,8)
AS
BEGIN
DECLARE @TcTecnico AS DECIMAL (18,8)
;WITH LastTempi AS
(
SELECT TOP 5 *
FROM TempiCicloRilevati
WHERE IdxMacchina = @idxMacchina
AND DataOraRif >= DATEADD(HH,-@finestraOre,getdate())
ORDER BY TCMedio
)
SELECT @TcTecnico = ISNULL(MIN(TcMedio),0) FROM LastTempi
--SELECT @TcTecnico = AVG(TcMedio) FROM LastTempi
RETURN @TcTecnico
END
go
commit;
go
set xact_abort on;
go
begin transaction;
go
set ANSI_NULLS on;
go
/*************************************
* STORED PROCEDURE stp_repDonati_getDatiProdMacchina
* restituisce i dati di produzione di una macchina per l'ULTIMO ODL
*
* modif.: S.E.L. - 2012.03.08
**************************************/
alter PROCEDURE stp_repDonati_getDatiProdMacchina
(
@idxMacchina NVARCHAR(50)
)
AS
-- calcolo codice articolo
DECLARE @CodArticolo NVARCHAR (50)
SET @CodArticolo = (
SELECT CodArticolo FROM Kanban k
INNER JOIN StatoMacchine sm ON k.MatricolaKanban=sm.MatricolaKanban
WHERE sm.IdxMacchina = @idxMacchina
)
-- calcolo il codice operatore
DECLARE @CodOperatore INT
SET @CodOperatore = (
SELECT MatrOpr FROM StatoMacchine
WHERE IdxMacchina = @idxMacchina
)
-- calcolo il codice ODL
DECLARE @idxODL INT
SET @idxODL = (
SELECT idxODL FROM ODL
WHERE CodArticolo = @CodArticolo AND IdxMacchina = @idxMacchina AND (ISNULL(DataFine,DATEADD(hh,1,GETDATE())) > GETDATE())
)
DECLARE @PezziConf INT
SET @PezziConf = (
SELECT ISNULL(SUM(TotPzProd),0) FROM DatiProduzione
WHERE idxODL = @idxOdl
)
DECLARE @PezziLanciati INT
SET @PezziLanciati =(
SELECT ISNULL(SUM(NumPezzi),0) FROM ODL
WHERE idxODL = @idxOdl
)
DECLARE @TCAss DECIMAL(18,8)
SET @TCAss = (
SELECT ISNULL(SUM(TCAssegnato),0) FROM ODL
WHERE idxODL = @idxOdl
)
-- dato l'ODL calcolo il TC Medio ed i pezzi prodotti per l'ODL
DECLARE @inizioOdl DATETIME
SET @inizioOdl = (
SELECT DataInizio FROM ODL
WHERE idxODL = @idxOdl
)
DECLARE @PezziProd INT
SET @PezziProd = (
SELECT COUNT(*) FROM TempiCicloRilevati
WHERE DataOraRif >= @inizioOdl
AND idxMacchina = @idxMacchina
)
/****************************************************
* Calcolo tempi apertura confermati
****************************************************/
-- calcolo i tempi di apertura: TempoON (Verde + giallo + rosso)
DECLARE @TempoOn DECIMAL(18,8)
SET @TempoOn = (
SELECT ISNULL(SUM(Tempo),0) FROM DatiProduzione
WHERE ClasseTempo NOT IN ('T_OFF', 'T_OFF_ND') AND idxODL = @idxOdl
)
-- calcolo i tempi di apertura: TempoAuto (Verde + giallo) - precedente meno "T_FermoRosso"
DECLARE @TempoAuto DECIMAL(18,8)
SET @TempoAuto = (
SELECT @TempoOn - ISNULL(SUM(Tempo),0) FROM DatiProduzione
WHERE ClasseTempo = 'T_FermoRosso' AND idxODL = @idxOdl
)
-- calcolo i tempi di apertura: TempoRun (Verde)
DECLARE @TempoRun DECIMAL(18,8)
SET @TempoRun = (
SELECT ISNULL(SUM(Tempo),0) FROM DatiProduzione
WHERE ClasseTempo = 'T_AutoRun' AND idxODL = @idxOdl
)
/****************************************************
* Calcolo tempi apertura realtime
****************************************************/
-- calcolo i tempi di apertura: TempoON (Verde + giallo + rosso)
DECLARE @TempoOnRT DECIMAL(18,8)
SET @TempoOnRT = (
SELECT ISNULL(SUM(DurataMinuti),0)
FROM DiarioDiBordo ddb INNER JOIN AnagraficaStati AnSt ON ddb.IdxStato= AnSt.IdxStato
WHERE AnSt.ClasseTempo NOT IN ('T_OFF', 'T_OFF_ND') AND InizioStato >= @inizioOdl
AND IdxMacchina = @idxMacchina
)
-- calcolo i tempi di apertura: TempoAuto (Verde + giallo) - precedente meno "T_FermoRosso"
DECLARE @TempoAutoRT DECIMAL(18,8)
SET @TempoAutoRT = (
SELECT @TempoOnRT - ISNULL(SUM(DurataMinuti),0)
FROM DiarioDiBordo ddb INNER JOIN AnagraficaStati AnSt ON ddb.IdxStato= AnSt.IdxStato
WHERE AnSt.ClasseTempo = 'T_FermoRosso' AND InizioStato >= @inizioOdl
AND IdxMacchina = @idxMacchina
)
-- calcolo i tempi di apertura: TempoRun (Verde)
DECLARE @TempoRunRT DECIMAL(18,8)
SET @TempoRunRT = (
SELECT ISNULL(SUM(DurataMinuti),0)
FROM DiarioDiBordo ddb INNER JOIN AnagraficaStati AnSt ON ddb.IdxStato= AnSt.IdxStato
WHERE AnSt.ClasseTempo = 'T_AutoRun' AND InizioStato >= @inizioOdl
AND IdxMacchina = @idxMacchina
)
DECLARE @numPezzi INT
/****************************************************
* Calcolo i TEMPI CICLO confermati
****************************************************/
-- DIVISIONE PER ZERO: controllo pezzi conf > 0
SET @numPezzi = @PezziConf - 1 -- divido per n-1 per avere numIntervalli = numPezzi
IF(@numPezzi < 1) SET @numPezzi = 1
DECLARE @TCMed DECIMAL(18,8)
SET @TCMed = (
SELECT @TempoOn * 60 / @numPezzi -- tempo in ore
)
DECLARE @TCLav DECIMAL(18,8)
SET @TCLav = (
SELECT @TempoAuto * 60 / @numPezzi -- tempo in ore
)
DECLARE @TCEff DECIMAL(18,8) -- è la media degli ultimi 10 migliori tempi minimi nell'ultima giornata
SET @TCEff = (
SELECT @TempoRun * 60 / @numPezzi -- tempo in ore
)
/****************************************************
* Calcolo i TEMPI CICLO realtime (anche non confermati)
****************************************************/
-- DIVISIONE PER ZERO: controllo pezzi prod > 0...
SET @numPezzi = @PezziProd - 1 -- divido per n-1 per avere numIntervalli = numPezzi
IF(@numPezzi < 1) SET @numPezzi = 1
DECLARE @TCMedRT DECIMAL(18,8)
SET @TCMedRT = (
SELECT @TempoOnRT / @numPezzi
)
DECLARE @TCLavRT DECIMAL(18,8)
SET @TCLavRT = (
SELECT @TempoAutoRT / @numPezzi
)
DECLARE @TCEffRT DECIMAL(18,8)
SET @TCEffRT = ISNULL(( SELECT dbo.f_lastTempoTecnico(@idxMacchina, 2) ), -1) -- provo a calcolare ultimi tempi tecnici
IF (@TCEffRT =-1)
BEGIN
SET @TCEffRT = (
SELECT @TempoRunRT / @numPezzi
)
END
SELECT @CodArticolo as CodArticolo, @PezziLanciati as PezziLanciati, @PezziProd as PezziProd, @PezziConf as PezziConf, @TCAss AS TCAssegnato, @CodOperatore AS CodOperatore, @TempoOn AS TempoOn, @TempoAuto AS TempoAuto, @TempoRun AS TempoRun, @TCMed AS TCMedio, @TCLav AS TCLav, @TCEff AS TCEff, @TCMedRT AS TCMedioRT, @TCLavRT AS TCLavRT, @TCEffRT AS TCEffRT
RETURN
go
/*************************************
* STORED PROCEDURE stp_repDonati_getLastStatoDurataMacchina
* restituisce l'ultimo stato di una macchina e la durata
* andando a filtrare gli eventi sotto una soglia indicata @minDurata (in minuti)
* e quindi sommando
*
* modif.: S.E.L. - 2012.03.08
**************************************/
alter PROCEDURE stp_repDonati_getLastStatoDurataMacchina
(
@idxMacchina NVARCHAR(50),
@minDurata FLOAT
)
AS
-- calcolo codice articolo
DECLARE @idxStato INT
SET @idxStato = (
SELECT TOP 1 ISNULL(IdxStato,0)
FROM DiarioDiBordo
WHERE idxMacchina = @idxMacchina
--AND ISNULL(durataMinuti, 0) > @minDurata
ORDER BY InizioStato DESC
)
-- calcolo durata filtrata... ovvero evento più recente NON dello stato indicato (changed)
DECLARE @lastChTime DATETIME
SET @lastChTime = (
SELECT TOP 1 ISNULL(inizioStato, GetDate())
FROM DiarioDiBordo
WHERE idxMacchina = @idxMacchina
AND idxStato <> @idxStato
AND ISNULL(durataMinuti, 0) > @minDurata
ORDER BY InizioStato DESC
)
DECLARE @timeMinuti FLOAT
SET @timeMinuti = ( SELECT DATEDIFF(n, @lastChTime, GetDate()) )
SELECT @idxStato AS idxStato, @timeMinuti AS Minuti
RETURN
go
commit;
go
set xact_abort on;
go
begin transaction;
go
set ANSI_NULLS on;
go
/*************************************
* STORED PROCEDURE stp_repDonati_getDatiProdMacchina
* restituisce i dati di produzione di una macchina per PERIODO
*
* modif.: S.E.L. - 2012.03.21
**************************************/
alter PROCEDURE stp_repDonati_getDatiProdMacchinaPeriodo
(
@idxMacchina NVARCHAR(50),
@dataFrom DATETIME,
@dataTo DATETIME
)
AS
-- calcolo pezzi CONTATI, non quelli poi confermati...
DECLARE @PezziProd INT
SET @PezziProd = ISNULL((
SELECT COUNT(*)FROM TempiCicloRilevati
WHERE idxMacchina = @idxMacchina
AND DataOraRif BETWEEN @dataFrom AND @dataTo
), 0)
-- calcolo TEMPO MEDIO ponderato in base al num di pezzi per tipo...
DECLARE @TCAss DECIMAL(18,8)
;WITH cte_tabMinProd as
(
SELECT ISNULL(COUNT(tcr.DataOraRif), 0) * ISNULL(o.TCAssegnato, 0) AS MinProd
FROM TempiCicloRilevati tcr INNER JOIN ODL o
ON o.IdxMacchina=tcr.IdxMacchina AND o.CodArticolo = tcr.CodArticolo
WHERE tcr.DataOraRif BETWEEN o.DataInizio AND ISNULL(o.DataFine, GETDATE())
AND tcr.DataOraRif BETWEEN @dataFrom AND @dataTo
AND ((o.DataInizio <= @dataTo) AND (ISNULL(o.DataFine, GETDATE()) >= @dataFrom))
GROUP BY o.TCAssegnato
)
SELECT @TCAss = ISNULL(SUM(MinProd) / @PezziProd, 0)
FROM cte_tabMinProd
/****************************************************
* Calcolo tempi apertura realtime
****************************************************/
-- calcolo i tempi di apertura: TempoON (Verde + giallo + rosso)
DECLARE @TempoOnRT DECIMAL(18,8)
SET @TempoOnRT = (
SELECT ISNULL(SUM(DurataMinuti),0)
FROM DiarioDiBordo ddb INNER JOIN AnagraficaStati AnSt ON ddb.IdxStato= AnSt.IdxStato
WHERE AnSt.ClasseTempo NOT IN ('T_OFF', 'T_OFF_ND') AND InizioStato BETWEEN @dataFrom AND @dataTo
AND IdxMacchina = @idxMacchina
)
-- calcolo i tempi di apertura: TempoAuto (Verde + giallo) - precedente meno "T_FermoRosso"
DECLARE @TempoAutoRT DECIMAL(18,8)
SET @TempoAutoRT = (
SELECT @TempoOnRT - ISNULL(SUM(DurataMinuti),0)
FROM DiarioDiBordo ddb INNER JOIN AnagraficaStati AnSt ON ddb.IdxStato= AnSt.IdxStato
WHERE AnSt.ClasseTempo = 'T_FermoRosso' AND InizioStato BETWEEN @dataFrom AND @dataTo
AND IdxMacchina = @idxMacchina
)
-- calcolo i tempi di apertura: TempoRun (Verde)
DECLARE @TempoRunRT DECIMAL(18,8)
SET @TempoRunRT = (
SELECT ISNULL(SUM(DurataMinuti),0)
FROM DiarioDiBordo ddb INNER JOIN AnagraficaStati AnSt ON ddb.IdxStato= AnSt.IdxStato
WHERE AnSt.ClasseTempo = 'T_AutoRun' AND InizioStato BETWEEN @dataFrom AND @dataTo
AND IdxMacchina = @idxMacchina
)
/****************************************************
* Calcolo i TEMPI CICLO realtime (anche non confermati)
****************************************************/
-- DIVISIONE PER ZERO: controllo pezzi prod > 0...
DECLARE @numPezzi INT
SET @numPezzi = @PezziProd - 1 -- divido per n-1 per avere numIntervalli = numPezzi
IF(@numPezzi < 1) SET @numPezzi = 1
DECLARE @TCMedRT DECIMAL(18,8)
SET @TCMedRT = (
SELECT @TempoOnRT / @numPezzi
)
DECLARE @TCLavRT DECIMAL(18,8)
SET @TCLavRT = (
SELECT @TempoAutoRT / @numPezzi
)
DECLARE @TCEffRT DECIMAL(18,8)
SET @TCEffRT = ISNULL(( SELECT dbo.f_lastTempoTecnico(@idxMacchina, 2) ), -1) -- provo a calcolare ultimi tempi tecnici
IF (@TCEffRT =-1)
BEGIN
SET @TCEffRT = (
SELECT @TempoRunRT / @numPezzi
)
END
SELECT @PezziProd as PezziProd, @TCAss AS TCAssegnato, @TCMedRT AS TCMedioRT, @TCLavRT AS TCLavRT, @TCEffRT AS TCEffRT
RETURN
go
commit;
go
set ANSI_NULLS on;
go
/*************************************
* Function f_TC_60-100
* converte il tempo in min e sec (60)
* in minuti centesimali (100)
*
* modif.: S.E.L.
* il: 2012.03.22
**************************************/
create FUNCTION f_TC_60_100
(
@TC_60 DECIMAL(18,8)
)
RETURNS DECIMAL(18,8)
AS
BEGIN
DECLARE @TC_100 AS DECIMAL (18,8)
SELECT @TC_100 = FLOOR(@TC_60) + (@TC_60 - FLOOR(@TC_60)) * 100 / 60
RETURN @TC_100
END
go
update ODL
set TCAssegnato = dbo.f_TC_60_100(TCAssegnato)
update DatiProduzione
set TCAssegnato = dbo.f_TC_60_100(TCAssegnato)
update TempiCicloTeorici
set TCAssegnato = dbo.f_TC_60_100(TCAssegnato)
update DatiConfermati
set TCAssegnato = dbo.f_TC_60_100(TCAssegnato)
-- registro versione...
INSERT INTO [dbo].[LogUpdateDb] ([Versione],[Data]) VALUES(319, GETDATE())
GO
@@ -0,0 +1,304 @@
/*******************************************************
* GESTIONE NUOVO EVENTO per timeout contapezzo
*******************************************************/
-- tab eventi, nuovo evento 27
set xact_abort on
go
begin transaction
go
INSERT INTO dbo.AnagraficaEventi
VALUES (27, N'Timer - timeout tempo ciclo', N'', N'')
go
commit transaction
go
-- tab transazioneEventi x andare da lavora a fermoGenerico
set xact_abort on
go
begin transaction
go
INSERT INTO dbo.TransizioneStati
VALUES (10, 13, 27, 12)
go
commit transaction
go
create table TurniMacchina(
IdxMacchina nvarchar(50) not null constraint PK_TurniMacchina primary key,
T1 bit,
T2 bit,
T3 bit
);
go
set xact_abort on
go
begin transaction
go
INSERT INTO dbo.TurniMacchina
VALUES (N'1005', 1, 1, 0)
go
commit transaction
go
set xact_abort on;
go
begin transaction;
go
set ANSI_NULLS on;
go
/*************************************
* STORED PROCEDURE stp_DatiProd_getByMacchPeriodo
*
* recupera i dati confermati x una macchina e periodo, ordinati in data DESC
*
* modif.: S.E.L.
* il: 2011.07.04
**************************************/
alter PROCEDURE stp_DatiProd_getByMacchPeriodo
(
@idxMacchina NVARCHAR(50),
@dataFrom DATETIME,
@dataTo DATETIME
)
AS
SELECT *
FROM DatiProduzione
WHERE IdxMacchina = @idxMacchina AND (DataRif >= @dataFrom AND DataRif <= @dataTo)
RETURN
go
commit;
go
set xact_abort on;
go
begin transaction;
go
set ANSI_NULLS on;
go
/*************************************
* STORED PROCEDURE stp_turniMacchineByIdxMacc
* elenco turni x macchina
*
* modif.: S.E.L. - 2012.03.26
**************************************/
create PROCEDURE stp_turniMacchineByIdxMacc
(
@IdxMacchina NVARCHAR(50)
)
AS
SELECT *
FROM TurniMacchina
WHERE IdxMacchina = @IdxMacchina
RETURN
go
commit;
go
set xact_abort on;
go
begin transaction;
go
set ANSI_NULLS on;
go
/*************************************
* Function f_lastTempoTecnico
* calcola il tempo tecnico per un impianto dato idxMacchina e intervallo di tempo x filtraggio
* utilizza migliori 10 tempi nell'intervallo e fa media
*
* modif.: S.E.L.
* il: 2011.03.30
**************************************/
alter FUNCTION f_lastTempoTecnico
(
@idxMacchina NVARCHAR(50),
@finestraOre INT
)
RETURNS DECIMAL(18,8)
AS
BEGIN
DECLARE @TcTecnico AS DECIMAL (18,8)
;WITH LastTempi AS
(
SELECT TOP 5 *
FROM TempiCicloRilevati
WHERE IdxMacchina = @idxMacchina
AND DataOraRif >= DATEADD(HH,-@finestraOre,getdate())
ORDER BY TCMedio
)
SELECT @TcTecnico = ISNULL(AVG(TcMedio), 0) FROM LastTempi
--SELECT @TcTecnico = ISNULL(MIN(TcMedio), 0) FROM LastTempi
--SELECT @TcTecnico = AVG(TcMedio) FROM LastTempi
RETURN @TcTecnico
END
go
commit;
go
set xact_abort on;
go
begin transaction;
go
set ANSI_NULLS on;
go
/*************************************
* STORED PROCEDURE stp_turniMacchineUpdateTurno
* cambia il turno specificato per la macchina (toggle: attivo/disattivo)
*
* modif.: S.E.L. - 2012.03.26
**************************************/
create PROCEDURE stp_turniMacchineUpdateTurno
(
@IdxMacchina NVARCHAR(50),
@numTurno INT
)
AS
-- in base al turno indicato cambio solo uno
UPDATE TurniMacchina
SET T1 = CASE @numTurno WHEN 1 THEN 1-T1 ELSE T1 END,
T2 = CASE @numTurno WHEN 2 THEN 1-T2 ELSE T2 END,
T3 = CASE @numTurno WHEN 3 THEN 1-T3 ELSE T3 END
WHERE IdxMacchina = @IdxMacchina
RETURN
go
commit;
go
set xact_abort on
go
begin transaction
go
INSERT INTO dbo.AnagraficaEventi
VALUES (28, N'Timer - timeout TURNO by tempo ciclo', N'', N'')
go
commit transaction
go
set xact_abort on
go
begin transaction
go
INSERT INTO dbo.TransizioneStati
VALUES (10, 1, 28, 26)
INSERT INTO dbo.TransizioneStati
VALUES (10, 2, 28, 26)
INSERT INTO dbo.TransizioneStati
VALUES (10, 3, 28, 26)
INSERT INTO dbo.TransizioneStati
VALUES (10, 4, 28, 26)
INSERT INTO dbo.TransizioneStati
VALUES (10, 5, 28, 26)
INSERT INTO dbo.TransizioneStati
VALUES (10, 6, 28, 26)
INSERT INTO dbo.TransizioneStati
VALUES (10, 7, 28, 26)
INSERT INTO dbo.TransizioneStati
VALUES (10, 8, 28, 26)
INSERT INTO dbo.TransizioneStati
VALUES (10, 9, 28, 26)
INSERT INTO dbo.TransizioneStati
VALUES (10, 10, 28, 26)
INSERT INTO dbo.TransizioneStati
VALUES (10, 12, 28, 26)
INSERT INTO dbo.TransizioneStati
VALUES (10, 13, 28, 26)
INSERT INTO dbo.TransizioneStati
VALUES (10, 14, 28, 26)
INSERT INTO dbo.TransizioneStati
VALUES (10, 15, 28, 26)
INSERT INTO dbo.TransizioneStati
VALUES (10, 23, 28, 26)
INSERT INTO dbo.TransizioneStati
VALUES (10, 24, 28, 26)
INSERT INTO dbo.TransizioneStati
VALUES (10, 25, 28, 26)
INSERT INTO dbo.TransizioneStati
VALUES (10, 26, 14, 11)
INSERT INTO dbo.TransizioneStati
VALUES (10, 26, 15, 12)
INSERT INTO dbo.TransizioneStati
VALUES (10, 26, 16, 13)
INSERT INTO dbo.TransizioneStati
VALUES (10, 26, 17, 14)
INSERT INTO dbo.TransizioneStati
VALUES (10, 26, 18, 15)
INSERT INTO dbo.TransizioneStati
VALUES (10, 26, 20, 14)
INSERT INTO dbo.TransizioneStati
VALUES (10, 26, 21, 13)
INSERT INTO dbo.TransizioneStati
VALUES (10, 26, 22, 14)
INSERT INTO dbo.TransizioneStati
VALUES (10, 26, 23, 23)
INSERT INTO dbo.TransizioneStati
VALUES (10, 26, 24, 24)
INSERT INTO dbo.TransizioneStati
VALUES (10, 26, 25, 25)
INSERT INTO dbo.TransizioneStati
VALUES (10, 26, 26, 27)
INSERT INTO dbo.TransizioneStati
VALUES (10, 27, 14, 11)
INSERT INTO dbo.TransizioneStati
VALUES (10, 27, 28, 26)
DELETE FROM dbo.TransizioneStati WHERE IdxFamiglia=10 and IdxStato=11 and IdxTipo=14
go
commit transaction
go
-- registro versione...
INSERT INTO [dbo].[LogUpdateDb] ([Versione],[Data]) VALUES(320, GETDATE())
GO
@@ -0,0 +1,123 @@
create table AnagraficaStatiOld(
IdxStato int not null,
Descrizione nvarchar(50),
Semaforo nvarchar(50),
Priorita int,
ClasseTempo nvarchar(50)
)
go
--
create table DatiConf_old(
IdxConferma int not null identity,
IdxODL int not null,
DataOraApp datetime not null,
DataRif datetime not null,
TurnoRif int,
CodArticolo nvarchar(50),
IdxMacchina nvarchar(50) not null,
TCAssegnato decimal(18,8),
MatrOpr int,
MatrApp int not null,
DataOraFrom datetime,
DataOraTo datetime,
IdxStato int not null,
TotPzProd int,
TempoProdotto decimal(18,8),
TempoCron decimal(18,8),
TempoND decimal(18,8),
TempoApertura decimal(18,8),
TempoOFF decimal(18,8),
TempoON decimal(18,8),
TempoFermoOn decimal(18,8),
TempoAuto decimal(18,8),
TempoFermoAuto decimal(18,8),
TempoRun decimal(18,8),
TotPzFermo int
)
go
--
create table DatiConf_older(
IdxConferma int not null identity,
IdxODL int not null,
DataOraApp datetime not null,
DataRif datetime not null,
TurnoRif int,
CodArticolo nvarchar(50),
IdxMacchina nvarchar(50) not null,
TCAssegnato decimal(18,8),
MatrOpr int,
MatrApp int not null,
DataOraFrom datetime,
DataOraTo datetime,
IdxStato int not null,
TotPzProd int,
TempoProdotto decimal(18,8),
TempoCron decimal(18,8),
TempoND decimal(18,8),
TempoApertura decimal(18,8),
TempoOFF decimal(18,8),
TempoON decimal(18,8),
TempoFermoOn decimal(18,8),
TempoAuto decimal(18,8),
TempoFermoAuto decimal(18,8),
TempoRun decimal(18,8),
TotPzFermo int
)
go
--
create table DatiProd_old(
IdxConferma int not null identity,
IdxODL int not null,
DataOraApp datetime not null,
DataRif datetime not null,
TurnoRif int,
CodArticolo nvarchar(50),
IdxMacchina nvarchar(50) not null,
TCAssegnato decimal(18,8),
MatrOpr int,
MatrApp int not null,
DataOraFrom datetime,
DataOraTo datetime,
TotPzProd int,
Tempo decimal(18,8),
ClasseTempo nvarchar(50)
)
go
--
create table DatiProd_older(
IdxConferma int not null identity,
IdxODL int not null,
DataOraApp datetime not null,
DataRif datetime not null,
TurnoRif int,
CodArticolo nvarchar(50),
IdxMacchina nvarchar(50) not null,
TCAssegnato decimal(18,8),
MatrOpr int,
MatrApp int not null,
DataOraFrom datetime,
DataOraTo datetime,
TotPzProd int,
Tempo decimal(18,8),
ClasseTempo nvarchar(50)
)
go
--
-- registro versione...
INSERT INTO [dbo].[LogUpdateDb] ([Versione],[Data]) VALUES(301, GETDATE())
GO
@@ -0,0 +1,17 @@
set xact_abort on
go
begin transaction
go
UPDATE dbo.AnagraficaStati SET
ShowArticolo=1
WHERE IdxStato=1
go
commit transaction
go
-- registro versione...
INSERT INTO [dbo].[LogUpdateDb] ([Versione],[Data]) VALUES(302, GETDATE())
GO
@@ -0,0 +1,356 @@
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
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,605 @@
set xact_abort on;
go
begin transaction;
go
set ANSI_NULLS on;
go
/*************************************
* STORED PROCEDURE stp_MSE_refresh
* AGGIORNA tabella stato attuale macchine x macchina indicata
*
* modif.: S.E.L. - 2013.02.28
**************************************/
create PROCEDURE stp_MSE_refresh
(
@IdxMacchina NVARCHAR(50) -- macchina da aggiornare
)
AS
--init variabili!
DECLARE @adesso DATETIME = GETDATE()
DECLARE @trovate INT = 0
DECLARE @tvStato TABLE (
idxStato INT NULL,
DescrizioneStato NVARCHAR(50),
Semaforo NVARCHAR(50),
Minuti INT NULL
)
DECLARE @tvODL TABLE (
IdxODL INT NULL,
CodArticolo NVARCHAR(50),
DescArticolo NVARCHAR(50),
IdxMacchina INT NULL,
CodMacchina NVARCHAR(50),
Nome NVARCHAR(50),
NumPezzi INT NULL,
TCAssegnato DECIMAL(18,8),
DataInizio DATETIME,
DataFine DATETIME
)
DECLARE @tvProd TABLE (
CodArticolo NVARCHAR(50),
PezziLanciati INT NULL,
PezziProd INT NULL,
PezziConf INT NULL,
TCAssegnato DECIMAL(18,8),
CodOperatore INT NULL,
TempoOn DECIMAL(18,8),
TempoAuto DECIMAL(18,8),
TempoRun DECIMAL(18,8),
TCMedio DECIMAL(18,8),
TCLav DECIMAL(18,8),
TCEff DECIMAL(18,8),
TCMedioRT DECIMAL(18,8),
TCLavRT DECIMAL(18,8),
TCEffRT DECIMAL(18,8)
)
BEGIN
-- controllo: se c'è riga macchina richiesta...
SELECT @trovate=COUNT(*) FROM MappaStatoExpl WHERE IdxMacchina = @IdxMacchina
-- se NON c'è la creo...
IF(@trovate = 0)
BEGIN
-- calcolo ODL
;WITH cteODL AS
(
SELECT * FROM ODL
WHERE IdxODL IN
(
SELECT IdxODL
FROM ODL
WHERE DataFine IS NULL
AND (IdxMacchina = @IdxMacchina)
UNION
SELECT MAX(IdxODL)
FROM ODL
WHERE IdxMacchina = @IdxMacchina
)
)
-- inserisco i nuovi dati
INSERT INTO MappaStatoExpl(lastUpdate, IdxMacchina, CodMacchina, Nome, url, IdxODL, CodArticolo, NumPezzi, TCAssegnato, DataInizioODL)
SELECT @adesso, ma.IdxMacchina, ma.CodMacchina, ma.Nome, url, ISNULL(o.IdxODL,0), ISNULL(o.CodArticolo,'-'), ISNULL(o.NumPezzi,0), ISNULL(o.TCAssegnato,0), ISNULL(o.DataInizio,'2000/01/01')
FROM Macchine ma LEFT OUTER JOIN cteODL o ON ma.IdxMacchina=o.IdxMacchina
WHERE ma.IdxMacchina = @IdxMacchina
AND NOT (locazione IS NULL)
AND ( (ISNULL(o.IdxODL,0) = 0) OR ((o.DataFine IS NULL) AND NOT (o.DataInizio IS NULL)) )
ORDER BY ma.locazione
END
-- popolo tab stati
INSERT @tvStato(idxStato, Minuti)
EXEC stp_repDonati_getLastStatoDurataMacchina @IdxMacchina, 0.1
-- fix dati mancanti
UPDATE tvs
SET tvs.Semaforo = s.Semaforo
,tvs.DescrizioneStato = s.Descrizione
FROM @tvStato tvs INNER JOIN AnagraficaStati s ON tvs.idxStato=s.IdxStato
-- popolo tab ODL
INSERT @tvODL
EXEC stp_ODL_getByMacchina @IdxMacchina
-- popolo tab pezzi/tempi
INSERT @tvProd(CodArticolo,PezziLanciati,PezziProd,PezziConf,TCAssegnato,CodOperatore,TempoOn,TempoAuto,TempoRun,TCMedio,TCLav,TCEff,TCMedioRT,TCLavRT,TCEffRT )
EXEC stp_repDonati_getDatiProdMacchina @IdxMacchina
-- aggiorno in blocco i valori
UPDATE mse
SET mse.lastUpdate = @adesso
,mse.idxStato = ISNULL(tvs.idxStato,0)
,mse.durata = ISNULL(tvs.Minuti,0)
,mse.Semaforo = ISNULL(tvs.Semaforo,'')
,mse.DescrizioneStato = ISNULL(tvs.DescrizioneStato,'')
,mse.TCAssegnato = ISNULL(tvo.TCAssegnato,0)
,mse.NumPezzi = ISNULL(tvo.NumPezzi,0)
,mse.DataInizioODL = ISNULL(tvo.DataInizio,'2000/01/01')
,mse.PezziProd = ISNULL(tvp.PezziProd,0)
,mse.PezziConf = ISNULL(tvp.PezziConf,0)
,mse.TempoOn = ISNULL(tvp.TempoOn,0)
,mse.TempoAuto = ISNULL(tvp.TempoAuto,0)
,mse.TempoRun = ISNULL(tvp.TempoRun,0)
,mse.TCMedio = ISNULL(tvp.TCMedio,0)
,mse.TCLav = ISNULL(tvp.TCLav,0)
,mse.TCEff = ISNULL(tvp.TCEff,0)
,mse.TCMedioRT = ISNULL(tvp.TCMedioRT,0)
,mse.TCLavRT = ISNULL(tvp.TCLavRT,0)
,mse.TCEffRT = ISNULL(tvp.TCEffRT,0)
FROM MappaStatoExpl mse
CROSS JOIN @tvStato tvs
CROSS JOIN @tvODL tvo
CROSS JOIN @tvProd tvp
WHERE mse.Idxmacchina = @IdxMacchina
END
RETURN
go
commit;
go
set xact_abort on;
go
begin transaction;
go
set ANSI_NULLS on;
go
/*************************************
* STORED PROCEDURE InsEvento
* inserimento di un evento nel db (tab EventList)
* inerimento in anagrafica a "nd" dell'operatore se matricola mancasse
*
* modif.: S.E.L.
* il: 2008.08.07
**************************************/
alter PROCEDURE stp_EL_InsEvento
(
@IdxMacchina varchar(50),
@IdxTipo int,
@MatricolaKanban varchar(50),
@Value varchar(50),
@MatrOpr int,
@pallet varchar(20)
)
AS
/*************************************
* verifico se esista operatore
**************************************/
SELECT *
FROM AnagraficaOperatori
WHERE (MatrOpr = @MatrOpr)
IF(@@ROWCOUNT = 0 )
BEGIN
/* inserisco nuovo record */
INSERT INTO AnagraficaOperatori(MatrOpr, Cognome, Nome, isAdmin, authKey)
VALUES (@MatrOpr,'nd (cognome)','nd (nome)', 0, '12345')
END
/* inserisco evento*/
INSERT INTO EventList
(IdxMacchina, InizioStato, IdxTipo, MatricolaKanban, Value, MatrOpr, pallet)
VALUES (@IdxMacchina, GETDATE(), @IdxTipo, @MatricolaKanban, @Value, @MatrOpr, @pallet)
RETURN
go
/*************************************
* STORED PROCEDURE stp_MSE_getData
* tabella stato attuale macchine (da mostrare)
*
* modif.: S.E.L. - 2013.02.28
**************************************/
alter PROCEDURE stp_MSE_getData
(
@maxAgeSec INT -- soglia di "vecchiaia" del dato massima accettabile dopo cui parte ricalcolo, in millisec, se < 1000 ignoro!
)
AS
-- cerco dato + recente
DECLARE @adesso DATETIME = GETDATE()
DECLARE @lastUpdate DATETIME
SELECT TOP 1 @lastUpdate=ISNULL(lastUpdate, '2000/01/01') FROM MappaStatoExpl ORDER BY lastUpdate DESC
SELECT @lastUpdate= ISNULL(@lastUpdate, '2000/01/01')
-- solo se sup ai 1000 ms! oppure zero...
IF(@maxAgeSec > 1000 OR @maxAgeSec=0)
BEGIN
-- dato vecchio! aggiorno!
IF(DATEDIFF(s,@lastUpdate,@adesso)*1000 > @maxAgeSec)
BEGIN
-- truncate table precedente
TRUNCATE TABLE MappaStatoExpl
;WITH cteODL AS
(
SELECT * FROM ODL
WHERE IdxODL IN
(
SELECT IdxODL
FROM ODL
WHERE DataFine IS NULL
UNION
SELECT MAX(IdxODL)
FROM ODL
GROUP BY IdxMacchina
)
)
-- inserisco di nuovo i dati
INSERT INTO MappaStatoExpl(lastUpdate, IdxMacchina, CodMacchina, Nome, url, IdxODL, CodArticolo, NumPezzi, TCAssegnato, DataInizioODL)
SELECT @adesso, ma.IdxMacchina, ma.CodMacchina, ma.Nome, url, ISNULL(o.IdxODL,0), ISNULL(o.CodArticolo,'-'), ISNULL(o.NumPezzi,0), ISNULL(o.TCAssegnato,0), ISNULL(o.DataInizio,'2000/01/01')
FROM Macchine ma LEFT OUTER JOIN cteODL o ON ma.IdxMacchina=o.IdxMacchina
WHERE NOT (locazione IS NULL) AND ( (ISNULL(o.IdxODL,0) = 0) OR ((o.DataFine IS NULL) AND NOT (o.DataInizio IS NULL)) )
ORDER BY ma.locazione
-- dichiaro le 2 table variables che userò x caricare i dati di stato
DECLARE @tvStato TABLE (
IdxMacchina INT NULL,
idxStato INT NULL,
DescrizioneStato NVARCHAR(50),
Semaforo NVARCHAR(50),
Minuti INT NULL
)
DECLARE @tvODL TABLE (
IdxODL INT NULL,
CodArticolo NVARCHAR(50),
DescArticolo NVARCHAR(50),
IdxMacchina INT NULL,
CodMacchina NVARCHAR(50),
Nome NVARCHAR(50),
NumPezzi INT NULL,
TCAssegnato DECIMAL(18,8),
DataInizio DATETIME,
DataFine DATETIME
)
DECLARE @tvProd TABLE (
IdxMacchina INT NULL,
CodArticolo NVARCHAR(50),
PezziLanciati INT NULL,
PezziProd INT NULL,
PezziConf INT NULL,
TCAssegnato DECIMAL(18,8),
CodOperatore INT NULL,
TempoOn DECIMAL(18,8),
TempoAuto DECIMAL(18,8),
TempoRun DECIMAL(18,8),
TCMedio DECIMAL(18,8),
TCLav DECIMAL(18,8),
TCEff DECIMAL(18,8),
TCMedioRT DECIMAL(18,8),
TCLavRT DECIMAL(18,8),
TCEffRT DECIMAL(18,8)
)
DECLARE @numRows INT = 0
DECLARE @currRow INT = 1
DECLARE @IdxMacchina INT = 0
SET @numRows = ISNULL((SELECT COUNT(*) FROM MappaStatoExpl),0)
-- carico altri dati con ciclo while
WHILE (@currRow <= @numRows)
BEGIN
-- macchina corrente!
SELECT @IdxMacchina = IdxMacchina FROM MappaStatoExpl WHERE RowNum = @currRow
-- popolo tab stati
INSERT @tvStato(idxStato, Minuti)
EXEC stp_repDonati_getLastStatoDurataMacchina @IdxMacchina, 0.1
-- fix dati mancanti
UPDATE tvs
SET tvs.IdxMacchina = @IdxMacchina
,tvs.Semaforo = s.Semaforo
,tvs.DescrizioneStato = s.Descrizione
FROM @tvStato tvs INNER JOIN AnagraficaStati s ON tvs.idxStato=s.IdxStato
WHERE tvs.IdxMacchina IS NULL
-- popolo tab ODL
INSERT @tvODL
EXEC stp_ODL_getByMacchina @IdxMacchina
-- popolo tab pezzi/tempi
INSERT @tvProd(CodArticolo,PezziLanciati,PezziProd,PezziConf,TCAssegnato,CodOperatore,TempoOn,TempoAuto,TempoRun,TCMedio,TCLav,TCEff,TCMedioRT,TCLavRT,TCEffRT )
EXEC stp_repDonati_getDatiProdMacchina @IdxMacchina
-- fix dati mancanti
UPDATE tvp
SET tvp.IdxMacchina = @IdxMacchina
FROM @tvProd tvp
WHERE tvp.IdxMacchina IS NULL
-- aggiorno contatore
SET @currRow = @currRow + 1
END
-- aggiorno in blocco i valori x stato e pezzi prodotti
UPDATE mse
SET mse.idxStato = ISNULL(tvs.idxStato,0)
,mse.durata = ISNULL(tvs.Minuti,0)
,mse.Semaforo = ISNULL(tvs.Semaforo,'')
,mse.DescrizioneStato = ISNULL(tvs.DescrizioneStato,'')
FROM MappaStatoExpl mse INNER JOIN @tvStato tvs ON mse.IdxMacchina=tvs.IdxMacchina
-- aggiorno in blocco i valori x ODL
UPDATE mse
SET mse.TCAssegnato = ISNULL(tvo.TCAssegnato,0)
,mse.NumPezzi = ISNULL(tvo.NumPezzi,0)
,mse.DataInizioODL = ISNULL(tvo.DataInizio,'2000/01/01')
FROM MappaStatoExpl mse INNER JOIN @tvODL tvo ON mse.IdxMacchina=tvo.IdxMacchina
-- aggiorno in blocco i valori x produzione
UPDATE mse
SET mse.PezziProd = ISNULL(tvp.PezziProd,0)
,mse.PezziConf = ISNULL(tvp.PezziConf,0)
,mse.TempoOn = ISNULL(tvp.TempoOn,0)
,mse.TempoAuto = ISNULL(tvp.TempoAuto,0)
,mse.TempoRun = ISNULL(tvp.TempoRun,0)
,mse.TCMedio = ISNULL(tvp.TCMedio,0)
,mse.TCLav = ISNULL(tvp.TCLav,0)
,mse.TCEff = ISNULL(tvp.TCEff,0)
,mse.TCMedioRT = ISNULL(tvp.TCMedioRT,0)
,mse.TCLavRT = ISNULL(tvp.TCLavRT,0)
,mse.TCEffRT = ISNULL(tvp.TCEffRT,0)
FROM MappaStatoExpl mse INNER JOIN @tvProd tvp ON mse.IdxMacchina=tvp.IdxMacchina
END
END
-- restituisco la tabella finale
SELECT *
FROM MappaStatoExpl
RETURN
go
commit;
go
set xact_abort on;
go
begin transaction;
go
set ANSI_NULLS on;
go
/***************************************************
* Trigger trg_ODL_updateMSE
*
* fa un refresh completo della MSE ad ogni intervento sull'ODL
*
* modificato: S.E.L.
* 2013.03.14
*
***************************************************/
create TRIGGER trg_ODL_updateMSE
ON ODL
FOR INSERT, UPDATE
AS
-- eseguo RICALCOLO tabella stato expl
EXEC stp_MSE_getData 0
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
/* 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 ) )
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 ) )
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 ) )
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
-- registro versione...
INSERT INTO [dbo].[LogUpdateDb] ([Versione],[Data]) VALUES(375, GETDATE())
GO
SELECT TOP 10 * FROM LogUpdateDb ORDER BY Versione DESC
GO
@@ -0,0 +1,616 @@
set xact_abort on;
go
begin transaction;
go
set ANSI_NULLS on;
go
/*************************************
* STORED PROCEDURE stp_ODL_updateChild
* aggiorna le tabelle che dipendono dai dati dell'ODL
*
* modif.: S.E.L.
* il: 2013.03.15
**************************************/
create PROCEDURE stp_ODL_updateChild
(
@IdxMacchina NVARCHAR(50),
@IdxODL INT,
@CodArticoloOld NVARCHAR(50),
@DataInizioOld DATETIME,
@DataFineOld DATETIME,
@CodArticoloNew NVARCHAR(50),
@DataInizioNew DATETIME,
@DataFineNew DATETIME
)
AS
BEGIN TRAN
/*****************************************************************************************************
* AGGIORNO TUTTO!
* - DatiConfermati
* - DatiMacchine
* - DatiProduzione
* - DiarioDiBordo
* - EventList
* - StatoMacchine
* - TempiCicloRilevati
*****************************************************************************************************/
-- DatiConfermati
UPDATE DatiConfermati
SET CodArticolo = @CodArticoloNew
WHERE CodArticolo = @CodArticoloOld
AND ( DataRif >= @DataInizioNew AND DataRif <= ISNULL(@DataFineNew, GETDATE()) )
-- DatiMacchine
UPDATE DatiMacchine
SET kanban_A = CASE WHEN kanban_A = 'KA'+ @CodArticoloOLD THEN 'KA'+ @CodArticoloNew ELSE kanban_A END
,kanban_B = CASE WHEN kanban_B = 'KA'+ @CodArticoloOLD THEN 'KA'+ @CodArticoloNew ELSE kanban_B END
WHERE IdxMacchina = @IdxMacchina
-- DatiProduzione
UPDATE DatiProduzione
SET CodArticolo = @CodArticoloNew
,IdxODL = @IdxODL
WHERE IdxMacchina = @IdxMacchina
AND ( DataRif >= @DataInizioNew AND DataRif <= ISNULL(@DataFineNew, GETDATE()) )
-- DiarioDiBordo
UPDATE DiarioDiBordo
SET KanbanCode = @CodArticoloNew
,MatricolaKanban = 'KA'+@CodArticoloNew
WHERE IdxMacchina = @IdxMacchina
AND ( InizioStato >= @DataInizioNew AND InizioStato <= ISNULL(@DataFineNew, GETDATE()) )
AND KanbanCode = @CodArticoloOld
-- EventList
UPDATE EventList
SET MatricolaKanban = 'KA'+@CodArticoloNew
WHERE IdxMacchina = @IdxMacchina
AND ( InizioStato >= @DataInizioNew AND InizioStato <= ISNULL(@DataFineNew, GETDATE()) )
AND MatricolaKanban = 'KA'+@CodArticoloOld
-- StatoMacchine
UPDATE StatoMacchine
SET KanbanCode = @CodArticoloNew
,MatricolaKanban = 'KA'+@CodArticoloNew
WHERE IdxMacchina = @IdxMacchina
AND ( InizioStato >= @DataInizioNew AND InizioStato <= ISNULL(@DataFineNew, GETDATE()) )
AND KanbanCode = @CodArticoloOld
-- TempiCicloRilevati
UPDATE TempiCicloRilevati
SET CodArticolo = @CodArticoloNew
WHERE IdxMacchina = @IdxMacchina
AND ( DataOraRif >= @DataInizioNew AND DataOraRif <= ISNULL(@DataFineNew, GETDATE()) )
AND CodArticolo = @CodArticoloOld
COMMIT TRAN
RETURN
go
commit;
go
set xact_abort on;
go
begin transaction;
go
set ANSI_NULLS on;
go
/***************************************************
* Trigger trg_ODL_updateMSE
*
* fa un refresh completo della MSE ad ogni intervento sull'ODL
*
* modificato: S.E.L.
* 2013.03.14
*
***************************************************/
create TRIGGER trg_ODL_updateAllChild
ON ODL
FOR UPDATE
AS
-- dichiarazione variabili
DECLARE @IdxMacchina NVARCHAR(50)
DECLARE @IdxODL INT
DECLARE @CodArtOld NVARCHAR(50)
DECLARE @CodArtNew NVARCHAR(50)
DECLARE @DataInizioOld DATETIME
DECLARE @DataInizioNew DATETIME
DECLARE @DataFineOld DATETIME
DECLARE @DataFineNew DATETIME
-- calcolo valori articolo, date validità...
SELECT @CodArtOld=CodArticolo, @DataInizioOld=DataInizio, @DataFineOld=DataFine FROM deleted
SELECT @IdxODL=IdxODL, @IdxMacchina=IdxMacchina, @CodArtNew=CodArticolo, @DataInizioNew=DataInizio, @DataFineNew=DataFine FROM inserted
-- PRIMA REGOLA: proseguo SOLO SE la data inizio è NOT NULL
IF(NOT (@DataInizioNew IS NULL))
BEGIN
/***************************************************************
* Eseguo SOLO SE:
* - faccio un update del kanban e se il mio ODL ha un periodo di validità (inizio non nullo)
* - cambia inizio periodo validità
* - cambia fine validità (MA NON ERA NULL!!!)
***************************************************************/
IF( ( UPDATE(CodArticolo) AND @CodArtOld<>@CodArtNew ) OR ( UPDATE(DataInizio) AND @DataInizioOld<>@DataInizioNew ) OR ( UPDATE(DataFine) AND @DataFineOld<>@DataFineNew AND NOT (@DataFineOld IS NULL) ) )
BEGIN
exec stp_ODL_updateChild @IdxMacchina, @IdxODL, @CodArtOld, @DataInizioOld, @DataFineOld, @CodArtNew, @DataInizioNew, @DataFineNew
END
END
-- eseguo RICALCOLO tabella stato expl
EXEC stp_MSE_getData 0
go
/***************************************************
* Trigger trg_ODL_updateMSE
*
* fa un refresh completo della MSE ad ogni insert di ODL
*
* modificato: S.E.L.
* 2013.03.14
*
***************************************************/
alter TRIGGER trg_ODL_updateMSE
ON ODL
FOR INSERT
AS
-- eseguo RICALCOLO tabella stato expl
EXEC stp_MSE_getData 0
go
commit;
go
set xact_abort on;
go
begin transaction;
go
set ANSI_NULLS on;
go
/*************************************
* STORED PROCEDURE stp_ODL_updateChild
* aggiorna le tabelle che dipendono dai dati dell'ODL
*
* modif.: S.E.L.
* il: 2013.03.15
**************************************/
alter PROCEDURE stp_ODL_updateChild
(
@IdxMacchina NVARCHAR(50),
@IdxODL INT,
@CodArticoloOld NVARCHAR(50),
@DataInizioOld DATETIME,
@DataFineOld DATETIME,
@CodArticoloNew NVARCHAR(50),
@DataInizioNew DATETIME,
@DataFineNew DATETIME
)
AS
BEGIN TRAN
/*****************************************************************************************************
* AGGIORNO TUTTO!
* - DatiConfermati
* - DatiMacchine
* - DatiProduzione
* - DiarioDiBordo
* - EventList
* - StatoMacchine
* - TempiCicloRilevati
*****************************************************************************************************/
-- DatiConfermati
UPDATE DatiConfermati
SET CodArticolo = @CodArticoloNew
WHERE CodArticolo = @CodArticoloOld
AND ( DataRif >= @DataInizioNew AND DataRif <= ISNULL(@DataFineNew, GETDATE()) )
-- DatiMacchine, SOLO SE è ODL corrente
IF(@DataFineNew IS NULL)
BEGIN
UPDATE DatiMacchine
SET kanban_A = CASE WHEN kanban_A = 'KA'+ @CodArticoloOLD THEN 'KA'+ @CodArticoloNew ELSE kanban_A END
,kanban_B = CASE WHEN kanban_B = 'KA'+ @CodArticoloOLD THEN 'KA'+ @CodArticoloNew ELSE kanban_B END
WHERE IdxMacchina = @IdxMacchina
END
-- DatiProduzione
UPDATE DatiProduzione
SET CodArticolo = @CodArticoloNew
,IdxODL = @IdxODL
WHERE IdxMacchina = @IdxMacchina
AND ( DataRif >= @DataInizioNew AND DataRif <= ISNULL(@DataFineNew, GETDATE()) )
-- DiarioDiBordo
UPDATE DiarioDiBordo
SET KanbanCode = @CodArticoloNew
,MatricolaKanban = 'KA'+@CodArticoloNew
WHERE IdxMacchina = @IdxMacchina
AND ( InizioStato >= @DataInizioNew AND InizioStato <= ISNULL(@DataFineNew, GETDATE()) )
AND KanbanCode = @CodArticoloOld
-- EventList
UPDATE EventList
SET MatricolaKanban = 'KA'+@CodArticoloNew
WHERE IdxMacchina = @IdxMacchina
AND ( InizioStato >= @DataInizioNew AND InizioStato <= ISNULL(@DataFineNew, GETDATE()) )
AND MatricolaKanban = 'KA'+@CodArticoloOld
-- StatoMacchine
UPDATE StatoMacchine
SET KanbanCode = @CodArticoloNew
,MatricolaKanban = 'KA'+@CodArticoloNew
WHERE IdxMacchina = @IdxMacchina
AND ( InizioStato >= @DataInizioNew AND InizioStato <= ISNULL(@DataFineNew, GETDATE()) )
AND KanbanCode = @CodArticoloOld
-- TempiCicloRilevati
UPDATE TempiCicloRilevati
SET CodArticolo = @CodArticoloNew
WHERE IdxMacchina = @IdxMacchina
AND ( DataOraRif >= @DataInizioNew AND DataOraRif <= ISNULL(@DataFineNew, GETDATE()) )
AND CodArticolo = @CodArticoloOld
COMMIT TRAN
RETURN
go
commit;
go
drop trigger trg_ODL_updateMSE;
go
set xact_abort on;
go
begin transaction;
go
set ANSI_NULLS on;
go
/*************************************
* STORED PROCEDURE stp_MSE_getData
* tabella stato attuale macchine (da mostrare)
*
* modif.: S.E.L. - 2013.02.28
**************************************/
alter PROCEDURE stp_MSE_getData
(
@maxAgeSec INT -- soglia di "vecchiaia" del dato massima accettabile dopo cui parte ricalcolo, in millisec, se < 1000 ignoro!
)
AS
-- cerco dato + recente
DECLARE @adesso DATETIME = GETDATE()
DECLARE @lastUpdate DATETIME
SELECT TOP 1 @lastUpdate=ISNULL(lastUpdate, '2000/01/01') FROM MappaStatoExpl ORDER BY lastUpdate DESC
SELECT @lastUpdate= ISNULL(@lastUpdate, '2000/01/01')
-- solo se sup ai 1000 ms! oppure zero...
IF(@maxAgeSec > 1000 OR @maxAgeSec=0)
BEGIN
-- dato vecchio! aggiorno!
IF(DATEDIFF(s,@lastUpdate,@adesso)*1000 > @maxAgeSec)
BEGIN
-- truncate table precedente
TRUNCATE TABLE MappaStatoExpl
;WITH cteODL AS
(
SELECT TOP 1 * FROM ODL
WHERE IdxODL IN
(
SELECT IdxODL
FROM ODL
WHERE DataFine IS NULL
UNION
SELECT MAX(IdxODL)
FROM ODL
GROUP BY IdxMacchina
)
)
-- inserisco di nuovo i dati
INSERT INTO MappaStatoExpl(lastUpdate, IdxMacchina, CodMacchina, Nome, url, IdxODL, CodArticolo, NumPezzi, TCAssegnato, DataInizioODL)
SELECT @adesso, ma.IdxMacchina, ma.CodMacchina, ma.Nome, url, ISNULL(o.IdxODL,0), ISNULL(o.CodArticolo,'-'), ISNULL(o.NumPezzi,0), ISNULL(o.TCAssegnato,0), ISNULL(o.DataInizio,'2000/01/01')
FROM Macchine ma LEFT OUTER JOIN cteODL o ON ma.IdxMacchina=o.IdxMacchina
WHERE NOT (locazione IS NULL)
--AND ( (ISNULL(o.IdxODL,0) = 0) OR ((o.DataFine IS NULL) AND NOT (o.DataInizio IS NULL)) )
ORDER BY ma.locazione
-- dichiaro le 2 table variables che userò x caricare i dati di stato
DECLARE @tvStato TABLE (
IdxMacchina INT NULL,
idxStato INT NULL,
DescrizioneStato NVARCHAR(50),
Semaforo NVARCHAR(50),
Minuti INT NULL
)
DECLARE @tvODL TABLE (
IdxODL INT NULL,
CodArticolo NVARCHAR(50),
DescArticolo NVARCHAR(50),
IdxMacchina INT NULL,
CodMacchina NVARCHAR(50),
Nome NVARCHAR(50),
NumPezzi INT NULL,
TCAssegnato DECIMAL(18,8),
DataInizio DATETIME,
DataFine DATETIME
)
DECLARE @tvProd TABLE (
IdxMacchina INT NULL,
CodArticolo NVARCHAR(50),
PezziLanciati INT NULL,
PezziProd INT NULL,
PezziConf INT NULL,
TCAssegnato DECIMAL(18,8),
CodOperatore INT NULL,
TempoOn DECIMAL(18,8),
TempoAuto DECIMAL(18,8),
TempoRun DECIMAL(18,8),
TCMedio DECIMAL(18,8),
TCLav DECIMAL(18,8),
TCEff DECIMAL(18,8),
TCMedioRT DECIMAL(18,8),
TCLavRT DECIMAL(18,8),
TCEffRT DECIMAL(18,8)
)
DECLARE @numRows INT = 0
DECLARE @currRow INT = 1
DECLARE @IdxMacchina INT = 0
SET @numRows = ISNULL((SELECT COUNT(*) FROM MappaStatoExpl),0)
-- carico altri dati con ciclo while
WHILE (@currRow <= @numRows)
BEGIN
-- macchina corrente!
SELECT @IdxMacchina = IdxMacchina FROM MappaStatoExpl WHERE RowNum = @currRow
-- popolo tab stati
INSERT @tvStato(idxStato, Minuti)
EXEC stp_repDonati_getLastStatoDurataMacchina @IdxMacchina, 0.1
-- fix dati mancanti
UPDATE tvs
SET tvs.IdxMacchina = @IdxMacchina
,tvs.Semaforo = s.Semaforo
,tvs.DescrizioneStato = s.Descrizione
FROM @tvStato tvs INNER JOIN AnagraficaStati s ON tvs.idxStato=s.IdxStato
WHERE tvs.IdxMacchina IS NULL
-- popolo tab ODL
INSERT @tvODL
EXEC stp_ODL_getByMacchina @IdxMacchina
-- popolo tab pezzi/tempi
INSERT @tvProd(CodArticolo,PezziLanciati,PezziProd,PezziConf,TCAssegnato,CodOperatore,TempoOn,TempoAuto,TempoRun,TCMedio,TCLav,TCEff,TCMedioRT,TCLavRT,TCEffRT )
EXEC stp_repDonati_getDatiProdMacchina @IdxMacchina
-- fix dati mancanti
UPDATE tvp
SET tvp.IdxMacchina = @IdxMacchina
FROM @tvProd tvp
WHERE tvp.IdxMacchina IS NULL
-- aggiorno contatore
SET @currRow = @currRow + 1
END
-- aggiorno in blocco i valori x stato e pezzi prodotti
UPDATE mse
SET mse.idxStato = ISNULL(tvs.idxStato,0)
,mse.durata = ISNULL(tvs.Minuti,0)
,mse.Semaforo = ISNULL(tvs.Semaforo,'')
,mse.DescrizioneStato = ISNULL(tvs.DescrizioneStato,'')
FROM MappaStatoExpl mse INNER JOIN @tvStato tvs ON mse.IdxMacchina=tvs.IdxMacchina
-- aggiorno in blocco i valori x ODL
UPDATE mse
SET mse.TCAssegnato = ISNULL(tvo.TCAssegnato,0)
,mse.NumPezzi = ISNULL(tvo.NumPezzi,0)
,mse.DataInizioODL = ISNULL(tvo.DataInizio,'2000/01/01')
FROM MappaStatoExpl mse INNER JOIN @tvODL tvo ON mse.IdxMacchina=tvo.IdxMacchina
-- aggiorno in blocco i valori x produzione
UPDATE mse
SET mse.PezziProd = ISNULL(tvp.PezziProd,0)
,mse.PezziConf = ISNULL(tvp.PezziConf,0)
,mse.TempoOn = ISNULL(tvp.TempoOn,0)
,mse.TempoAuto = ISNULL(tvp.TempoAuto,0)
,mse.TempoRun = ISNULL(tvp.TempoRun,0)
,mse.TCMedio = ISNULL(tvp.TCMedio,0)
,mse.TCLav = ISNULL(tvp.TCLav,0)
,mse.TCEff = ISNULL(tvp.TCEff,0)
,mse.TCMedioRT = ISNULL(tvp.TCMedioRT,0)
,mse.TCLavRT = ISNULL(tvp.TCLavRT,0)
,mse.TCEffRT = ISNULL(tvp.TCEffRT,0)
FROM MappaStatoExpl mse INNER JOIN @tvProd tvp ON mse.IdxMacchina=tvp.IdxMacchina
END
END
-- restituisco la tabella finale
SELECT *
FROM MappaStatoExpl
RETURN
go
/*************************************
* STORED PROCEDURE stp_MSE_refresh
* AGGIORNA tabella stato attuale macchine x macchina indicata
*
* modif.: S.E.L. - 2013.02.28
**************************************/
alter PROCEDURE stp_MSE_refresh
(
@IdxMacchina NVARCHAR(50) -- macchina da aggiornare
)
AS
--init variabili!
DECLARE @adesso DATETIME = GETDATE()
DECLARE @trovate INT = 0
DECLARE @tvStato TABLE (
idxStato INT NULL,
DescrizioneStato NVARCHAR(50),
Semaforo NVARCHAR(50),
Minuti INT NULL
)
DECLARE @tvODL TABLE (
IdxODL INT NULL,
CodArticolo NVARCHAR(50),
DescArticolo NVARCHAR(50),
IdxMacchina INT NULL,
CodMacchina NVARCHAR(50),
Nome NVARCHAR(50),
NumPezzi INT NULL,
TCAssegnato DECIMAL(18,8),
DataInizio DATETIME,
DataFine DATETIME
)
DECLARE @tvProd TABLE (
CodArticolo NVARCHAR(50),
PezziLanciati INT NULL,
PezziProd INT NULL,
PezziConf INT NULL,
TCAssegnato DECIMAL(18,8),
CodOperatore INT NULL,
TempoOn DECIMAL(18,8),
TempoAuto DECIMAL(18,8),
TempoRun DECIMAL(18,8),
TCMedio DECIMAL(18,8),
TCLav DECIMAL(18,8),
TCEff DECIMAL(18,8),
TCMedioRT DECIMAL(18,8),
TCLavRT DECIMAL(18,8),
TCEffRT DECIMAL(18,8)
)
BEGIN
-- controllo: se c'è riga macchina richiesta...
SELECT @trovate=COUNT(*) FROM MappaStatoExpl WHERE IdxMacchina = @IdxMacchina
-- se NON c'è la creo...
IF(@trovate = 0)
BEGIN
-- calcolo ODL
;WITH cteODL AS
(
SELECT top 1 * FROM ODL
WHERE IdxODL IN
(
SELECT IdxODL
FROM ODL
WHERE DataFine IS NULL
AND (IdxMacchina = @IdxMacchina)
UNION
SELECT MAX(IdxODL)
FROM ODL
WHERE IdxMacchina = @IdxMacchina
)
)
-- inserisco i nuovi dati
INSERT INTO MappaStatoExpl(lastUpdate, IdxMacchina, CodMacchina, Nome, url, IdxODL, CodArticolo, NumPezzi, TCAssegnato, DataInizioODL)
SELECT @adesso, ma.IdxMacchina, ma.CodMacchina, ma.Nome, url, ISNULL(o.IdxODL,0), ISNULL(o.CodArticolo,'-'), ISNULL(o.NumPezzi,0), ISNULL(o.TCAssegnato,0), ISNULL(o.DataInizio,'2000/01/01')
FROM Macchine ma LEFT OUTER JOIN cteODL o ON ma.IdxMacchina=o.IdxMacchina
WHERE ma.IdxMacchina = @IdxMacchina
AND NOT (locazione IS NULL)
--AND ( (ISNULL(o.IdxODL,0) = 0) OR ((o.DataFine IS NULL) AND NOT (o.DataInizio IS NULL)) )
ORDER BY ma.locazione
END
-- popolo tab stati
INSERT @tvStato(idxStato, Minuti)
EXEC stp_repDonati_getLastStatoDurataMacchina @IdxMacchina, 0.1
-- fix dati mancanti
UPDATE tvs
SET tvs.Semaforo = s.Semaforo
,tvs.DescrizioneStato = s.Descrizione
FROM @tvStato tvs INNER JOIN AnagraficaStati s ON tvs.idxStato=s.IdxStato
-- popolo tab ODL
INSERT @tvODL
EXEC stp_ODL_getByMacchina @IdxMacchina
-- popolo tab pezzi/tempi
INSERT @tvProd(CodArticolo,PezziLanciati,PezziProd,PezziConf,TCAssegnato,CodOperatore,TempoOn,TempoAuto,TempoRun,TCMedio,TCLav,TCEff,TCMedioRT,TCLavRT,TCEffRT )
EXEC stp_repDonati_getDatiProdMacchina @IdxMacchina
-- aggiorno in blocco i valori
UPDATE mse
SET mse.lastUpdate = @adesso
,mse.idxStato = ISNULL(tvs.idxStato,0)
,mse.durata = ISNULL(tvs.Minuti,0)
,mse.Semaforo = ISNULL(tvs.Semaforo,'')
,mse.DescrizioneStato = ISNULL(tvs.DescrizioneStato,'')
,mse.TCAssegnato = ISNULL(tvo.TCAssegnato,0)
,mse.NumPezzi = ISNULL(tvo.NumPezzi,0)
,mse.DataInizioODL = ISNULL(tvo.DataInizio,'2000/01/01')
,mse.PezziProd = ISNULL(tvp.PezziProd,0)
,mse.PezziConf = ISNULL(tvp.PezziConf,0)
,mse.TempoOn = ISNULL(tvp.TempoOn,0)
,mse.TempoAuto = ISNULL(tvp.TempoAuto,0)
,mse.TempoRun = ISNULL(tvp.TempoRun,0)
,mse.TCMedio = ISNULL(tvp.TCMedio,0)
,mse.TCLav = ISNULL(tvp.TCLav,0)
,mse.TCEff = ISNULL(tvp.TCEff,0)
,mse.TCMedioRT = ISNULL(tvp.TCMedioRT,0)
,mse.TCLavRT = ISNULL(tvp.TCLavRT,0)
,mse.TCEffRT = ISNULL(tvp.TCEffRT,0)
FROM MappaStatoExpl mse
CROSS JOIN @tvStato tvs
CROSS JOIN @tvODL tvo
CROSS JOIN @tvProd tvp
WHERE mse.Idxmacchina = @IdxMacchina
END
RETURN
go
commit;
go
-- registro versione...
INSERT INTO [dbo].[LogUpdateDb] ([Versione],[Data]) VALUES(380, GETDATE())
GO
SELECT TOP 10 * FROM LogUpdateDb ORDER BY Versione DESC
GO
@@ -0,0 +1,194 @@
set xact_abort on;
go
begin transaction;
go
set ANSI_NULLS on;
go
/*************************************
* STORED PROCEDURE stp_MSE_getByIdxMacchina
* ottiene riga stato x macchina indicata
*
* modif.: S.E.L. - 2013.03.15
**************************************/
create PROCEDURE stp_MSE_getByIdxMacchina
(
@IdxMacchina nvarchar(50)
)
AS
SET NOCOUNT ON;
SELECT RowNum, lastUpdate, IdxMacchina, CodMacchina, Nome, url, idxODL, CodArticolo, NumPezzi, TCAssegnato, DataInizioODL, Semaforo, idxStato, DescrizioneStato, durata, PezziProd, PezziConf, TempoOn, TempoAuto, TempoRun, TCMedio, TCLav, TCEff, TCMedioRT, TCLavRT, TCEffRT
FROM dbo.MappaStatoExpl
WHERE IdxMacchina=@IdxMacchina
go
commit;
go
set xact_abort on;
go
begin transaction;
go
set ANSI_NULLS on;
go
/*************************************
* STORED PROCEDURE stp_MSE_refresh
* AGGIORNA tabella stato attuale macchine x macchina indicata
*
* modif.: S.E.L. - 2013.02.28
**************************************/
alter PROCEDURE stp_MSE_refresh
(
@IdxMacchina NVARCHAR(50) -- macchina da aggiornare
)
AS
--init variabili!
DECLARE @adesso DATETIME = GETDATE()
DECLARE @trovate INT = 0
DECLARE @tvStato TABLE (
idxStato INT NULL,
DescrizioneStato NVARCHAR(50),
Semaforo NVARCHAR(50),
Minuti INT NULL
)
DECLARE @tvODL TABLE (
IdxODL INT NULL,
CodArticolo NVARCHAR(50),
DescArticolo NVARCHAR(50),
IdxMacchina INT NULL,
CodMacchina NVARCHAR(50),
Nome NVARCHAR(50),
NumPezzi INT NULL,
TCAssegnato DECIMAL(18,8),
DataInizio DATETIME,
DataFine DATETIME
)
DECLARE @tvProd TABLE (
CodArticolo NVARCHAR(50),
PezziLanciati INT NULL,
PezziProd INT NULL,
PezziConf INT NULL,
TCAssegnato DECIMAL(18,8),
CodOperatore INT NULL,
TempoOn DECIMAL(18,8),
TempoAuto DECIMAL(18,8),
TempoRun DECIMAL(18,8),
TCMedio DECIMAL(18,8),
TCLav DECIMAL(18,8),
TCEff DECIMAL(18,8),
TCMedioRT DECIMAL(18,8),
TCLavRT DECIMAL(18,8),
TCEffRT DECIMAL(18,8)
)
BEGIN
-- controllo: se c'è riga macchina richiesta...
SELECT @trovate=COUNT(*) FROM MappaStatoExpl WHERE IdxMacchina = @IdxMacchina
-- se NON c'è la creo...
IF(@trovate = 0)
BEGIN
-- calcolo ODL
;WITH cteODL AS
(
SELECT top 1 * FROM ODL
WHERE IdxODL IN
(
SELECT IdxODL
FROM ODL
WHERE DataFine IS NULL
AND (IdxMacchina = @IdxMacchina)
UNION
SELECT MAX(IdxODL)
FROM ODL
WHERE IdxMacchina = @IdxMacchina
)
)
-- inserisco i nuovi dati
INSERT INTO MappaStatoExpl(lastUpdate, IdxMacchina, CodMacchina, Nome, url, IdxODL, CodArticolo, NumPezzi, TCAssegnato, DataInizioODL)
SELECT @adesso, ma.IdxMacchina, ma.CodMacchina, ma.Nome, url, ISNULL(o.IdxODL,0), ISNULL(o.CodArticolo,'-'), ISNULL(o.NumPezzi,0), ISNULL(o.TCAssegnato,0), ISNULL(o.DataInizio,'2000/01/01')
FROM Macchine ma LEFT OUTER JOIN cteODL o ON ma.IdxMacchina=o.IdxMacchina
WHERE ma.IdxMacchina = @IdxMacchina
AND NOT (locazione IS NULL)
--AND ( (ISNULL(o.IdxODL,0) = 0) OR ((o.DataFine IS NULL) AND NOT (o.DataInizio IS NULL)) )
ORDER BY ma.locazione
END
-- popolo tab stati
INSERT @tvStato(idxStato, Minuti)
EXEC stp_repDonati_getLastStatoDurataMacchina @IdxMacchina, 0.1
-- fix dati mancanti
UPDATE tvs
SET tvs.Semaforo = s.Semaforo
,tvs.DescrizioneStato = s.Descrizione
FROM @tvStato tvs INNER JOIN AnagraficaStati s ON tvs.idxStato=s.IdxStato
-- popolo tab ODL
INSERT @tvODL
EXEC stp_ODL_getByMacchina @IdxMacchina
-- popolo tab pezzi/tempi
INSERT @tvProd(CodArticolo,PezziLanciati,PezziProd,PezziConf,TCAssegnato,CodOperatore,TempoOn,TempoAuto,TempoRun,TCMedio,TCLav,TCEff,TCMedioRT,TCLavRT,TCEffRT )
EXEC stp_repDonati_getDatiProdMacchina @IdxMacchina
-- aggiorno in blocco i valori
UPDATE mse
SET mse.lastUpdate = @adesso
,mse.idxStato = ISNULL(tvs.idxStato,0)
,mse.durata = ISNULL(tvs.Minuti,0)
,mse.Semaforo = ISNULL(tvs.Semaforo,'')
,mse.DescrizioneStato = ISNULL(tvs.DescrizioneStato,'')
,mse.IdxODL = ISNULL(tvo.IdxODL,0)
,mse.CodArticolo = ISNULL(tvo.CodArticolo,0)
,mse.TCAssegnato = ISNULL(tvo.TCAssegnato,0)
,mse.NumPezzi = ISNULL(tvo.NumPezzi,0)
,mse.DataInizioODL = ISNULL(tvo.DataInizio,'2000/01/01')
,mse.PezziProd = ISNULL(tvp.PezziProd,0)
,mse.PezziConf = ISNULL(tvp.PezziConf,0)
,mse.TempoOn = ISNULL(tvp.TempoOn,0)
,mse.TempoAuto = ISNULL(tvp.TempoAuto,0)
,mse.TempoRun = ISNULL(tvp.TempoRun,0)
,mse.TCMedio = ISNULL(tvp.TCMedio,0)
,mse.TCLav = ISNULL(tvp.TCLav,0)
,mse.TCEff = ISNULL(tvp.TCEff,0)
,mse.TCMedioRT = ISNULL(tvp.TCMedioRT,0)
,mse.TCLavRT = ISNULL(tvp.TCLavRT,0)
,mse.TCEffRT = ISNULL(tvp.TCEffRT,0)
FROM MappaStatoExpl mse
CROSS JOIN @tvStato tvs
CROSS JOIN @tvODL tvo
CROSS JOIN @tvProd tvp
WHERE mse.Idxmacchina = @IdxMacchina
END
RETURN
go
commit;
go
-- registro versione...
INSERT INTO [dbo].[LogUpdateDb] ([Versione],[Data]) VALUES(385, GETDATE())
GO
SELECT TOP 10 * FROM LogUpdateDb ORDER BY Versione DESC
GO
@@ -0,0 +1,78 @@
create table RemoteRebootLog(
idxReboot int not null identity constraint PK_RemoteRebootLog primary key,
IdxMacchina nvarchar(50) not null,
IPv4 nvarchar(50),
Agent nvarchar(250),
DataOraBoot datetime
);
go
set xact_abort on;
go
begin transaction;
go
set ANSI_NULLS on;
go
/*************************************
* STORED PROCEDURE stp_TC_getByMacchinaPeriodo
* recupera tempi ciclo x macchina e periodo
*
* modif.: S.E.L. - 2010.12.15
**************************************/
alter PROCEDURE stp_TC_getByMacchinaPeriodo
(
@IdxMacchina NVARCHAR(50),
@Inizio DATETIME,
@Fine DATETIME
)
AS
SELECT * FROM TempiCicloRilevati
WHERE IdxMacchina = @IdxMacchina AND
(DataOraRif >= @Inizio) AND (DataOraRif <= @Fine)
ORDER BY DataOraRif
RETURN
go
/*************************************
* STORED PROCEDURE stp_TRI_getByIdxMacchina
* recupera dati transizione ingressi da idx Macchina
*
* modif.: S.E.L.
* il: 2011.03.23
**************************************/
alter PROCEDURE stp_TRI_getByIdxMacchina
(
@IdxMacchina NVARCHAR(50)
)
AS
SELECT *
FROM TransizioneIngressi
WHERE IdxFamigliaIngresso = (SELECT IdxFamigliaIngresso FROM Macchine2FamigliaIngressi WHERE IdxMacchina=@IdxMacchina)
RETURN
go
commit;
go
-- registro versione...
INSERT INTO [dbo].[LogUpdateDb] ([Versione],[Data]) VALUES(390, GETDATE())
GO
SELECT TOP 10 * FROM LogUpdateDb ORDER BY Versione DESC
GO
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,839 @@
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
@@ -0,0 +1,44 @@
set xact_abort on
go
begin transaction
go
set ANSI_NULLS on
go
/*************************************
* STORED PROCEDURE stp_STM_setInsEnabled
* imposta stato amcchian x permettere o meno caricamento
*
* modif.: S.E.L.
* il: 2014.01.10
**************************************/
create PROCEDURE stp_STM_setInsEnabled
(
@idxMacchina NVARCHAR(50),
@insEnabled BIT
)
AS
-- ATTIVO/DISATTIVO il caricamento degli eventi
UPDATE DatiMacchine
SET insEnabled = @insEnabled
WHERE IdxMacchina = @IdxMacchina
RETURN
go
commit
go
-- registro versione...
INSERT INTO [dbo].[LogUpdateDb] ([Versione],[Data]) VALUES(414, GETDATE())
GO
SELECT TOP 10 * FROM LogUpdateDb ORDER BY Versione DESC
GO