Ir para conteúdo

Arquivado

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

Luciana1

A tabela só atualiza quando rodo 2 vezes o mesmo cursor

Recommended Posts

Colegas,O seguinte problema tem ocorrido com alguma frequencia: rodo um cursor para atualizar dados de uma tabela, mas a tabela tabela não atualiza, aí rodo novamente este cursor, aí sim os dados atualizam.Ou seja, para atualizar tenho que fazer o mesmo processo 2 vezes.Por que isto ocorre?Obrigada,Luciana

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá Luciana,cruel isto hein, você pode postar uma parte do código para verificarmosT+

Compartilhar este post


Link para o post
Compartilhar em outros sites

Obrigada.Segue a Procedure com o cursor:CREATE procedure atualiza_cobranca_CEFas declare @n_numero char(20), @vl_pgto money, @dt_liquidacao datetime, @ano_cob smallint, @mes_cob tinyint, @tp_cob tinyint, @cd_empresa_cob int, @nr_sequencia tinyint, @vl_ant money, @achou tinyint ---abre o cursor declare le_recbanco cursor for select n_numero, valorCreditado, dataCredito from entcobrec where status_proc='L' open le_recbanco ---passa os dados para as variaveis fetch le_recbanco into @n_numero, @vl_pgto, @dt_liquidacao while @@fetch_status = 0 begin select @nr_banco= 0 select @achou=0 select @ano_cob=0 select @mes_cob=0 select @tp_cob= 0 select @cd_empresa_cob=0 select @nr_sequencia=0 select @vl_ant = 0 if exists(select * from entcobranca where n_numero=@n_numero) begin select @ano_cob = (select ano_cob from entcobranca where n_numero=@n_numero) select @mes_cob = (select mes_cob from entcobranca where n_numero=@n_numero) select @tp_cob = (select tp_cob from entcobranca where n_numero=@n_numero) select @cd_empresa_cob = (select cd_empresa_cob from entcobranca where n_numero=@n_numero) select @nr_sequencia = (select nr_sequencia_cob from entcobranca where n_numero=@n_numero) ---esta variavel @vl_ant permite que eu possa fazer um entrada no entcobbco ---(registro de toais do banco) select @vl_ant = (select vl_pgto from entcobranca where n_numero=@n_numero) ---inicia uma transação begin transaction update entcobranca set cd_bco_cob=@nr_banco, dt_pgto=@dt_liquidacao, vl_pgto=@vl_pgto, local_pgto='B', status='P' where rtrim(n_numero) = rtrim(@n_numero) ---esta variavel @achou=1 indicará que houve um pagamento select @achou=1 end ---atualiza registro no entcobbco que permite saber o total ---de titulos e valores recebidos if @achou=1 begin if (@vl_ant >0 ) begin update entcobbco set qtde_tit_cob = ((qtde_tit_cob + 1) - 1), vlr_tot = ((vlr_tot - @vl_ant) + @vl_pgto) where banco_cob= @nr_banco and ano_cob= @ano_cob and mes_cob= @mes_cob and tp_cob= @tp_cob end else begin update entcobbco set qtde_tit_cob = ((qtde_tit_cob + 1)), vlr_tot = ((vlr_tot + @vl_pgto)) where banco_cob= @nr_banco and ano_cob= @ano_cob and mes_cob= @mes_cob and tp_cob= @tp_cob end end ---muda o status_proc do registro no entcobrec de lido 'L' para 'P' pago if @achou=1 update entcobrec set status_proc='P' where n_numero = @n_numero fetch next from le_recbanco into @n_numero, @vl_pgto, @dt_liquidacao end ---efetiva a transação commit transaction close le_recbancodeallocate le_recbanco

Compartilhar este post


Link para o post
Compartilhar em outros sites

tipo esse begin transaction naum pode ser colocado antes do inicio do loop, ou colocar o commit transaction dentro do looptenta colocar no inicio do loop uns print pra você acompanhar o que ta acontecendo

Compartilhar este post


Link para o post
Compartilhar em outros sites

realmente ele não está antes do loop, ele está dentro do loop, cada vez que passa no loop da um begin transaction e o commit transaction esta fora do loop, no final só vai ser executado só um commit... então seria legal colocar esse commit pra dentro do loop, ou então deixar ele ai, e colocar o begin transaction fora do loop.t++

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.