Manter foco no item quando no_data_found for verdadeiro

Dicas do Oracle Forms Builder - Blocos, Itens, LOV, Canvas, Triggers, comandos, PLL, d2kwutil, FMB, Alert, menus, etc
Responder
everthon
Rank: Estagiário Sênior
Rank: Estagiário Sênior
Mensagens: 14
Registrado em: Qua, 18 Jan 2012 2:43 pm
att,

Everthon Souza
Em Deus, posso todas as coisas!

Boa noite amigos,

Pesquisei sobre minha dúvida, e como não encontrei resposta, resolvi abrir um tópico.
Sou funcional oracle, e como precisei iniciar a pouco tempo com PL/SQL e FORMs, ainda tenho dúvidas, e acredito que possam me ajudar.

Meu cenário é bem simples. Tenho um bloco contendo uma validação em uma tabela de clientes. Se o item destinado para o código estiver nulo, eu não consigo passar para o próximo item, até aí tudo perfeito.
Meu é problema é quando insiro um código que não existe no banco, mesmo não existindo, eu consigo continuar preenchendo as demais informações.

Estou utilizando hoje uma validação simples quando insiro o código.

Usando a trigger WHEN-VALIDATE-ITEM

Selecionar tudo

SELECT CLI_NOME 
INTO :NOME_CLI
FROM CLIENTE
WHERE CLI_CODIGO = :VEND_NF_CODCLI;
       exception
	when no_data_found then
		 message('Cliente não encontrado!');
Gostaria de saber como faço para manter o foco no item :VEND_NF_CODCLI em caso de verdadeira a instrução NO_DATA_FOUND

Desde já, desculpas pela simples dúvida, e muito obrigado.
priajf
Rank: DBA Pleno
Rank: DBA Pleno
Mensagens: 297
Registrado em: Ter, 21 Dez 2010 8:45 am
Localização: Florianopolis

Acho que se você utilizar o

go_item('VEND_NF_CODCLI ');
POrém não lembro se funciona no when_validate_item.
AI então você tenha que fazer um
id_timer := create_timer('NEW',1,no_repeat);
e abrir a trigger when-timer-expired no principal....
e colocar o go_item nessa trigger...
Não sei que você conseguiu entender. Mais vai um ex:

Selecionar tudo

SELECT CLI_NOME 
INTO :NOME_CLI
FROM CLIENTE
WHERE CLI_CODIGO = :VEND_NF_CODCLI;
       exception
   when no_data_found then
       message('Cliente não encontrado!');
     id_timer := create_timer('ERRO',1,no_repeat); 

agora no
when-timer-expired

Selecionar tudo

if get_application_property(timer_name) = 'ERRO' then
go_item('VEND_NF_CODCLI ');
end if;
Acho que funciona....
everthon
Rank: Estagiário Sênior
Rank: Estagiário Sênior
Mensagens: 14
Registrado em: Qua, 18 Jan 2012 2:43 pm
att,

Everthon Souza
Em Deus, posso todas as coisas!

Boa tarde priajf, obrigado pela resposta.

De fato o go_item não funciona no when_validate_item, eu já havia tentado desta maneira.

E fazendo conforme sua idéia, funcionou quase que perfeitamente. O problema é que ele fez o processo apenas a primeira vez, depois ele libera os campos. Mas agora ficou mais fácil, mais alguns ajustes no form e esse detalhe é resolvido.

Eu não entendi 100% o real funcionamento do create_timer ainda, mas estou estudando aqui pra melhorar.

Muito obrigado pela dica.

:)
zeborgesneto
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Mensagens: 4
Registrado em: Qua, 15 Jun 2011 5:56 pm
Localização: PATOS DE MINAS
José Borges
Analista de Sistemas / Programador PL/SQL

Bom dia everthon,

A solução para o seu problema é bem simples. O que você quer é que o cursor fique travado no campo até que seja digitado um código válido certo? Para isso basta você usar o comando raise form_trigger_failure após a mensagem que você colocou. Ficaria dessa forma:

Selecionar tudo

SELECT CLI_NOME 
INTO :NOME_CLI
FROM CLIENTE
WHERE CLI_CODIGO = :VEND_NF_CODCLI;
       exception
   when no_data_found then
       message('Cliente não encontrado!');
       raise form_trigger_failure;
Assim o cursor ficará travado no campo até que o select retorne um valor.

Att.
everthon
Rank: Estagiário Sênior
Rank: Estagiário Sênior
Mensagens: 14
Registrado em: Qua, 18 Jan 2012 2:43 pm
att,

Everthon Souza
Em Deus, posso todas as coisas!

Boa tarde José Borges,

Simples assim?
Funcionou perfeitamente. Muito obrigado pela disponibilidade.

Com a ajuda de vocês, ainda vou ficar bom!

Abraço.
Responder
  • Informação
  • Quem está online

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