

/*****************************************
* STORED stp_BORI_caricaDatiBolla
*
* richiama la stored di caricamento da AS400 x la bolla indicata
*
* Steamware, S.E.L.
* mod: 2013.04.15
*
****************************************/
CREATE PROCEDURE [dbo].[stp_BORI_caricaDatiBolla]
(
    @RaggrMagazz NVARCHAR(2)  ,
    @GruppoBolle NVARCHAR(1)  ,
    @NumeroBolla NVARCHAR(6)  ,
    @DataBolla   NVARCHAR(8)  ,
    @Particolare NVARCHAR(15) 
)
AS

	SET NOCOUNT ON;

    --DECLARE @RaggrMagazz AS NVARCHAR(2)  =  -- N'SP' oppure = N'TK'
    --DECLARE @GruppoBolle AS NVARCHAR(1)  = N'0'
    --DECLARE @NumeroBolla AS NVARCHAR(6)  = N'678'
    --DECLARE @DataBolla   AS NVARCHAR(8)  = N'20110421'
    --DECLARE @Particolare AS NVARCHAR(15) = N'P00528536146'

    -- ATTENZIONE!!! i parametri non devono essere nulli altrimenti la stringa ritornata è nulla

    -- Prima cancello i dati della se già presenti bolla poi li carico
    DELETE RawData.BORI202J
    WHERE  CDMFS = @RaggrMagazz
       AND GRBOS = @GruppoBolle
       AND NRBOS = @NumeroBolla
       AND DTBOS = @DataBolla
       AND CDARS = @Particolare

    DECLARE @SQL AS NVARCHAR(4000);
    DECLARE @SqlOK AS INT;
    DECLARE @As400File   AS NVARCHAR(50) = '';  -- Libreria e File AS400
    DECLARE @As400Linked AS NVARCHAR(50) = '';  -- Linked Server AS400

    SET  @SqlOK = 0;

    /*
       Prima estraggo i dati della bolla dal file in AS400 in una tabella temporanea
       Poi va letta la tabella temporanea per creare i dati per la stampa Odette
       NON VA BENE, SE ESEGUONO IN DUE LA STAMPA PUO ANDARE IN CONFLITTO

    --IF OBJECT_ID(N'tempdb..##TabTemp') IS NOT NULL   -- ##TabTemp Tabella temporanea globale altrimenti non riesco ad usarla
    --  DROP TABLE ##TabTemp;
    -- SET @SQL = 'SELECT * INTO ##TabTemp FROM OPENQUERY(AS400XXXX,
    */

    -- In base al nome del DB allora setto Linked Server e file di AS400
    SET @As400Linked = ( SELECT dbo.f_getLikedAS400(DB_NAME()) );
    -- SET  @As400File = ( SELECT dbo.f_getLibreriaAS400 ( DB_NAME() , OBJECT_SCHEMA_NAME(@@PROCID) + '.' + OBJECT_NAME(@@PROCID) ) )
    SET  @As400File = ( SELECT dbo.f_getLibreriaAS400 ( DB_NAME(), 'dbo.stp_BORI_caricaDatiBolla' ) );

    BEGIN TRY

        SET @SQL = 'INSERT INTO RawData.BORI202J SELECT * FROM OPENQUERY('   -- OPENQUERY(AS400XXXX,'SELECT ...
        SET @SQL = @SQL + @As400Linked + ',
        ''SELECT DISTINCT
                 CDMFS
                ,GRBOS
                ,DTBOS
                ,NRBOS
                ,CDARS
                ,NRRGS
                ,CDINB
                ,RA1ND
                ,RA2ND
                ,CAPND
                ,CITND
                ,RASCL
                ,INDCL
                ,CAPCL
                ,LOCCL
                ,PROCL
                ,INEND
                ,CRAGCL
                ,TELND
                ,CCDMOL
                ,CCDPTR
                ,EPLAVO
                ,NRC1B   
                ,ECMM01
                ,DEPAR
                ,RCARTC
                ,PERND
                ,CCDET1
                ,ECDNAE
                ,ECDNA1
                ,EESPMD
                ,PELDB
                ,QTCNS
                ,ECLAQP
                ,EPNETT
                ,FCDI01
                ,'''''''' AS OCDODM
                ,CCFOE1
        FROM ' + @As400File

        SET @SQL = @SQL + ' WHERE ATV08 <> ''''A'''''   -- escludo bolle annullate

        -- commemntare le righe successive per estrarre tutto
        -- Parametri di selezione della bolla
        SET @SQL = @SQL + ' AND CDMFS = '''''  + @RaggrMagazz  + ''''' '
        SET @SQL = @SQL + ' AND GRBOS = '''''  + @GruppoBolle  + ''''' '
        SET @SQL = @SQL + ' AND NRBOS = '      + @NumeroBolla  + ' '
        SET @SQL = @SQL + ' AND DTBOS = '      + @DataBolla    + ' '
        SET @SQL = @SQL + ' AND CDARS = '''''  + @Particolare  + ''''' '

        SET @SQL = @SQL + ''' ) OPTION (RECOMPILE)';

        EXEC sp_executesql @SQL -- commentare per test

	END TRY
    BEGIN CATCH
      -- PRINT ERROR_NUMBER()
      SET @SqlOK = ERROR_NUMBER();
  
      -- Uso RAISERROR mandare in errore la procedura e x per tornare le info 
      -- sull'errore originale che ha portato l'esecuzione nel blocco CATCH
      --DECLARE @ErrorMessage NVARCHAR(4000);
      --DECLARE @ErrorSeverity INT;
      --DECLARE @ErrorState INT;
      --SELECT @ErrorMessage = ERROR_MESSAGE(),@ErrorSeverity = ERROR_SEVERITY(),@ErrorState = ERROR_STATE();
      --RAISERROR (@ErrorMessage,@ErrorSeverity,@ErrorState);  -- Se non uso RAISERROR la procedura non mi da errore es. se schedulata      
    END CATCH

    -- Memorizzo il comando per verifica T-SQL e l'esito del comando se 0 è OK
    INSERT INTO RawData.AS400_Comandi
    SELECT GETDATE(), 'stp_BORI_caricaDatiBolla', REPLACE(@SQL,'    ',' '), @SqlOK;

    /* NEW 2013/05/01 
     Aggiorno il change index in base alla data validità e data bolla
     leggo dalla tabella RawData.ANODM00F aggiornata da import AS400 ( potrei aggiornarla anche qui ) 
    */   
    IF @SqlOK = 0   -- se import Bolle è OK
        BEGIN
            ;WITH cte AS      -- cte con inizio e fine validità
            (
             SELECT OCDPAR,
                    OCDODM,
                    ODTVAL,
                    ISNULL(( SELECT MIN(ODTVAL) 
                                FROM RawData.ANODM00F AS T2
                                WHERE T2.OCDPAR = v.OCDPAR AND T2.ODTVAL > v.ODTVAL ) 
                    ,'20993112')  AS ODTVALEND
             FROM RawData.ANODM00F AS v
            )
            UPDATE b
               SET OCDODM = c.OCDODM
            FROM RawData.BORI202J AS b
            INNER JOIN cte AS c 
              ON b.CDARS = c.OCDPAR AND b.DTBOS >= c.ODTVAL AND b.DTBOS < c.ODTVALEND
            WHERE   CDMFS = @RaggrMagazz        -- aggiorno solo la bolla corretta
                    AND GRBOS = @GruppoBolle  
                    AND NRBOS = @NumeroBolla  
                    AND DTBOS = @DataBolla    
                    AND CDARS = @Particolare  

            /* query di test
            ;WITH cte AS
            (
            SELECT OCDPAR,
                   OCDODM,
                   ODTVAL,
                   ISNULL(( SELECT MIN(ODTVAL) FROM RawData.ANODM00F AS T2
                            WHERE T2.OCDPAR = v.OCDPAR AND T2.ODTVAL > v.ODTVAL ) 
                   ,'20993112')  AS ODTVALEND
            FROM RawData.ANODM00F AS v
            )
            SELECT b.*, c.OCDODM FROM RawData.BORI202J AS b
            LEFT JOIN cte AS c
            ON b.CDARS = c.OCDPAR AND b.DTBOS >= c.ODTVAL AND b.DTBOS < c.ODTVALEND
            */
        END

    -- Carico i dati della Temp table nel file di appoggio
    -- INSERT INTO RawData.BORI202J
    -- SELECT * FROM ##TabTemp


RETURN

