Obter o nome do campo pelo loop no bloco

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

Pessoal, estou tentando sem sucesso o seguinte:
Efetuar um loop em um bloco no Forms 6i e em seguida, dentro do loop descobrir o nome do campo por onde ele está passando.
Alguém tem alguma luz sobre esta questão?

P.S.: já fiz isso dezenas de vezes em outras linguagens, mas no PL/SQL estou apanhando.
gfkauer
Rank: DBA Sênior
Rank: DBA Sênior
Mensagens: 389
Registrado em: Ter, 27 Jul 2010 1:34 pm
Localização: Sapiranga - RS
Contato:
Quem falou que programar era fácil??

Quanto mais dificil for a implementação mais valorizado seu trabalho será!

Acessem: www.gfkauer.com.br

Posso estar falando besteira, mas o campo pelo qual ele passa é o primeiro item navegavel do bloco.
SergioLBJr
Rank: Oracle Guru
Rank: Oracle Guru
Mensagens: 448
Registrado em: Ter, 16 Jun 2009 3:07 pm
Localização: Parobé - RS
Sérgio Luiz Bonemberger Junior
Programador Junior
Parobé RS

[]s

A não ser que você fique forçando que o forms troque de item ele vai ser o primeiro campo navegavel.

Pode pegar ele com isso.

Selecionar tudo

:system.cursor_item
pyro
Rank: DBA Sênior
Rank: DBA Sênior
Mensagens: 323
Registrado em: Qui, 21 Set 2006 10:21 am
Localização: Barala - TT

Então, agora acho que está quase lá, só faltou eu explicar um detalhe, esse Form é tabular e tenho cerca de 20 campos e apenas um registro.

A dica do :system.cursor_item só fica jogando para o primeiro campo e só passa por ele.

É assim mesmo que funciona? Pois eu preciso percorrer todos os campos.

Vlw. :-o
SergioLBJr
Rank: Oracle Guru
Rank: Oracle Guru
Mensagens: 448
Registrado em: Ter, 16 Jun 2009 3:07 pm
Localização: Parobé - RS
Sérgio Luiz Bonemberger Junior
Programador Junior
Parobé RS

[]s

Cara agora me confudi.

Bloco tabular com apenas um registro????

Qual a sua necessidade de passar por todos os campos ??
pyro
Rank: DBA Sênior
Rank: DBA Sênior
Mensagens: 323
Registrado em: Qui, 21 Set 2006 10:21 am
Localização: Barala - TT

É que preciso checar se todos os campos estão preenchidos, e não quero ficar fazendo um monte de IF, pois além de "feio" e demorado creio que exista uma forma mais elegante de se fazer isso.

Em formulários Web já implementei essa lógica com JavaScript e em alguns sistemas utilizando Java + Swing também já fiz.

Só me enrolei no PL mesmo.
gfkauer
Rank: DBA Sênior
Rank: DBA Sênior
Mensagens: 389
Registrado em: Ter, 27 Jul 2010 1:34 pm
Localização: Sapiranga - RS
Contato:
Quem falou que programar era fácil??

Quanto mais dificil for a implementação mais valorizado seu trabalho será!

Acessem: www.gfkauer.com.br

você tera que fazer algo assim:

Selecionar tudo

Begin
  go_block('xx');
  If name_in(:System.cursor_item) Is Null Then
    sdhigsdfhg.s
  End If;
  next_item;
End;
agora se te atendera eu já não sei...
SergioLBJr
Rank: Oracle Guru
Rank: Oracle Guru
Mensagens: 448
Registrado em: Ter, 16 Jun 2009 3:07 pm
Localização: Parobé - RS
Sérgio Luiz Bonemberger Junior
Programador Junior
Parobé RS

[]s

Cara se os campos não podem ser nulos tu pode setar o required deles pra true que resolve teu problema na origem, pois o usuário tera de informar eles.

Se não quer oribrigar os usuários a informarem na hora da digitação e só depois no commit tu pode fazer algo assim

Selecionar tudo

set_item_property('nome_bloco.nome_item', required,property_true);
set_item_property('nome_bloco.nome_item, item_is_valid,property_false);
go_block(nome_bloco);
validate(record_scope);
Mas eu acredito que o melhor mesmo é fazer um grande if se não queres setar os campos como required.

Selecionar tudo

if :nome_bloco.nome_campo1 is null or
   :nome_bloco.nome_campo2 is null then
  message('Há campos obrigatórios que não foram preenchidos !');
  pause;
end if;
Volto a frizar que o melhor a fazer é obrigar que o usuário informe os campos durante a digitação, de maneira que essa preucupação com capos obrigatórios não informados fique por conta do forms.
pyro
Rank: DBA Sênior
Rank: DBA Sênior
Mensagens: 323
Registrado em: Qui, 21 Set 2006 10:21 am
Localização: Barala - TT

É que na verdade eu queria fazer algo mais direto tipo assim:

Selecionar tudo

message_erro := 'O campo: ';

loop varre_bloco_dados
 if varre_bloco_dados.campo_corrente is null then
  message(message_erro || varre_bloco_dados.campo_corrente.hint);
 end if;
end loop;
Eu sei que posso obrigar o usuário a digitar em outros locais, porém se eu conseguir definir uma lógica como está de forma genérica eu conseguiria aplica-la em outros pontos, tipo, hoje é para campos vazios, amanhã é só inverter a condição do if que tenho o mesmo validador com outro parâmetro, com uma mensagem de erro padrão, simples e funcional.
É como já disse no início, já fiz coisas assim e para o meu uso funcionou muito bem em outras linguagens, só tenho dúvida em como fazer isso no Forms.
SergioLBJr
Rank: Oracle Guru
Rank: Oracle Guru
Mensagens: 448
Registrado em: Ter, 16 Jun 2009 3:07 pm
Localização: Parobé - RS
Sérgio Luiz Bonemberger Junior
Programador Junior
Parobé RS

[]s

Agora entendi.

Cara não cheguei a testar mas acredito que algo assim deva funcionar.

Selecionar tudo

declare
   v_primeiro_campo  varchar2(200);
begin
   go_block('nome_bloco');
   v_primeiro_campo := :system.cursor_item;
   if name_in(v_primeiro_campo) is null then
      message('O campo '||v_primeiro_campo||' não foi informado !');
      pause;
   end if;
   
   next_item;
   loop
      if name_in(:system.cursor_record) is null then
         message('O campo '||v_primeiro_campo||' não foi informado !');
         pause;
      end if;

      if :system.cursor_item = v_primeiro_campo then
         exit;
      end if;

      next_item;
   end loop;
end;
Cara... não cheguei a testar isso, só sai digitando aí, mas acredito que é + ou - o caminho pro que tu quer.

Posta aí se deu certo dpois
SergioLBJr
Rank: Oracle Guru
Rank: Oracle Guru
Mensagens: 448
Registrado em: Ter, 16 Jun 2009 3:07 pm
Localização: Parobé - RS
Sérgio Luiz Bonemberger Junior
Programador Junior
Parobé RS

[]s

Só uma coisa q percebi, a segunda mensagem ta errada, substitui o v_primeiro_campo dela por :system.cursor_record
Avatar do usuário
gpilger
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 29
Registrado em: Qua, 21 Abr 2010 3:34 pm
Localização: Novo Hamburgo - RS
Gilson Pilger
"Por não saber que erra impossível, ele foi lá e fez" autor desconhecido

Bom dia pessoal,

Neste caso eu setaria o Required para YES do item conforme sugerido pelo Sérgio.

De qualquer forma, da para fazer sim da forma como sugerida no post. Vejam abaixo como eu faria...

Selecionar tudo

BEGIN	
	GO_BLOCK('BLOCO');
	LOOP
		FIRST_RECORD;
		
    IF :BLOCO.CAMPO1 IS NULL THEN
    	MESSAGE('Campo 1 deve ser informado.');
    ELSIF :BLOCO.CAMPO2 IS NULL THEN
    	MESSAGE('Campo 2 deve ser informado.');
		END IF;
		
		IF :SYSTEM.LAST_RECORD = 'TRUE' THEN
		  EXIT;
		END IF;
		
		NULL;
	END LOOP;
END;
Vejam que vou para o bloco, depois para o primeiro registro e dou o loop... no meu loop checo quantos campo forem necessários. Dai quando chegar no ultimo registro ele cai fora do loop.

Simples assim.

Boa sorte ai. Abs
Responder
  • Informação
  • Quem está online

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