Problema estranho em laço for.

Dicas do Oracle Forms Builder - Blocos, Itens, LOV, Canvas, Triggers, comandos, PLL, d2kwutil, FMB, Alert, menus, etc
Responder
pyro
Rank: DBA Sênior
Rank: DBA Sênior
Mensagens: 323
Registrado em: Qui, 21 Set 2006 10:21 am
Localização: Barala - TT

Estou utilizando o form 6i e tenho um código assim no when-button-pressed:

Selecionar tudo

declare
cursor cursor1 is
 select...

codigo number;
begin
 codigo := 0;

 for vcursor in cursor1 loop
  if codigo = vcursor.codigo then
   várias açoes aqui.
  end if;
  if codigo <> vcursor.codigo then
   várias açoes aqui.
  end if;

  codigo := vcursor.codigo;
 end loop;
end;
Esse código é um resumo, explicando o problema:
A primeira iteração do laço logicamente entra no if da diferença, depois do processamento ele poderia entrar no if da igualdade ou diferença dependendo do valor do código anterior que alimentei a variável código (as veses o código é igual de uma iteração anterior).
Porém estou vendo que depois da terceira iteração se o codigo for diferente ele não entra no if da diferença.
Presumo que eu tenho errado de alguma forma na sintaxe, alguém pode dar alguma ajuda?
Trevisolli
Moderador
Moderador
Mensagens: 2016
Registrado em: Qua, 12 Jan 2005 3:25 pm
Localização: Araraquara - SP
Abraço,

Trevisolli
OCA Oracle PL/SQL Developer Certified Associate
OCP Oracle Forms Developer Certified Professional
Araraquara-SP

Brother,

Não sei se pode ser isto mas, vai a dica:

A tua variável codigo tem o mesmo nome do campo que virá no teu loop.
Tente alterar tua variável para v_codigo por exemplo e faça um teste.

Outra coisa, pode utilizar um ELSE ao invés do if da diferença.
Qualquer coisa, manda ai.
pyro
Rank: DBA Sênior
Rank: DBA Sênior
Mensagens: 323
Registrado em: Qui, 21 Set 2006 10:21 am
Localização: Barala - TT

Cara analisando aqui após a sua resposta descobri o problema, eu tenho o determinado trecho no código:

Selecionar tudo

insert into (bla, bla, bla)
commit_form;
Nessa rotina eu vou fazer várias vezes esse insert into em uma tabela que não está no bloco de dados desse form, esse commit está gerando o erro e atrapalhando todo o meu processo.
você sabe alguma forma, pois se eu deixar sem o commit os dados não são gravados na tabela, de resolver isso?
Trevisolli
Moderador
Moderador
Mensagens: 2016
Registrado em: Qua, 12 Jan 2005 3:25 pm
Localização: Araraquara - SP
Abraço,

Trevisolli
OCA Oracle PL/SQL Developer Certified Associate
OCP Oracle Forms Developer Certified Professional
Araraquara-SP

Brother, seguinte:

1) Este commit_form está dentro do loop, ou, depois do teu end loop?
2) Você poderia estar nos passando o erro?
pyro
Rank: DBA Sênior
Rank: DBA Sênior
Mensagens: 323
Registrado em: Qui, 21 Set 2006 10:21 am
Localização: Barala - TT

Ele está dentro do laço for, pois ele executa determinadas ações e faz o insert into e commit, depois cai no laço de novo e pode ser que seja dado outro insert into e assim por diante.

O erro que acusa é:

Selecionar tudo

Dados não encontrados
Trevisolli
Moderador
Moderador
Mensagens: 2016
Registrado em: Qua, 12 Jan 2005 3:25 pm
Localização: Araraquara - SP
Abraço,

Trevisolli
OCA Oracle PL/SQL Developer Certified Associate
OCP Oracle Forms Developer Certified Professional
Araraquara-SP

Você não pode dar o commit após o loop?
Outra coisa, tem como mandar o código pra gente analisar?
pyro
Rank: DBA Sênior
Rank: DBA Sênior
Mensagens: 323
Registrado em: Qui, 21 Set 2006 10:21 am
Localização: Barala - TT

Olha vou procurar detalhar o máximo o que eu estou fazendo aqui:
Tenho um forms com 2 blocos de dados:
- bloco1 não é de uma tabela;
- bloco2 é uma tabela.
- É um canvas com 2 abas, uma para cada bloco.

Quando clico em um button do bloco 1 inicio um processo para gerar arquivos textos, como o código abaixo:

Selecionar tudo

declare
cursor cursor1 is
 select...

cursor cursor2 is
 select...

cursor cursor3 is

arq      text_io.file_type;
codigo number;
nome  varchar2(400);

begin
 codigo := 0;
 nome := get_file_name('c:\', 'texto.sin', 'Arquivos (*.trs)|*.trs|', null, SAVE_FILE);
 arq := text_io.fopen(nome, 'w');

 for vcursor in cursor1 loop
  if codigo = vcursor.codigo then
   várias açoes aqui.
  end if;
  if codigo <> vcursor.codigo then
   for xcursor in cursor2 loop
     text_io -- grava linhas com put_file no arquivo
     for xcursor2 in cursor3 loop
       text_io -- grava linhas com put_file no arquivo
     end loop;
     insert into -- faço o insert nesse ponto
   end loop;
  end if;

  codigo := vcursor.codigo;
 end loop;
 commit_form;
end; 
Como o código é muito grande resumi aqui o que ele faz, se quiser posso mandar no seu e-mail ele por completo, porém descobri que retirando o commi_form o erro ocorreu exatamente no momento do insert into, então creio que ele seja o problema, e estava vendo aqui esse insert é feito na tabela referenciada no bloco2 será esse o problema?
Responder
  • Informação
  • Quem está online

    Usuários navegando neste fórum: Nenhum usuário registrado e 8 visitantes