--- alter degli schema AS400 --> RawData (caricamento dati grezzi)

create schema RawData authorization db_accessadmin
go

-- creo schema x gestione richieste batch
create schema BatchQueue authorization db_accessadmin
go


-- lascio in schema As400 i dati attuali, creo tab nuove RAW
create table RawData.XOGIX00F(
  XRPQLN numeric(6,0) not null constraint DF_XOGIX00F_XRPQLN default (0),
  XRPQLD numeric(8,0) not null constraint DF_XOGIX00F_XRPQLD default (0),
  XNRETI char(10)     not null constraint DF_XOGIX00F_XNRETI default (''),
  XCDFOR char(6)      not null constraint DF_XOGIX00F_XCDFOR default (''),
  XCDTER char(6)      not null constraint DF_XOGIX00F_XCDTER default (''),
  XCDPAR char(15)     not null constraint DF_XOGIX00F_XCDPAR default (''),
  XDTPRO numeric(8,0) not null constraint DF_XOGIX00F_XDTPRO default (0),
  XTRPRO char(5)      not null constraint DF_XOGIX00F_XTRPRO default (''),
  XQTPRO numeric(5,0) not null constraint DF_XOGIX00F_XQTPRO default (0),
  XDESMT char(3)      not null constraint DF_XOGIX00F_XDESMT default (''),
  XMATSC char(1)      not null constraint DF_XOGIX00F_XMATSC default (''),
  XBENQL char(1)      not null
)
go





-- travaso dati da tab As400 a RawData
INSERT INTO RawData.XOGIX00F
SELECT     *
FROM         As400.t_XOGIX00F
GO

-- aggiungo tab rilpro

set xact_abort on
go

begin transaction
go

create table RilPro.RapQual(
  nRapQual     numeric(6,0) not null,
  DataRapQual  numeric(8,0) not null,
  ProgUDC      nvarchar(10) not null constraint PK_RapQual primary key,
  CodFor       nvarchar(6)  not null,
  DestTerz     nvarchar(6)  not null,
  CodLega      nvarchar(15) not null,
  DataPrelFus  numeric(8,0) not null,
  TurnoPrelFus nvarchar(5)  not null,
  Qta          numeric(5,0) not null,
  DestLega     nvarchar(3)  not null,
  LegaScaric   nvarchar(1)  not null,
  BenesQual    nvarchar(1)  not null,
  UDC          nvarchar(13)
)
go

create index i_numRap on RilPro.RapQual(nRapQual)
go

create index i_dataRap on RilPro.RapQual(DataRapQual)
go

create index i_numDataRap on RilPro.RapQual(nRapQual,DataRapQual)
go

commit
go

-- aggiungo stored di travaso!
set xact_abort on
go

begin transaction
go

create schema BatchQueue authorization db_accessadmin
go

set ANSI_NULLS on
go

/***************************************
* STORED stp_batch_RapQual_S01
*
* Esegue lo step 1 (caricamento dati RAW da AS400) per la tab dei rapporti di qualità
*
* Steamware, S.E.L.
* mod: 2010.09.23
*
****************************************/
create PROCEDURE BatchQueue.stp_batch_RapQual_S01
(
    @minNumRapQual INT
)
AS
    -- BOZZA DA COMPLETARE A CURA MAZZUCCONI!!!

    DECLARE @SQL AS NVARCHAR(1000)

    -- svuoto tab raw attuale
    /*
    DELETE FROM RawData.XOGIX00F
    */


    -- INSERISCO DA AS400
    /*
    INSERT INTO RawData.XOGIX00F 
    (
        SET @SQL = 
        N'SELECT 
                XRPQLN
               ,XRPQLD
               ,XNRETI
               ,XCDFOR
               ,XCDTER
               ,XCDPAR
               ,XDTPRO
               ,XTRPRO
               ,XQTPRO
               ,XDESMT
               ,XMATSC
               ,XBENQL
        FROM OPENQUERY( P65220DC,  ''SELECT * FROM MAZZT_DTV3.XOGIX00F WHERE XRPQLN >= '
        SET @SQL = @SQL + @minNumRapQual + ''' )'

        EXEC dbo.sp_executesql @SQL
    )
    */

RETURN
go

/***************************************
* STORED stp_batch_RapQual_S01
*
* Esegue lo step 2 (travaso dati RAW in RilPro) per la tab dei rapporti di qualità
*
* Steamware, S.E.L.
* mod: 2010.09.23
*
****************************************/
create PROCEDURE BatchQueue.stp_batch_RapQual_S02
AS
    -- eseguo UPSERT x tutti i dati disponibili in tab Raw...
    
    -- se il dato esiste faccio UPDATE!!!
    UPDATE RilPro.RapQual
        SET CodFor	= u.XCDFOR, 
        DestTerz	= u.XCDTER,
        CodLega		= u.XCDPAR,
        DataPrelFus	= u.XDTPRO,
        TurnoPrelFus= u.XTRPRO,	
        Qta			= u.XQTPRO,
        DestLega	= u.XDESMT,
        LegaScaric	= u.XMATSC,
        BenesQual	= u.XBENQL	
    FROM RilPro.RapQual rq
    INNER JOIN RawData.XOGIX00F u ON u.XNRETI = rq.ProgUDC; -- AND u.XRPQLN = rq.nRapQual AND u.XRPQLD = rq.DataRapQual; -- se XNRETI è univoco ...
    
    
    -- creo tab temporanea x i dati inesistenti..
    WITH cteInsert AS
        (SELECT	x.*
            FROM RawData.XOGIX00F x LEFT OUTER JOIN RilPro.RapQual rq 
            ON x.XNRETI = rq.ProgUDC -- AND u.XRPQLN = rq.nRapQual AND u.XRPQLD = rq.DataRapQual; -- se XNRETI è univoco ...
            WHERE rq.ProgUDC IS NULL )
    
    -- se il dato non c'è faccio INSERT!!!
    INSERT INTO RilPro.RapQual(nRapQual, DataRapQual, ProgUDC, CodFor, DestTerz, CodLega, DataPrelFus, TurnoPrelFus, Qta, DestLega, LegaScaric, BenesQual)
    SELECT	XRPQLN AS nRapQual,
            XRPQLD AS DataRapQual,
            XNRETI AS ProgUDC,
            XCDFOR AS CodFor,
            XCDTER AS DestTerz,
            XCDPAR AS CodLega,
            XDTPRO AS DataPrelFus,
            XTRPRO AS TurnoPrelFus,
            XQTPRO AS Qta,
            XDESMT AS DestLega,
            XMATSC AS LegaScaric,
            XBENQL AS BenesQual
        FROM cteInsert	
    
        
RETURN
go

commit
go


- nuove functions
set xact_abort on
go

begin transaction
go

set ANSI_NULLS on
go

/***************************************
* function componiUdc
*
* compone il cod UDC a partire da 
* - CodCS (codice company sito, 2 char)
* - Flusso (codice flusso-bilancia 2 char)
* - @Anno (anno, 2 char)
* - @numUdc (progr annuale, 2 char)
*
* Steamware, S.E.L.
* mod: 2010.09.23
*
****************************************/
create FUNCTION componiUdc
(
    @CodCS NVARCHAR(2),
    @Flusso NVARCHAR(2),
    @Anno NVARCHAR(2),
    @numUdc INT
)
RETURNS NVARCHAR(13)
AS
    BEGIN
    
        DECLARE @answ AS NVARCHAR(50)
    
        SET @answ = 'U' + @CodCS + @Flusso + @Anno + dbo.f_padLeft(CAST(@numUdc AS VARCHAR(6)), 6, '0')
    
    RETURN @answ
    END
go

commit
go


set xact_abort on
go

begin transaction
go

set ANSI_NULLS on
go

/***************************************
* function getUdcComp
*
* effettua la "compattazione" dell'UDC, andando a prendere un sottoinsieme dei dati iniziali (UAAxxxx dove AA = anno...)
*
* Steamware, S.E.L.
* mod: 2010.09.23
*
****************************************/
create FUNCTION getUdcComp 
(
    @fullUDC NVARCHAR(50), 
    @maxLen INTEGER
)
RETURNS  NVARCHAR(20)
AS
    BEGIN
        -- calcolo lunghezza originale
        DECLARE	@fullLen AS INT
        SET		@fullLen = LEN(@fullUDC)

        -- dichiaro stringa out (max 20 char)
        DECLARE @answ NVARCHAR(20)
        
        -- recupero parte finale (ultimi @maxLen caratteri...)
        
        
        -- compongo codice
        SET @answ = 'U' + RIGHT(LEFT(@fullUDC, 7), 2) + RIGHT(@fullUDC,@maxLen-3) -- tolgo 3 char: U + anno...

    RETURN @answ
    END
go

commit
go





-- altre stored
set xact_abort on
go

begin transaction
go

set ANSI_NULLS on
go

/***************************************
* STORED stp_rappQualAssociaUdc
*
* Associa l'UDC (creato) ad un rapp qualità di AS esistente SOLO SE UDC è NULL
*
* Steamware, S.E.L.
* mod: 2010.09.23
*
****************************************/
create PROCEDURE stp_rappQualAssociaUdc
(
    @ProgUDC NVARCHAR(10),
    @UDC NVARCHAR(13)
)
AS
    UPDATE	RilPro.RapQual
    SET		UDC = @UDC
    WHERE	(ProgUDC = @ProgUDC) AND (UDC IS NULL)
    
    -- restituisce la riga aggiornata
    SELECT * 
    FROM RilPro.RapQual 
    WHERE	ProgUDC = @ProgUDC
        
RETURN
go

/***************************************
* STORED stp_rappQualGetByNumRapQual
*
* Ottiene l'elenco dei record di rapp qualità di AS dato il numero del rapporto di qualità che NON HANNO UDC
*
* Steamware, S.E.L.
* mod: 2010.09.23
*
****************************************/
create PROCEDURE stp_rappQualGetByNumRapQual
(
    @nRapQual INT
)
AS
    -- restituisce le righe richieste
    SELECT	* 
    FROM	RilPro.RapQual 
    WHERE	(nRapQual = @nRapQual)  AND (UDC IS NULL)
        
RETURN
go

commit
go




-- update stored

set xact_abort on
go

begin transaction
go

set ANSI_NULLS on
go

/***************************************
* STORED stp_UDC_insNew
*
* crea un nuovo record nella TabStatoOdpUdc e restituisce il codice UDC appena creato
*
* Steamware, S.E.L.
* mod: 2010.04.28
*
****************************************/
alter PROCEDURE stp_UDC_insNew
(
    @CodCS VARCHAR(2),
    @Flusso VARCHAR(2),
    @Anno VARCHAR(2),
    @Tara FLOAT,
    @CodImballo AS VARCHAR(50),
    @CodTipoDichiaraz CHAR(1),
    @CodOperatore AS VARCHAR(50),
    @CodEvento VARCHAR(10)
)
AS

-- DECLARE iniziali
DECLARE @UDC AS VARCHAR(20)
DECLARE @numFlu AS INT
DECLARE @numUdc AS INT
DECLARE @nextUdc AS INT
    
------------------------------------------------------------------------------------------------------
-- Flusso
------------------------------------------------------------------------------------------------------
-- controllo se esiste il flusso (bilancia)...
SET @numFlu = (
    SELECT count(*)
    FROM AnagBilance
    WHERE	CodBilancia	= @Flusso
)
-- ...sennò lo creo...
IF(@numFlu = 0)
    BEGIN
        -- se c'è inserisco in tab
        INSERT INTO AnagBilance(CodBilancia, DescrImpianto, CodCS)
        VALUES (@Flusso, @Flusso, @CodCS)
    END
------------------------------------------------------------------------------------------------------

        
------------------------------------------------------------------------------------------------------
-- UDC
------------------------------------------------------------------------------------------------------
-- controllo se ci sia già un UDC per company / flusso anno
BEGIN TRAN
    -- cerco nella tab contatori UDC l'ultimo valido
    SET @numUdc = (
        SELECT count(*)
        FROM ContatoriUdc
        WHERE	CodCS		=	@CodCS
        AND		Flusso		=	@Flusso
        AND		Anno		=	@Anno
    )
    -- controllo se record c'è...
    IF(@numUdc > 0)
        BEGIN
            -- se c'è incremento di 1 in tab
            UPDATE ContatoriUdc
            SET LastIdx = LastIdx  + 1
            WHERE	CodCS		=	@CodCS
            AND		Flusso		=	@Flusso
            AND		Anno		=	@Anno
        END
    ELSE
        BEGIN
            -- lo creo!
            INSERT INTO ContatoriUdc(CodCS, Flusso, Anno, LastIdx)
            VALUES (@CodCS, @Flusso, @Anno, 1)
        END		
    -- aggiorno numero UDC
    SET @numUdc = (
        SELECT LastIdx
        FROM ContatoriUdc
        WHERE	CodCS		=	@CodCS
        AND		Flusso		=	@Flusso
        AND		Anno		=	@Anno
    )
COMMIT TRAN
------------------------------------------------------------------------------------------------------

------------------------------------------------------------------------------------------------------
-- Ciclo principale x inserimento nuovo record
------------------------------------------------------------------------------------------------------
-- ottengo il nuovo codice UDC completo
--SET @UDC = 'U' + @CodCS + @Flusso + @Anno + dbo.f_padLeft(CAST(@numUdc AS VARCHAR(6)), 6, '0')
SET @UDC = dbo.componiUdc(@CodCS, @Flusso, @Anno, @numUdc)
    
-- inserisco un nuovo record
INSERT INTO ElencoCartellini(CodCS, UDC, Tara, IdxPosizione, Qta, CodImballo, CreateDate, ModDate)
VALUES	(@CodCS, @UDC, @Tara, 0, 0, @CodImballo, GETDATE(), GETDATE())
------------------------------------------------------------------------------------------------------

------------------------------------------------------------------------------------------------------
-- restituisco la tab dati con l'udc appena inserito
------------------------------------------------------------------------------------------------------
SELECT * 
FROM ElencoCartellini
WHERE  UDC = @UDC
------------------------------------------------------------------------------------------------------

RETURN
go

/***************************************
* STORED stp_UDC_insNewFull
*
* crea un nuovo record nella TabStatoOdpUdc FULL (con pesi, qta...) e restituisce il codice UDC appena creato
*
* Steamware, S.E.L.
* mod: 2010.04.28
*
****************************************/
alter PROCEDURE stp_UDC_insNewFull
(
    @CodCS VARCHAR(2),
    @Flusso VARCHAR(2),
    @Anno VARCHAR(2),
    @CodCliente VARCHAR(6),
    @Particolare VARCHAR(15),
    @CodImpianto AS VARCHAR(50),
    @CodStampo VARCHAR(8),
    @Esponente VARCHAR(6),
    @Figura VARCHAR(4),
    @DataFus DATETIME,
    @TurnoFus INT,
    @CodImballo VARCHAR(15),
    @CodSoggetto VARCHAR(17),	
    @Tara FLOAT,
    @IdxPosizione INT,
    @CodTipoDichiaraz CHAR(1),
    @CodEvento VARCHAR(10),
    @Qta DECIMAL(10,2),
    @PesoTot FLOAT,
    @PesoCad FLOAT,
    @CodStato VARCHAR(50),
    @UDC_parent VARCHAR(20)
)
AS

-- DECLARE iniziali
DECLARE @UDC AS VARCHAR(20)
DECLARE @RagSociale AS VARCHAR(35)
DECLARE @DescParticolare AS VARCHAR(30)
DECLARE @DescImpianto AS VARCHAR(50)
DECLARE @DisegnoGrezzo AS VARCHAR(30)
DECLARE @NumCont AS INT
DECLARE @numFlu AS INT
DECLARE @numUdc AS INT
DECLARE @nextUdc AS INT

------------------------------------------------------------------------------------------------------
-- Caricamento Dati da anagrafica
------------------------------------------------------------------------------------------------------
-- cerco la ragione sociale...
SET @RagSociale = (
    SELECT        ISNULL(RagSociale, 'ND') AS RagSociale
    FROM            RilPro.AnagClienti
    WHERE        (CodCliente = @CodCliente)
)

-- Cerco descrizione del particolare...
SET @DescParticolare = (
    SELECT        ISNULL(DescParticolare, 'ND') AS DescParticolare
    FROM            RilPro.AnagParticolari
    WHERE        (Particolare = @Particolare)
)

-- cerco codice disegno grezzo
SET @DisegnoGrezzo = (
    SELECT        ISNULL(DisegnoGrezzo, 'ND') AS DescParticolare
    FROM            RilPro.AnagParticolari
    WHERE        (Particolare = @Particolare)
)

-- cerco descrizione Impianto
SET @DescImpianto = (
    SELECT        ISNULL(DescImpianto, 'ND') AS DescImpianto
    FROM            AnagImpianti
    WHERE        (CodImpianto = @CodImpianto)
)



-- Calcolo contatore intero successivo x il contenitore...
SET @NumCont = (
    SELECT      ISNULL(MAX(NumCont), 0) + 1 AS NumCont
    FROM        ElencoCartellini
    WHERE       (Particolare = @Particolare)
    AND			(DataFus = @DataFus)
    AND			(TurnoFus = @TurnoFus)
    AND			(CodImpianto = @CodImpianto)
    AND			(CodStampo = @CodStampo)
    AND			(Figura = @Figura)	
)


------------------------------------------------------------------------------------------------------

------------------------------------------------------------------------------------------------------
-- Flusso
------------------------------------------------------------------------------------------------------
-- controllo se esiste il flusso (bilancia)...
SET @numFlu = (
    SELECT count(*)
    FROM AnagBilance
    WHERE	CodBilancia	= @Flusso
)
-- ...sennò lo creo...
IF(@numFlu = 0)
    BEGIN
        -- se c'è inserisco in tab
        INSERT INTO AnagBilance(CodBilancia, DescrImpianto, CodCS)
        VALUES (@Flusso, @Flusso, @CodCS)
    END
------------------------------------------------------------------------------------------------------

        
------------------------------------------------------------------------------------------------------
-- UDC
------------------------------------------------------------------------------------------------------
-- controllo se ci sia già un UDC per company / flusso anno
BEGIN TRAN
    -- cerco nella tab contatori UDC l'ultimo valido
    SET @numUdc = (
        SELECT count(*)
        FROM ContatoriUdc
        WHERE	CodCS		=	@CodCS
        AND		Flusso		=	@Flusso
        AND		Anno		=	@Anno
    )
    -- controllo se record c'è...
    IF(@numUdc > 0)
        BEGIN
            -- se c'è incremento di 1 in tab
            UPDATE ContatoriUdc
            SET LastIdx = LastIdx  + 1
            WHERE	CodCS		=	@CodCS
            AND		Flusso		=	@Flusso
            AND		Anno		=	@Anno
        END
    ELSE
        BEGIN
            -- lo creo!
            INSERT INTO ContatoriUdc(CodCS, Flusso, Anno, LastIdx)
            VALUES (@CodCS, @Flusso, @Anno, 1)
        END
    -- aggiorno numero UDC
    SET @numUdc = (
        SELECT LastIdx
        FROM ContatoriUdc
        WHERE	CodCS		=	@CodCS
        AND		Flusso		=	@Flusso
        AND		Anno		=	@Anno
    )
COMMIT TRAN
------------------------------------------------------------------------------------------------------

------------------------------------------------------------------------------------------------------
-- Ciclo principale x inserimento nuovo record
------------------------------------------------------------------------------------------------------
BEGIN TRAN
    -- ottengo il nuovo codice UDC completo
    --SET @UDC = 'U' + @CodCS + @Flusso + @Anno + dbo.f_padLeft(CAST(@numUdc AS VARCHAR(6)), 6, '0')
    SET @UDC = dbo.componiUdc(@CodCS, @Flusso, @Anno, @numUdc)

        
    -- inserisco un nuovo record
    INSERT INTO ElencoCartellini(UDC, CodCS, CodCliente, RagSociale, Particolare, DescParticolare, DisegnoGrezzo, Esponente, CodImpianto, DescImpianto, CodStampo, Figura, DataFus, TurnoFus, CodImballo, CodSoggetto, NumCont, Tara, Qta, CodStato, IdxPosizione, PesoTot, PesoCad, CreateDate, ModDate)
    VALUES	(@UDC, @CodCS, @CodCliente, @RagSociale, @Particolare, @DescParticolare, @DisegnoGrezzo, @Esponente, @CodImpianto, @DescImpianto, @CodStampo, @Figura, @DataFus, @TurnoFus, @CodImballo, @CodSoggetto, @NumCont, @Tara, @Qta, @CodStato, @IdxPosizione, @PesoTot, @PesoCad, GETDATE(), GETDATE())

    -- inserisco relazione aprent-child tra UDC vecchio (tara) e nuovo (pesa)
    INSERT INTO RelazUDC(UDC_parent, UDC_child)
    VALUES (@UDC_parent, @UDC)
COMMIT TRAN
------------------------------------------------------------------------------------------------------

/*
------------------------------------------------------------------------------------------------------
-- Salvataggio dati evento in tab StoricoEventi
------------------------------------------------------------------------------------------------------
INSERT INTO StoricoEventi(DataEv, CodEvento, CodOperatore, CodTipoDichiaraz, CodCS, UDC, Qta, PesoTot, PesoCad, Particolare, CodStato, CodStampo, Figura, FiguraIncisa)
VALUES	(GETDATE(), @CodEvento, @CodOperatore, @CodTipoDichiaraz, @CodCS, @UDC, @Qta, @PesoTot, @PesoCad, @Particolare, @CodStato, @CodStampo, @Figura, @FiguraIncisa)
------------------------------------------------------------------------------------------------------
*/

------------------------------------------------------------------------------------------------------
-- restituisco la tab dati con l'udc appena inserito
------------------------------------------------------------------------------------------------------
SELECT * 
FROM ElencoCartellini
WHERE  UDC = @UDC
------------------------------------------------------------------------------------------------------

RETURN
go

commit
go


-- aggiungo stato MP
set xact_abort on
go

begin transaction
go

INSERT INTO dbo.AnagStatiProdotto
  VALUES (N'MP', N'Materia Prima')
go

commit transaction
go





-- registro versione...
INSERT INTO [dbo].[LogUpdateDb] ([Versione],[Data]) VALUES(257, GETDATE())
GO