
/***************************************
* STORED stp_registraMovMag
*
* Salva il movimento di magazzino indicato
*
* Steamware, S.E.L.
* mod: 2010.10.15
*
****************************************/
CREATE PROCEDURE BatchQueue.stp_registraMovMag
(
	@NOMUS NVARCHAR(50),    -- è il nome utente 
	@CDCAU NVARCHAR(2),     -- è la causale del movimento
	@CDPAR NVARCHAR(15),    -- codice particolare
	@CDMAG NVARCHAR(2),     -- codice magazzino
	@QTMOV NUMERIC(9,2),    -- quantità movimento
	@DAMOV NVARCHAR(8),     -- data 8 cifre aaaammgg Data Movimento
	@RIFFO NVARCHAR(8)      -- cod UDC compresso
)
AS
    -- Movimentazioni Magazzino di Massa

    -- FILE TEKAL MWMV260F ( MWMV230F x TEST )
    -- FILE POSS  ???..... ( MWMV230F x TEST )

    -- LIBR. TEST      			MAZZT_DTV3
    -- LIBR. EFFETTIVA TEKAL	TEKA_DATV3
    -- LIBR. EFFETTIVA POSS 	????

    /* -- Variabili per test senza Stored 
    DECLARE	@NOMUS	NVARCHAR(50),   -- è il nome utente
	        @CDCAU  NVARCHAR(2),    -- è la causale del movimento
	        @CDPAR	NVARCHAR(15),   -- codice particolare
	        @CDMAG  NVARCHAR(2),    -- codice magazzino
	        @QTMOV	NUMERIC(9,2),   -- quantità movimento ATTENZIONE QUESTA E' SBAGLIATA SULLA STORED
	        @DAMOV	NVARCHAR(8),    -- data 8 cifre aaaammgg
	        @RIFFO  NVARCHAR(8)     -- cod UDC compresso

    -- SETTO LE VARIABILI DI PROVA PER TEST
    SET @NOMUS = N'PIPPO'
    SET @CDCAU = N'01'
    SET @CDPAR = N'P00528503817'
    SET @CDMAG = N'54'
    SET @QTMOV = 1234567.51
    SET @DAMOV = N'20100101'
    SET @RIFFO = N'UDCPROVA'
     */
     
	DECLARE @SQL AS NVARCHAR(4000);
    DECLARE @SqlOK AS INT;
	DECLARE @As400File AS NVARCHAR(50) = '';
    DECLARE @As400Linked AS NVARCHAR(50) = '';  -- Linked Server AS400

    SET	@SqlOk = 0;         -- variabile test se in errore
    -- Verificare prima se è già stato inserito? usare in RIFFO idxBatch?
    
    -- allineo il CDMAG a destra con zeri a SX mod. 07/09/2012
    SET @CDMAG = RIGHT('00' + LTRIM(RTRIM(@CDMAG)), 2);
    -- metto il particolare in Maiuscolo altrimenti ACG lo scarta
    SET @CDPAR = UPPER(@CDPAR);

    -- In base al nome del DB e della stored recupero il 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(), 'stp_registraMovMag' ) );

    -- Eseguo l'istruzione inserimento movimento verso AS400 con controllo errori
    BEGIN TRY

	    -- TEST per generare errore
	    -- SET @XDTPRO	= 99999920100723      -- data 8 cifre aaaammgg

        -- ==============================================================
	    -- Creo l'istruzione SQL e faccio chiamata su AS400
        -- ==============================================================

 	    SET @SQL = N'INSERT INTO OPENQUERY(' + @As400Linked
        SET @SQL = @SQL + N', ''SELECT NOMUS, CDCAU, CDPAR, CDMAG, QTMOV, DAMOV, RIFFO'
    	SET @SQL = @SQL + ' FROM ' + @As400File + ''') '
	    SET @SQL = @SQL + 'VALUES ( @NOMUS , @CDCAU , @CDPAR , @CDMAG , @QTMOV , @DAMOV , @RIFFO )'
	    
        -- Eseguo il comando T-SQL verso AS400
        EXEC sp_executesql @SQL, N'@NOMUS NVARCHAR(50)
                                ,@CDCAU NVARCHAR(2)
                                ,@CDPAR NVARCHAR(15)
                                ,@CDMAG NVARCHAR(2)
                                ,@QTMOV NUMERIC(9,2)
                                ,@DAMOV NVARCHAR(8)
                                ,@RIFFO NVARCHAR(8)'                                           -- Definizione Parametri
                                ,@NOMUS , @CDCAU , @CDPAR , @CDMAG , @QTMOV , @DAMOV , @RIFFO
     
      -- EXEC @SqlOK = sp_executesql @SQL  se faccio così non mi valorizza la variabile se da errore

/*      --VECCHIA INSERT
        INSERT INTO OPENQUERY( AS400XXX,  
        'SELECT    NOMUS ,  CDCAU ,  CDPAR ,  CDMAG ,  QTMOV ,  DAMOV ,  RIFFO 
         FROM MAZZT_DTV3.MWMV230F' )
        VALUES ( @NOMUS , @CDCAU , @CDPAR , @CDMAG , @QTMOV , @DAMOV , @RIFFO )
*/
	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

    -- Test di lettura - Modifica 06/09/2012
    IF @SqlOK = 0
      BEGIN 
            
            SET @SqlOK = -1; -- lo rimetto a 0 solo se lettura è OK
            -- Controllo che il record sia stato inserito in modo corretto su AS400
            DECLARE @SQL2 AS NVARCHAR(4000);
            DECLARE @LettoOk AS INT;

            SET @SQL2 =  N'SELECT @LettoOk = COUNT(*) FROM OPENQUERY(' + @As400Linked
            SET @SQL2 = @SQL2 + N', ''SELECT RIFFO FROM '  +  @As400File
            SET @SQL2 = @SQL2 + ' WHERE '
            SET @SQL2 = @SQL2 +     ' NOMUS = ''''' + @NOMUS + ''''''            -- Utente           
            SET @SQL2 = @SQL2 + ' AND CDCAU = ''''' + @CDCAU + ''''''            -- Causale
            SET @SQL2 = @SQL2 + ' AND CDPAR = ''''' + @CDPAR + ''''''            -- Particolare
            SET @SQL2 = @SQL2 + ' AND CDMAG = ''''' + @CDMAG + ''''''            -- Magazzino
            SET @SQL2 = @SQL2 + ' AND QTMOV = ' +  CAST(@QTMOV AS NVARCHAR(15))  -- Qta
            SET @SQL2 = @SQL2 + ' AND DAMOV = '     + @DAMOV + ''                -- Data
            SET @SQL2 = @SQL2 + ' AND RIFFO = ''''' + @RIFFO + ''''''            -- Riferimento ( UDC )        
            SET @SQL2 = @SQL2 + ''' ) '

            EXEC sp_executesql @SQL2, N'@LettoOk INT OUTPUT', @LettoOk OUTPUT;

            -- Se non trovo record Movimento UDC lo imposto come errore -2 altrimenti tutto OK
            IF @LettoOk = 0 SET @SqlOK = -2; ELSE SET @SqlOK = 0;
      END
    -- Fine Modifica - Modifica 06/09/2012

    -- Memorizzo il comando per verifica T-SQL e l'esito del comando se 0 è OK
    INSERT INTO RawData.AS400_Comandi
    SELECT GETDATE(), 'stp_registraMovMag', 
    @SQL + ' parametri :' 
    + @NOMUS + ',' + @CDCAU + ',' + @CDPAR + ',' + @CDMAG + ',' + CONVERT(VARCHAR(20) ,  @QTMOV) + ',' + @DAMOV + ',' + @RIFFO, @SqlOk

RETURN @SqlOK;
    
    /* TEST e DELETE
       SELECT * FROM OPENQUERY( AS400XXX,  'SELECT NOMUS ,CDCAU ,CDPAR ,CDMAG ,QTMOV ,DAMOV ,RIFFO FROM MAZZ_DATV3.MWMV230F' )

       DELETE 
       OPENQUERY( AS400XXX, 'SELECT * FROM MAZZT_DTV3.MWMV230F WHERE NOMUS = ''PIPPO'' ')   

       DELETE AS400XXX.A60220DC.MAZZT_DTV3.MWMV230F WHERE NOMUS_CANCELLA = 'UTENTEGMW1'
    */
