Usuário com melhor resposta
Problema com Retorno de Procedure

Pergunta
-
Pessoal, tenho uma procedure(Proc 1) principal que dentro dela existe um cursor e dentro desse cursor ele chama outra procedure(Proc 2), que retorna o conteudo da Proc2 para uma tabela temporaria e no final eu retorno o select dessa temp para quem chamou a minha Proc1 e armazeno em outra temporaria.
Ai que está o problema, quando acontece isso, não retorna nada, aparece apena a msg de que foi executado com sucesso
Chamada da proc1 eh essa:
Create table #TmpRetDT( cd_produto CHAR(13), nr_item_produto int, qt_receb int, qt_dt int, qt_saldo_receb int, qt_pedido_dt int, nr_nf_origem varchar(6), ds_serie_origem varchar(3), dt_emissao datetime, cd_origem_dt int, cd_destino_dt int ) insert into #TmpRetDT EXEC sgf_fat.dbo.p_mfat_retorno_dt_item123123 @TT_ITENS_DT
E segue a proc 2
CREATE PROC dbo.p_mfat_retorno_dt_item ( @TT_ITENS_DT as DBO.TT_MFAT_DT_ITENS READONLY ) As -- RETORNO DA PROC create table #tmpRetItemSaldo ( cd_produto char(13), nr_item int, qt_receb int, qt_dt int, qt_saldo_receb int, qt_pedido_dt int, dt_emissao datetime, nr_nf_origem varchar(6), ds_serie_origem varchar(3), cd_origem_dt int, cd_destino_dt int ) --–1. Declara CURSOR (DECLARE) declare item_cursor cursor for select cd_origem_dt, cd_destino_dt, cd_produto, qt_pedido from @TT_ITENS_DT --–2. Abre o CURSOR (OPEN) open item_cursor --–3. Alimenta variáveis com os dados do CURSOR (FETCH) declare @cd_origem_dt smallint, @cd_destino_dt smallint, @cd_produto char(13), @qt_pedido int fetch next from item_cursor into @cd_origem_dt, @cd_destino_dt, @cd_produto, @qt_pedido WHILE @@FETCH_STATUS = 0 begin insert into #tmpRetItemSaldo exec sgf_rec.dbo.p_mrec_consistir_saldo_dev_produto @cd_destino_dt,@cd_origem_dt,@cd_produto,@qt_pedido -- Pega proximo item do loop fetch next from item_cursor into @cd_origem_dt, @cd_destino_dt, @cd_produto, @qt_pedido end --–4. Fecha e desaloca o CURSOR (CLOSE e DEALLOCATE) close item_cursor deallocate item_cursor; select cd_produto ,nr_item_produto ,qt_receb ,qt_dt ,qt_saldo_receb ,qt_pedido_dt ,nr_nf_origem ,ds_serie_origem ,dt_emissao ,cd_origem_dt ,cd_destino_dt from #tmpRetItemSaldo drop table #tmpRetItemSaldo
Preciso que insira na minha #TmpRetDT
Alguém pode me ajudar a resolver esse problema?- Editado Rafael Mitsunaka quarta-feira, 25 de novembro de 2015 12:36
Respostas
-
Bom consegui resolver retirando a proc 2.
segue como ficou:
USE SGF_FAT GO IF EXISTS (select * from sysobjects where id = object_id('p_mfat_retorno_dt_item')) drop proc dbo.p_mfat_retorno_dt_item GO CREATE PROC dbo.p_mfat_retorno_dt_item ( @TT_ITENS_DT as DBO.TT_MFAT_DT_ITENS READONLY ,@fl_erro_ret BIT OUTPUT -- 1 ==> OK ; 0 ==> ERRO ,@ds_msg_ret VARCHAR(5000) OUTPUT -- Em caso de erro, retorno a mensagem. ) As BEGIN TRY -- RETORNO DA PROC create table #tmpRetItemSaldo ( cd_produto char(13), nr_item int, qt_receb int, qt_dt int, qt_saldo_receb int, qt_pedido_dt int, dt_emissao datetime, nr_nf_origem varchar(6), ds_serie_origem varchar(3), cd_origem_dt int, cd_destino_dt int ) --–1. Declara CURSOR (DECLARE) declare item_cursor cursor for select cd_origem_dt, cd_destino_dt, cd_produto, qt_pedido from @TT_ITENS_DT --–2. Abre o CURSOR (OPEN) open item_cursor --–3. Alimenta variáveis com os dados do CURSOR (FETCH) declare @cd_origem_dt smallint, @cd_destino_dt smallint, @cd_produto char(13), @qt_pedido int fetch next from item_cursor into @cd_origem_dt, @cd_destino_dt, @cd_produto, @qt_pedido WHILE @@FETCH_STATUS = 0 begin --insert into #tmpRetItemSaldo --exec sgf_rec.dbo.p_mrec_consistir_saldo_dev_produto @cd_destino_dt,@cd_origem_dt,@cd_produto,@qt_pedido ---- INICIO LOOP SALDO --- DECLARE @Inicio INT, @final INT, @qt_saldo_nf INT, @qt_saldo_total INT, @qt_dif INT ------------------------------------------------------------------------------------------- --1.0 : Iniciando dados do Loop para aplicação da regra FIFO. ------------------------------------------------------------------------------------------- CREATE TABLE #tbTmpRetDev ( nr_identity int not null identity(1,1), --nr_pednf varchar(6), cd_produto char(13), qt_receb int, qt_dt int, qt_saldo int, qt_pedido int, dt_emissao datetime, nr_nf_origem varchar(6), ds_serie_origem varchar(3), cd_origem smallint, cd_destino smallint ) ------------------------------------------------------------------------------------------- --2.0 : Criação de temporaria para auxilio na validação de saldos e aplicação da regra FIFO ------------------------------------------------------------------------------------------- CREATE TABLE #Tb_receb_fifo ( nr_identity int not null identity(1,1), cd_origem smallint, cd_destino smallint, nr_nf varchar(6), ds_serie varchar(3), dt_emissao datetime, cd_produto char(13), qt_receb int, qt_saldo int, ) ------------------------------------------------------------------------------------------- --3.0 : Alimentando a TEMP com os dados de Recebimento do Produto com Saldo. ------------------------------------------------------------------------------------------- INSERT INTO #Tb_receb_fifo SELECT rec.cd_origem, rec.cd_destino, rec.nr_nf, rec.ds_serie, rec.dt_emissao, rec.cd_produto, rec.qt_receb, saldo = ISNULL(rec.qt_receb,0) - ISNULL(SUM(dev.qt_reserva_dev),0) FROM sgf_rec.dbo.vw_mrec_receb_transf rec (NOLOCK) LEFT JOIN sgf_fat.dbo.vw_mfat_dev_transf dev (nolock) ON rec.cd_origem = dev.cd_filial_ref AND rec.nr_nf = dev.nr_nf_ref AND rec.ds_serie = dev.ds_serie_ref AND rec.cd_produto = dev.cd_produto WHERE rec.cd_origem = @cd_destino_dt AND rec.cd_destino = @cd_origem_dt AND rec.cd_produto = @cd_produto GROUP BY rec.cd_origem, rec.cd_destino, rec.nr_nf, rec.ds_serie, rec.dt_emissao, rec.cd_produto, rec.qt_receb HAVING rec.qt_receb - ISNULL(SUM(dev.qt_reserva_dev),0) > 0 ORDER BY rec.dt_emissao ------------------------------------------------------------------------------------------- --4.0 : Iniciando dados do Loop para aplicação da regra FIFO. ------------------------------------------------------------------------------------------- SELECT @final = @@ROWCOUNT SELECT @Inicio = 1 SELECT @qt_saldo_total = 0 WHILE (@Inicio <= @final) BEGIN SELECT @qt_saldo_nf = qt_saldo FROM #Tb_receb_fifo WHERE nr_identity = @Inicio -------------------------------- --3.1 : Verifica o Saldo -------------------------------- IF (@qt_saldo_nf + @qt_saldo_total) >= @qt_pedido BEGIN ------------------------------------------------------------------------------------ --3.2 : Pegando total da diferenca para alimentar a tabela auxiliar de DEV. -- Alimenta a tabela de Devolução com as informações de Referência da Devolução -- Quando mais de uma NF referenciada ou NFs sem Saldos Totais. ------------------------------------------------------------------------------------ SELECT @qt_dif = @qt_pedido - @qt_saldo_total insert into #tbTmpRetDev SELECT cd_produto, qt_receb, @qt_dif, qt_receb - @qt_dif, @qt_pedido, GETDATE(), nr_nf, ds_serie, @cd_origem_dt, cd_origem FROM #Tb_receb_fifo WHERE nr_identity = @Inicio BREAK END ELSE BEGIN --------------------------------------------------- --3.3 : Alimenta contador e soma valores de saldo. --------------------------------------------------- INSERT INTO #tbTmpRetDev SELECT cd_produto, qt_receb, qt_saldo, 0, @qt_pedido, GETDATE(), nr_nf, ds_serie, @cd_origem_dt, cd_origem FROM #Tb_receb_fifo WHERE nr_identity = @Inicio SET @qt_saldo_total = @qt_saldo_total + @qt_saldo_nf END SET @Inicio = @Inicio + 1 END insert into #tmpRetItemSaldo Select cd_produto , nr_identity , qt_receb , qt_dt , qt_saldo , qt_pedido , dt_emissao , nr_nf_origem, ds_serie_origem, cd_origem , cd_destino from #tbTmpRetDev drop table #tbTmpRetDev drop table #Tb_receb_fifo ---FIM--- -- Pega proximo item do loop fetch next from item_cursor into @cd_origem_dt, @cd_destino_dt, @cd_produto, @qt_pedido end --–4. Fecha e desaloca o CURSOR (CLOSE e DEALLOCATE) close item_cursor deallocate item_cursor; select cd_produto ,nr_item ,qt_receb ,qt_dt ,qt_saldo_receb ,qt_pedido_dt ,nr_nf_origem ,ds_serie_origem ,dt_emissao ,cd_origem_dt ,cd_destino_dt from #tmpRetItemSaldo --select * from @TT_MFAT_DT_ITENS_RET_NF IF @@ROWCOUNT = 0 BEGIN SET @ds_msg_ret = 'Inconsistência na Pesquisa do Saldo de Devolução de Transf.' + ' ==> PROC: p_mfat_retorno_dt_item ==>' GOTO ERROR END drop table #tmpRetItemSaldo SET @fl_erro_ret = 1 Return END TRY BEGIN CATCH SET @ds_msg_ret = ' Inconsistência na Consulta de Saldo de Dev. de Transferência. ' + ' --> Procedure..: ' + ISNULL(ERROR_PROCEDURE(), '' ) + ' --> Linha Erro.: ' + CAST( ISNULL(ERROR_LINE(), '' ) AS VARCHAR) + ' --> Mensagem...: ' + ISNULL(ERROR_MESSAGE(), '' ) GOTO ERROR END CATCH ERROR: SET @fl_erro_ret = 0 RETURN go
- Marcado como Resposta Rafael Mitsunaka quarta-feira, 25 de novembro de 2015 18:44
Todas as Respostas
-
Bom dia Rafael, Verifique se a tabela @TT_ITENS_DT que foi passada como parâmetro de entrada da SP realmente contém registros. Verifique também se a SP sfg_rec.dbo.p_mrec_consistir_saldo_dev_produto recebe corretamente os valores nos parâmetros. Se sim, veja se ela retorna os dados de acordo com o esperado. Abraço, Antonio Cesar
-
Estão corretos.
A table type contem 1 linha de registros e a proc p_mrec_consistir_saldo_dev_produto retorna 1 linha também nesse caso.
O estranho eh não conseguir devolver esse resultado para a procedure principal.
Mesmo, se eu fizer isso, select 'testando' as ds_serie_origem
e tentar inserir essa unica String em uma outra temporaria de 1 coluna, não funciona.
Agora se eu executar a procedure sem insert em temporaria aparece o resultado.
EXEC sgf_fat.dbo.p_mfat_retorno_dt_item123123 @TT_ITENS_DT
o problema é que eu preciso que o resultado seja incluído em uma temporária.
- Editado Rafael Mitsunaka quarta-feira, 25 de novembro de 2015 13:36
-
-
-
-
-
Bom consegui resolver retirando a proc 2.
segue como ficou:
USE SGF_FAT GO IF EXISTS (select * from sysobjects where id = object_id('p_mfat_retorno_dt_item')) drop proc dbo.p_mfat_retorno_dt_item GO CREATE PROC dbo.p_mfat_retorno_dt_item ( @TT_ITENS_DT as DBO.TT_MFAT_DT_ITENS READONLY ,@fl_erro_ret BIT OUTPUT -- 1 ==> OK ; 0 ==> ERRO ,@ds_msg_ret VARCHAR(5000) OUTPUT -- Em caso de erro, retorno a mensagem. ) As BEGIN TRY -- RETORNO DA PROC create table #tmpRetItemSaldo ( cd_produto char(13), nr_item int, qt_receb int, qt_dt int, qt_saldo_receb int, qt_pedido_dt int, dt_emissao datetime, nr_nf_origem varchar(6), ds_serie_origem varchar(3), cd_origem_dt int, cd_destino_dt int ) --–1. Declara CURSOR (DECLARE) declare item_cursor cursor for select cd_origem_dt, cd_destino_dt, cd_produto, qt_pedido from @TT_ITENS_DT --–2. Abre o CURSOR (OPEN) open item_cursor --–3. Alimenta variáveis com os dados do CURSOR (FETCH) declare @cd_origem_dt smallint, @cd_destino_dt smallint, @cd_produto char(13), @qt_pedido int fetch next from item_cursor into @cd_origem_dt, @cd_destino_dt, @cd_produto, @qt_pedido WHILE @@FETCH_STATUS = 0 begin --insert into #tmpRetItemSaldo --exec sgf_rec.dbo.p_mrec_consistir_saldo_dev_produto @cd_destino_dt,@cd_origem_dt,@cd_produto,@qt_pedido ---- INICIO LOOP SALDO --- DECLARE @Inicio INT, @final INT, @qt_saldo_nf INT, @qt_saldo_total INT, @qt_dif INT ------------------------------------------------------------------------------------------- --1.0 : Iniciando dados do Loop para aplicação da regra FIFO. ------------------------------------------------------------------------------------------- CREATE TABLE #tbTmpRetDev ( nr_identity int not null identity(1,1), --nr_pednf varchar(6), cd_produto char(13), qt_receb int, qt_dt int, qt_saldo int, qt_pedido int, dt_emissao datetime, nr_nf_origem varchar(6), ds_serie_origem varchar(3), cd_origem smallint, cd_destino smallint ) ------------------------------------------------------------------------------------------- --2.0 : Criação de temporaria para auxilio na validação de saldos e aplicação da regra FIFO ------------------------------------------------------------------------------------------- CREATE TABLE #Tb_receb_fifo ( nr_identity int not null identity(1,1), cd_origem smallint, cd_destino smallint, nr_nf varchar(6), ds_serie varchar(3), dt_emissao datetime, cd_produto char(13), qt_receb int, qt_saldo int, ) ------------------------------------------------------------------------------------------- --3.0 : Alimentando a TEMP com os dados de Recebimento do Produto com Saldo. ------------------------------------------------------------------------------------------- INSERT INTO #Tb_receb_fifo SELECT rec.cd_origem, rec.cd_destino, rec.nr_nf, rec.ds_serie, rec.dt_emissao, rec.cd_produto, rec.qt_receb, saldo = ISNULL(rec.qt_receb,0) - ISNULL(SUM(dev.qt_reserva_dev),0) FROM sgf_rec.dbo.vw_mrec_receb_transf rec (NOLOCK) LEFT JOIN sgf_fat.dbo.vw_mfat_dev_transf dev (nolock) ON rec.cd_origem = dev.cd_filial_ref AND rec.nr_nf = dev.nr_nf_ref AND rec.ds_serie = dev.ds_serie_ref AND rec.cd_produto = dev.cd_produto WHERE rec.cd_origem = @cd_destino_dt AND rec.cd_destino = @cd_origem_dt AND rec.cd_produto = @cd_produto GROUP BY rec.cd_origem, rec.cd_destino, rec.nr_nf, rec.ds_serie, rec.dt_emissao, rec.cd_produto, rec.qt_receb HAVING rec.qt_receb - ISNULL(SUM(dev.qt_reserva_dev),0) > 0 ORDER BY rec.dt_emissao ------------------------------------------------------------------------------------------- --4.0 : Iniciando dados do Loop para aplicação da regra FIFO. ------------------------------------------------------------------------------------------- SELECT @final = @@ROWCOUNT SELECT @Inicio = 1 SELECT @qt_saldo_total = 0 WHILE (@Inicio <= @final) BEGIN SELECT @qt_saldo_nf = qt_saldo FROM #Tb_receb_fifo WHERE nr_identity = @Inicio -------------------------------- --3.1 : Verifica o Saldo -------------------------------- IF (@qt_saldo_nf + @qt_saldo_total) >= @qt_pedido BEGIN ------------------------------------------------------------------------------------ --3.2 : Pegando total da diferenca para alimentar a tabela auxiliar de DEV. -- Alimenta a tabela de Devolução com as informações de Referência da Devolução -- Quando mais de uma NF referenciada ou NFs sem Saldos Totais. ------------------------------------------------------------------------------------ SELECT @qt_dif = @qt_pedido - @qt_saldo_total insert into #tbTmpRetDev SELECT cd_produto, qt_receb, @qt_dif, qt_receb - @qt_dif, @qt_pedido, GETDATE(), nr_nf, ds_serie, @cd_origem_dt, cd_origem FROM #Tb_receb_fifo WHERE nr_identity = @Inicio BREAK END ELSE BEGIN --------------------------------------------------- --3.3 : Alimenta contador e soma valores de saldo. --------------------------------------------------- INSERT INTO #tbTmpRetDev SELECT cd_produto, qt_receb, qt_saldo, 0, @qt_pedido, GETDATE(), nr_nf, ds_serie, @cd_origem_dt, cd_origem FROM #Tb_receb_fifo WHERE nr_identity = @Inicio SET @qt_saldo_total = @qt_saldo_total + @qt_saldo_nf END SET @Inicio = @Inicio + 1 END insert into #tmpRetItemSaldo Select cd_produto , nr_identity , qt_receb , qt_dt , qt_saldo , qt_pedido , dt_emissao , nr_nf_origem, ds_serie_origem, cd_origem , cd_destino from #tbTmpRetDev drop table #tbTmpRetDev drop table #Tb_receb_fifo ---FIM--- -- Pega proximo item do loop fetch next from item_cursor into @cd_origem_dt, @cd_destino_dt, @cd_produto, @qt_pedido end --–4. Fecha e desaloca o CURSOR (CLOSE e DEALLOCATE) close item_cursor deallocate item_cursor; select cd_produto ,nr_item ,qt_receb ,qt_dt ,qt_saldo_receb ,qt_pedido_dt ,nr_nf_origem ,ds_serie_origem ,dt_emissao ,cd_origem_dt ,cd_destino_dt from #tmpRetItemSaldo --select * from @TT_MFAT_DT_ITENS_RET_NF IF @@ROWCOUNT = 0 BEGIN SET @ds_msg_ret = 'Inconsistência na Pesquisa do Saldo de Devolução de Transf.' + ' ==> PROC: p_mfat_retorno_dt_item ==>' GOTO ERROR END drop table #tmpRetItemSaldo SET @fl_erro_ret = 1 Return END TRY BEGIN CATCH SET @ds_msg_ret = ' Inconsistência na Consulta de Saldo de Dev. de Transferência. ' + ' --> Procedure..: ' + ISNULL(ERROR_PROCEDURE(), '' ) + ' --> Linha Erro.: ' + CAST( ISNULL(ERROR_LINE(), '' ) AS VARCHAR) + ' --> Mensagem...: ' + ISNULL(ERROR_MESSAGE(), '' ) GOTO ERROR END CATCH ERROR: SET @fl_erro_ret = 0 RETURN go
- Marcado como Resposta Rafael Mitsunaka quarta-feira, 25 de novembro de 2015 18:44