Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

André Mailho

Dataset do reportViewer é gerado incorretamente, devido ao cursor da p

Recommended Posts

Ola, estou tentando montar um relatório usando o MicrosoftReportViewer (asp.net + sql, nada em code behind); ele sera preenchido por uma procedure.

O problema é que quando eu crio o dataset (arrastando a minha proc mesmo), ele nao retorna com todos os campos do select como deveria! Vem apenas escrito o campo "Column1" que nao existe em lugar nenhum do script.

 

Analisando eu percebi que o problema acontece dentro de um cursor que a proc utiliza. Sem o cursor o dataset é criado corretamente e o relatório tambem. Mas infelizmente

eu preciso desse cursor!!!!!!!!

 

Gostaria de ajuda para identificar o problema e então poder corrigi-lo. Estou a um dia inteiro sem saber oque fazer.

 

 

 

 

Obrigado desde ja.

(Não sei se o correto seria criar esse tópico no fórum de sql, bem acho que não).

Compartilhar este post


Link para o post
Compartilhar em outros sites

André,

 

Você está passando os parâmetros para sua procedure corretamente na hora da montagem para ela retorna o resultset corretamente para o Report View criar os dados corretamente?

Compartilhar este post


Link para o post
Compartilhar em outros sites

André,

 

Você pode colocar o trecho do código da procedure aqui para visualizar eu tenho varias procedure que utilizam cursor e não da problema algum. Deve ter algum GHOST no meio da procedure.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Esse é o cursor:

 


-- INICIO DO CURSOR



Declare	@Cd_proposta			Int					,
	@Cd_produto				Int					,
	@Contador	 			SmallInt			,
	@ContadorTitular 		SmallInt			,
	@ContadorConjuge 		SmallInt			,
	@ContadorFilhos 		SmallInt			,
	@Nm_apresentacao		varchar(60)			,
	@Nm_cobertura			Varchar(60)			,		 
	@Vl_beneficio			Varchar(15)			,
	@Vl_cobertura_titular	Varchar(15)			,
	@Vl_cobertura_conjuge	Varchar(15)			,
	@Vl_cobertura_filhos	Varchar(15)			,
	@Cd_pessoa_atendida		Varchar(10)			,
	@Nr_ordem_apresentacao	Int					,
	@Nome					Varchar(30)			,
	@Nm_sinal				Varchar(30)			,
	@Valor					Varchar(30)			,
	@Where					Varchar(500)		,
	@Nm_beneficiario		Varchar(50)			, 		 
	@Nm_parentesco			Varchar(20)			,		 
	@Pe_participacao		Varchar(10)			,
	@Tipo					Varchar(20)			,
	@Nm_tipo				Varchar(10)			,
	@Nm_obs_tickets			Varchar(255)		

declare	@Nm_processo_atu_cob varchar(5000)
declare	@Nm_processo_atu_ass varchar(5000)
declare	@Nm_processo_atu_ben varchar(5000)
declare	@Nm_processo_atu_cobrancas varchar(5000)

Declare cSeg Cursor For	
Select	Cd_administradora		,
			Cd_filial			,
			Cd_produto			,
			Cd_proposta
From	Segurados_certificadoAgregue
Open cSeg
Fetch Next From cSeg Into 
	@Cd_administradora	, 
	@Cd_filial			,
	@Cd_produto			, 
	@Cd_proposta


While @@Fetch_Status = 0
Begin
set	@Where	= 'Where Cd_administradora = ' + Cast(@Cd_administradora as Varchar(1)) + ' And Cd_filial = ' + Cast(@Cd_filial as Varchar(1)) + ' And Cd_produto = ' + Cast(@Cd_produto as Varchar(3)) +  ' And Cd_proposta = ' + Cast(@Cd_proposta as Varchar(10))

set	@Nm_processo_atu_cob = ''
set	@Nm_processo_atu_ass = ''
set	@Nm_processo_atu_ben = ''
set	@Nm_processo_atu_cobrancas = ''


--Seleciona as Cobrancas da proposta
declare	@Dt_vencto			datetime,
		@Nr_parcela			int
Declare cCobr Cursor For
	Select	Distinct top 12
		cob.Dt_vencto		,
		cob.Nr_parcela			
	From	Segurados_certificadoAgregue s (nolock)
	inner join @var_Cobranca cob  on
		s.Cd_administradora	= cob.Cd_administradora	and
		s.Cd_filial			= cob.Cd_filial			and
		s.Cd_ramo			= cob.Cd_ramo			and
		s.Cd_apolice		= cob.Cd_apolice		and
		s.Cd_convenio		= cob.Cd_convenio 		and
		s.Cd_instituidora   = cob.Cd_instituidora 
	Where	cob.Dt_cancelamento is null					and
		cob.Dt_inicio_vigencia 	>= s.Dt_inicio_vigencia	and
		cob.Dt_fim_vigencia		<= s.Dt_fim_vigencia	and
		s.Cd_administradora		= @Cd_administradora	and
		s.Cd_filial				= @Cd_filial			and
		s.Cd_produto			= @Cd_produto			and
		s.Cd_proposta			= @Cd_proposta		
	order by	cob.Dt_vencto, cob.Nr_parcela


Open cCobr
Fetch Next From cCobr Into
		@Dt_vencto		,
		@Nr_parcela

set 	@Contador = 1
While @@Fetch_Status = 0 
begin

	set	@Nm_processo_atu_cobrancas	= 'Update s Set Dt_vencto' + convert(varchar,@Contador) + ' = ''' +  convert(varchar(8),@Dt_vencto,3) + ''', Nr_parcela' + convert(varchar,@Contador) + '=' + convert(varchar,@Nr_parcela) +  ' From	Segurados_certificadoAgregue s ' 	+ @Where	
	exec ( @Nm_processo_atu_cobrancas )

	If @@Error <> 0 
	Begin
		Select 'Erro ao atualizar os dados ds cobranças. - ' + @Nm_processo_atu_cobrancas			
		Close cCobr
		DeAllocate cCobr
		Close cSeg
		DeAllocate cSeg
		Return
	End

	set @Contador = @Contador + 1

	Fetch Next From cCobr Into
		@Dt_vencto		,
		@Nr_parcela	
End
Close cCobr
DeAllocate cCobr


--======================================================================================================================


Declare cCob Cursor

For	Select 	cc.Nm_comercial,
			Nm_cobertura = case when cc.Cd_pessoa_atendida = 'C' then cc.Nm_comercial	+ '-Tipo inclusão conjuge' else cc.Nm_comercial	end	, 
			Vl_cobertura_titular	= sum( case when cc.Cd_pessoa_atendida = 'T' then pc.Vl_beneficio  - isNull(inc.Vl_beneficio, 0) else 0 end ),
			Vl_cobertura_conjuge	= sum( case when cc.Cd_pessoa_atendida = 'C' then pc.Vl_beneficio - isNull(inc.Vl_beneficio, 0)  else 0 end ),
			Vl_cobertura_filhos	= sum( case when cc.Cd_pessoa_atendida = 'F' then pc.Vl_beneficio - isNull(inc.Vl_beneficio, 0)  else 0 end ),
			Vl_beneficio		= Cast(Cast( isNull( (pc.Vl_beneficio - isNull(inc.Vl_beneficio, 0)) * (100.0 / 100.0), 0 ) as Decimal(15, 2)) as Varchar(15)),
			Cd_pessoa_atendida 	= Case 	When cc.Cd_pessoa_atendida = 'T' Then 'titular'
										When cc.Cd_pessoa_atendida = 'C' Then 'conjuge'
										When cc.Cd_pessoa_atendida = 'F' Then 'filhos' End,
			Nr_ordem_apresentacao	= Min(cc.Nr_ordem_apresentacao)
From	@var_Propostas p 
	Inner Join @var_Proposta_cobertura pc  On
		pc.Cd_administradora	= p.Cd_administradora		And
		pc.Cd_filial			= p.Cd_filial				And
		pc.Cd_produto			= p.Cd_produto				And
		pc.Cd_proposta			= p.Cd_proposta		

	Inner Join Cobertura_comercial cc (NoLock) On
		cc.Cd_administradora	= pc.Cd_administradora		And
		cc.Cd_plano			= pc.Cd_plano					And
		cc.Cd_produto			= pc.Cd_produto				And
		cc.Cd_cobertura_com	= pc.Cd_cobertura_com

	Left Outer Join @var_Proposta_cobertura inc  On
		inc.Cd_administradora	= p.Cd_administradora		And
		inc.Cd_filial			= p.Cd_filial				And
		inc.Cd_produto			= p.Cd_produto				And
		inc.Cd_proposta		= p.Cd_proposta					And
		inc.Cd_cobertura_com	= cc.Cd_cobertura_inclusa

	Inner Join Cobertura c (NoLock) On
		c.Cd_cobertura		= cc.Cd_cobertura

Where	p.Cd_administradora	= @Cd_administradora			And
		p.Cd_filial			= @Cd_filial 					And
		p.Cd_produto		= @Cd_produto					And
		p.Cd_proposta		= @Cd_proposta					And
		cc.Cd_cobertura		Not In(13, 12, 62, 63, 90, 14, 9)		And  /*	-- Capitalizacao(13,12,90,62,63) / 
																			-- Auxílio Educacao(12,13)*/ 
		isNull(pc.Dv_status, 'E')	= 'E'
Group By	cc.Nm_comercial		,
			cc.Nm_comercial		,
			Cd_pessoa_atendida	,
			pc.Vl_beneficio		,
			inc.Vl_beneficio
Order By	Cd_pessoa_atendida DESC, 
			cc.Nr_ordem_apresentacao



Open cCob
Fetch Next From cCob Into
	@Nm_apresentacao		,
	@Nm_cobertura 			, 
	@Vl_cobertura_titular	,
	@Vl_cobertura_conjuge	,
	@Vl_cobertura_filhos	,
	@Vl_beneficio			,
	@Cd_pessoa_atendida 	,
	@Nr_ordem_apresentacao


set 	@ContadorTitular = 1
	set	@ContadorConjuge = 1
	set	@ContadorFilhos = 1
--
While @@Fetch_Status = 0
Begin
	if @Cd_pessoa_atendida = 'titular'
		Select	@Nome	 = 'Nm_cob_' + @Cd_pessoa_atendida + Cast(@ContadorTitular as Varchar(1)),
			@Nm_sinal= 'Nm_sinal_' + @Cd_pessoa_atendida + Cast(@ContadorTitular as Varchar(1)),
			@Valor	 = 'Vl_capital_cob_' + @Cd_pessoa_atendida + Cast(@ContadorTitular as Varchar(1)),
			@Nm_tipo = 'Titular'

	else if @Cd_pessoa_atendida = 'conjuge'
		Select	@Nome	 = 'Nm_cob_' + @Cd_pessoa_atendida + Cast(@ContadorConjuge as Varchar(1)),
			@Nm_sinal= 'Nm_sinal_' + @Cd_pessoa_atendida + Cast(@ContadorConjuge as Varchar(1)),
			@Valor	 = 'Vl_capital_cob_' + @Cd_pessoa_atendida + Cast(@ContadorConjuge as Varchar(1)),
			@Nm_tipo = 'Cônjuge'
	else if @Cd_pessoa_atendida = 'filhos'
		Select	@Nome	 = 'Nm_cob_' + @Cd_pessoa_atendida + Cast(@ContadorFilhos as Varchar(1)),
			@Nm_sinal= 'Nm_sinal_' + @Cd_pessoa_atendida + Cast(@ContadorFilhos as Varchar(1)),
			@Valor	 = 'Vl_capital_cob_' + @Cd_pessoa_atendida + Cast(@ContadorFilhos as Varchar(1)),
			@Nm_tipo = 'Filhos'
	--
	set	@Nm_processo_atu_cob	= 'Update s Set ' + @Nome + ' = ''' + @Nm_cobertura + ''' , ' + @Valor + ' = ' + @Vl_beneficio + ' , ' + @Nm_sinal + ' = ''R$'' , ' +	' Ds_' + @Cd_pessoa_atendida + ' = ''' + @Nm_tipo + ''' From	Segurados_certificadoAgregue s ' 	+ @Where

	EXEC( @Nm_processo_atu_cob )
	If @@Error <> 0 
	 Begin
		Select 'Erro ao atualizar as coberturas. - ' + @Nm_processo_atu_cob			
		Close cCob
		DeAllocate cCob
		Close cSeg
		DeAllocate cSeg
		Return
	 End
	--
	if @Cd_pessoa_atendida 			= 'titular'
		set	@ContadorTitular	= @ContadorTitular + 1
	else if @Cd_pessoa_atendida 	= 'conjuge'
		set	@ContadorConjuge	= @ContadorConjuge + 1
	else if @Cd_pessoa_atendida 	= 'filhos'
		set	@ContadorFilhos		= @ContadorFilhos + 1
	--

	Fetch Next From cCob Into
		@Nm_apresentacao		,
		@Nm_cobertura 			, 
		@Vl_cobertura_titular	,
		@Vl_cobertura_conjuge	,
		@Vl_cobertura_filhos	,
		@Vl_beneficio			,
		@Cd_pessoa_atendida 	,
		@Nr_ordem_apresentacao

End

Close cCob
DeAllocate cCob


-- FIM DO CURSOR







Update s
Set 	Vl_assistencia	= a.Vl_beneficio
From Segurados_certificadoAgregue s (NOLOCK)
JOIN Proposta_assistencia pa (NoLock) On
	s.Cd_administradora		=	pa.Cd_administradora 	And
	s.Cd_filial				=	pa.Cd_filial			And
	s.Cd_produto			=	pa.Cd_produto			And
	s.Cd_proposta			=	pa.Cd_proposta
inner join Assistencia a (nolock) On
	a.Cd_tipo_assistencia	= pa.Cd_tipo_assistencia	And
	a.Cd_padrao_assistencia	= pa.Cd_padrao_assistencia
Where	pa.Cd_tipo_assistencia = 1						And
		pa.Cd_produto		 In(260, 259, 258, 257) 	And
		pa.Dt_cancelamento	is Null








-- INICIO DO CURSOR


Declare cBen Cursor


For	Select	Replace(Nm_beneficiario,'''','') as Nm_beneficiario, Nm_parentesco, Cast(Pe_participacao as Varchar(10)) + '%' Pe_participacao
	From	Proposta_beneficiario pb (NoLock)
	Inner Join Tabela_parentesco t On
		t.Cd_parentesco		= pb.Dv_parentesco
	Where	pb.Cd_administradora	= @Cd_administradora
	And	pb.Cd_filial				= @Cd_filial
	And	pb.Cd_produto				= @Cd_produto
	And	pb.Cd_proposta				= @Cd_proposta

Open cBen
Fetch Next From cBen Into
		@Nm_beneficiario, 
		@Nm_parentesco	, 
		@Pe_participacao
set	@Contador = 1

While (@@Fetch_Status = 0 And @Contador <= 7)
 Begin
	Select	@Nome	= 'Nm_benef' + Cast(@Contador as Varchar(1)),
		@Tipo	= 'Nm_parentesco' + Cast(@Contador as Varchar(1)),
		@Valor	= 'Pe_participacao' + Cast(@Contador as Varchar(1))

	select	@Nm_processo_atu_ben = '	Update	s 
						Set ' +	@Nome +  ' = ''' + @Nm_beneficiario + ''', ' +
						        @Tipo +  ' = ''' + @Nm_parentesco + ''', ' +	
							@Valor + ' = ''' + @Pe_participacao + '''
						From	Segurados_certificadoAgregue s ' + @Where
	EXEC(@Nm_processo_atu_ben)
	If @@Error <> 0 
	 Begin
		Select 'Erro ao atualizar os beneficiários. - ' + @Nm_processo_atu_ben
		Close cBen
		DeAllocate cBen
		Close cSeg
		DeAllocate cSeg
		Return
	 End

	Fetch Next From cBen Into
			@Nm_beneficiario, 
			@Nm_parentesco	, 
			@Pe_participacao
	set @Contador = @Contador + 1
 End
Close cBen
DeAllocate cBen


If @Contador <= 4
Begin
	set	@Nome	= 'Nm_benef' + Cast(@Contador as Varchar(1))
	--

	declare @Where2 varchar(8000)
	set	@Where2	= 'Where Cd_administradora = ' + Cast(@Cd_administradora as Varchar(1)) + ' And Cd_filial = ' + Cast(@Cd_filial as Varchar(1)) + ' And Cd_produto = ' + Cast(@Cd_produto as Varchar(3)) +  ' And Cd_proposta = ' + Cast(@Cd_proposta as Varchar(10)) + 'And	s.Nm_obs_beneficiario is not null'


	EXEC('	Update	s 
		Set ' +	@Nome +  ' = s.Nm_obs_beneficiario
		From	Segurados_certificadoAgregue s ' + @Where2 )
 End

Fetch Next From cSeg Into 
	@Cd_administradora	, 
	@Cd_filial			,
	@Cd_produto			, 
	@Cd_proposta
End
Close cSeg
DeAllocate cSeg



-- FIM DO CURSOR

Compartilhar este post


Link para o post
Compartilhar em outros sites

A proc é um pouco grande (1500 linhas), sem o cursor todos os campos do select sao retornados corretamente!

O ultimo select é esse:

 


SELECT 
		Cd_administradora									,
		Cd_produto											,
		Nm_segurado											,
		Ds_CPF												,
		convert(varchar(10),Dt_nascimento,103)Dt_nascimento	,
		convert(varchar(10),Dt_inicio,103)Dt_inicio 					,
		convert(varchar(10),Dt_inicio_vigencia,103)Dt_inicio_vigencia	,
		convert(varchar(10),Dt_fim_vigencia,103)Dt_fim_vigencia			,
		Nr_apolice											,
		Nr_certificado										,
		Nm_obs_beneficiario									,
		Dv_IEA												,
		Nm_cob_titular1										,
		case when Vl_capital_cob_titular1 <> '0,00'	then Vl_capital_cob_titular1 else '' end	Vl_capital_cob_titular1	,
		case when Vl_capital_cob_conjuge1 <> '0,00'	then Vl_capital_cob_conjuge1 else '' end	Vl_capital_cob_conjuge1	,
		case when Vl_capital_cob_filhos1 <> '0,00'	then Vl_capital_cob_filhos1 else '' end	Vl_capital_cob_filhos1	,								
		Nm_cob_titular2										,
		case when Vl_capital_cob_titular2 <> '0,00'	then Vl_capital_cob_titular2 else '' end	Vl_capital_cob_titular2	,
		case when Vl_capital_cob_conjuge2 <> '0,00'	then Vl_capital_cob_conjuge2 else '' end	Vl_capital_cob_conjuge2	,
		case when Vl_capital_cob_filhos2 <> '0,00'	then Vl_capital_cob_filhos2 else '' end	Vl_capital_cob_filhos2	,
		Nm_cob_titular3										,
		case when Vl_capital_cob_titular3 <> '0,00'	then Vl_capital_cob_titular3 else '' end	Vl_capital_cob_titular3	,
		case when Vl_capital_cob_conjuge3 <> '0,00'	then Vl_capital_cob_conjuge3 else '' end	Vl_capital_cob_conjuge3	,
		case when Vl_capital_cob_filhos3 <> '0,00'	then Vl_capital_cob_filhos3 else '' end	Vl_capital_cob_filhos3	,
		Nm_cob_titular4										,
		case when Vl_capital_cob_titular4 <> '0,00'	then Vl_capital_cob_titular4 else '' end	Vl_capital_cob_titular4	,
		case when Vl_capital_cob_conjuge4 <> '0,00'	then Vl_capital_cob_conjuge4 else '' end	Vl_capital_cob_conjuge4	,
		case when Vl_capital_cob_filhos4 <> '0,00'	then Vl_capital_cob_filhos4 else '' end	Vl_capital_cob_filhos4	,
		Nm_benef1											,
		Nm_parentesco1										,
		Pe_participacao1									,
		Nm_benef2											,
		Nm_parentesco2										,
		Pe_participacao2									,
		Nm_benef3											,
		Nm_parentesco3										,
		Pe_participacao3									,
		Nm_benef4											,
		Nm_parentesco4										,
		Pe_participacao4									,
		Nm_benef5											,
		Nm_parentesco5										,
		Pe_participacao5									,
		Nm_benef6											,
		Nm_parentesco6										,
		Pe_participacao6									,
		Nm_benef7											,
		Nm_parentesco7										,
		Pe_participacao7									,
		Nr_sorte											,
		Periodicidade_sorteio		=	'4 ao mês'			,
		Vl_sorteio					=	Cast('5000' as numeric)							,
		Dt_concorrendo_desde		=	convert(varchar(10),Dt_concorrendo_desde,103)	,
		Nr_processo_susep			=	Susep				,
		Produto												,
		Vl_premio_bruto				=	PremioBruto			,
		Vl_premio_liquido			=	PremioLiquido		,
		Vl_IOF						=	ValorIOF			,
		Periodicidade				=	Nm_periodicidade	,		
		Limite_assistencia			=	Vl_assistencia		,
		Dt_impressao_certificado							,
		Nm_tipoCertificado
	FROM CertificadoAgregue 
	WHERE  Dt_impressao_certificado IS NULL
	Order By
	Nm_sub_estipulante,
	Nm_segurado
END


Compartilhar este post


Link para o post
Compartilhar em outros sites

André,

 

Eu dei uma analisada no CURSOR basicamente ele faz update em tabelas.

 

A sua procedure tem parametro de entrada? Eu costumo associar a procedure a um parametro de entrada que de pelo menos 1 resultado valido para o Report preencher os dados.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Sim possui, sendo 2 hardcoded.

Debugando aqui eu percebi que o erro acontece devido a esse bloco do codigo:

 

 

If @@Error <> 0 
Begin
Select 'Erro ao atualizar os dados ds cobranças. - ' + @Nm_processo_atu_cobrancas
Close cCobr
DeAllocate cCobr
Close cSeg
DeAllocate cSeg
Return
End

 

Existem 3 blocos semelhantes no cursor! comentei eles e o dataset foi criado corretamente.

Compartilhar este post


Link para o post
Compartilhar em outros sites

André,

 

Deu erro no processamento da sua procedure revise a logica nela e execute ele fora da aplicação passando os parametros hardcode.

Compartilhar este post


Link para o post
Compartilhar em outros sites

O erro acontece especificamente nesta linha:

 

Select 'Erro ao atualizar os dados ds cobranças. - ' + @Nm_processo_atu_cobrancas

 

Aonde eu exibo uma mensagem sobre o erro.

Alguma idéia de como eu poderia fazer diferente Daniel?

Compartilhar este post


Link para o post
Compartilhar em outros sites

André,

 

O erro está na procedure tem que analisar o erro não é ai e sim no update anterior ao erro.

Compartilhar este post


Link para o post
Compartilhar em outros sites

set @Nm_processo_atu_cobrancas = 'Update s Set Dt_vencto' + convert(varchar,@Contador) + ' = ''' + convert(varchar(8),@Dt_vencto,3) + ''', Nr_parcela' + convert(varchar,@Contador) + '=' + convert(varchar,@Nr_parcela) + ' From Segurados_certificadoAgregue s ' + @Where

exec ( @Nm_processo_atu_cobrancas )

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.