/*************************************** * STORED stp_processaCodaConsumoMP * * Processa la coda dei consumo di UDC di MP e chiaam procedura x salvataggio dato su AS400 * * Steamware * mod: * ****************************************/ CREATE PROCEDURE [BatchQueue].[stp_processaCodaConsumoMP] ( @ExecBatchInter BIT -- 0 Eseguita in Batch , 1 in Interattivo ) AS -- faccio una query con un cursore x processare tutte le righe da inviare ad AS400.. DECLARE @UDC NVARCHAR(50) -- UDC SQL DECLARE @XRPQLN INT -- UDC DECLARE @XNRETI NVARCHAR(10) -- Progr UDC AS400 DECLARE @XDTPRO INT -- DataPrelievo DECLARE @XTRPRO NVARCHAR(5) -- Turno Prelievo DECLARE @XDESMT NVARCHAR(3) -- Destinazione Lega DECLARE @XCDTER NVARCHAR(6) -- Cod. Terzista DECLARE @ScritturaASOK AS INT = 0; DECLARE @InteroCicloASOK AS INT = 0; -- memorizzo errore nel ciclo WHILE -- Dichiaro e carico il cursore DECLARE UdcMpList CURSOR LOCAL FOR SELECT UDC FROM dbo.AS400_BatchConsumoMP WHERE DataInvioAs IS NULL OPEN UdcMpList FETCH NEXT FROM UdcMpList INTO @UDC WHILE @@FETCH_STATUS = 0 BEGIN -- controllo ci sia la riga IF (SELECT COUNT(UDC) FROM AS400_BatchConsumoMP WHERE UDC=@UDC) > 0 BEGIN -- carico valori che mi servono SELECT @XRPQLN=rq.nRapQual, @XNRETI=rq.ProgUDC, @XDTPRO=bcu.DataPrelFus, @XTRPRO=bcu.TurnoPrelFus, @XDESMT=bcu.DestLega, @XCDTER=bcu.DestTerz FROM dbo.AS400_BatchConsumoMP as bcu INNER JOIN RilPro.RapQual as rq ON bcu.UDC = rq.UDC WHERE bcu.UDC=@UDC -- BEGIN TRAN qui non va messa perchè se verso AS400 le transazioni non sono gestite -- MANCA IL CONTROLLO SE L'AGGIORNAMENTO E' STATO OK EXECUTE @ScritturaASOK = BatchQueue.stp_consumaMP @XRPQLN ,@XNRETI ,@XDTPRO ,@XTRPRO ,@XDESMT ,@XCDTER -- registro la data del movimento BATCH solo se stp_consumaMP ritorna OK -- Così non aggiorna la tabella MA L'UTENTE NON SI ACCORGE DI NULLA!!! IF @ScritturaASOK = 0 UPDATE dbo.AS400_BatchConsumoMP SET DataInvioAs = GETDATE() WHERE UDC = @UDC ELSE SET @InteroCicloASOK = @ScritturaASOK FETCH NEXT FROM UdcMpList INTO @UDC END END CLOSE UdcMpList DEALLOCATE UdcMpList -- aggiunta per dare errore se schedulata!!! GCARLO -- Se la scrittura su AS400 ha dato errore ed è stata eseguita in batch sollevo l'errore -- così anche il batch da errore IF @InteroCicloASOK <> 0 AND @ExecBatchInter = 0 BEGIN DECLARE @ErrorMessage NVARCHAR(4000); DECLARE @ErrorSeverity INT = 16; DECLARE @ErrorState INT = 1; IF @InteroCicloASOK < 0 -- errore nella verifica della scrittura su AS400 SELECT @ErrorMessage = 'Errore nella VERIFICA di scrittura su AS400 in stp_consumaMP' ELSE SELECT -- nn so se riesce a leggere i dati dell'errore cmq lo solleva @ErrorMessage = ERROR_MESSAGE()+ ' '+ CONVERT( VARCHAR(10),ERROR_NUMBER()), @ErrorSeverity = ISNULL(ERROR_SEVERITY(),16), @ErrorState = ERROR_STATE(); -- sollevo errore per mandare in errore la procedura schedulata RAISERROR (@ErrorMessage, -- Message text. @ErrorSeverity, -- Severity. @ErrorState -- State. ); END RETURN