﻿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