Validações - Go_block / Key-COMMIT

Dicas do Oracle Forms Builder - Blocos, Itens, LOV, Canvas, Triggers, comandos, PLL, d2kwutil, FMB, Alert, menus, etc
Responder
GuiSS
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 20
Registrado em: Seg, 14 Jun 2010 11:17 am
Localização: São Paulo, SP
Guilherme

Olá amigos,

Estou com mais uma dúvida que já vi, revi, então resolvi consultá-los, pois sei que raramente saio do fórum com as mãos vazias.

Tenho uma trigger KEY-COMMIT com diversas validações.
Tanto que preciso usar o comando GO_BLOCK e varrer todos os registros de determinado bloco (mais de uma vez).

Estou com um probleminha.

A cada Go_Block feito, os registros são validados automaticamente... Sendo assim, caso tenha um item obrigatório qe esteja nulo, uma mensagem de erro é disparada todas as vezes que o Go_Block é chamado...

Penso em dois cenários que corrigiriam essas situações, mas não sei se são possíveis...

1) Desabilitar a validação do bloco dinamicamente, antes de eu chamar esses Go_Block's. (Existe alguma forma?)
2) Fazer a validação dos registros ANTES da Key-Commit, e, no caso de haver algum item com problemas de validação, a Key-Commit nem ser executada. (Será possível?)

Conto com a ajuda de vocês,
E desde já MUITO obrigado!

Abraços!
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

E que tal fazer as validaçãoes dentro da trigger WHEN-VALIDATE-RECORD desta forma se tu trocar de registro/ de bloco/ dar o comando de commit ele já valida o registro.
GuiSS
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 20
Registrado em: Seg, 14 Jun 2010 11:17 am
Localização: São Paulo, SP
Guilherme

Valeu pelo retorno, gfkauer...

Não posso fazer essas validações na WHEN-VALIDATE-RECORD, porque estou contabilizando valores de todos os registros, ou seja, preciso percorrer por todos os registros na KEY-COMMIT 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

Exatamente quais tipos de validação você precisa implementar?

Se forem cálculos simples (somatórios ou média de uma coluna) pode-se fazer um campo do tipo Calculation e basear-se neste valor para efetuar a validação.

São poucos os tipos de triggers de validação que permitem navegar entre campos ou blocos...
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 da pra setar todos os itens pra validos na mão

Selecionar tudo

SET_ITEM_PROPERTY('NOME_DO_BLOCO.NOME_DO_ITEM', ITEM_IS_VALID, PROPERTY_TRUE);
Quanto a tua duvida de fazera validação dos registros antes da key-commit :

Por padrão as trigger key são executadas antes. Mas tu pode colocar na tua key-commit um VALIDATE(FORM_SCOPE) que ira disparar as validações de todo o forms.
Da mesma maneira tu pode usar um VALIDATE(RECORD_SCOPE) se quiseres apenas disparar as validações a nivel de registro, alías é só ir mudando o parâmetro do VALIDATE para ir mudando o scopo da validação.

Se tiveres problemas para implementar isso posta aee.
GuiSS
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 20
Registrado em: Seg, 14 Jun 2010 11:17 am
Localização: São Paulo, SP
Guilherme

gfkauer,
Os cálculos que lhe falei já existem hoje no forms... na trigger key-commit, e tenho que evitar mexer neles propriamente...
O que estou fazendo antes dos cálculos é somar os campos de todos os registros de um bloco para comparar com o valor "total" que está em outro bloco.
Dependendo dessa comparação, realizo o cálculo que está lá ou não.

Sergio,
O VALIDATE(FORM_SCOPE) seria perfeito para mim, desde que ele retornasse algum valor. porque caso eu encontre FALHA na validação, não executaria nenhum dos passos seguintes da minha trigger.

Obrigado!
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 tu chegou a tentar utiliza-lo

A ideia é que ele vai disparar o erro, e uma vez que disparou um erro o resto do código da key-commit vai parar.

De qualquer maneir tu pode testar com um

Selecionar tudo

if form_success then
.....
end if;
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

Também existe a opção(que eu não já utilizei, mas não faria novamente) de replicar o código das tuas validações na key-commit.
GuiSS
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 20
Registrado em: Seg, 14 Jun 2010 11:17 am
Localização: São Paulo, SP
Guilherme

Sergio!
Obrigado pela ajuda.

Fiz pelo If form_success... E funcionou... \o/

Só uma informação. Mesmo se disparar a mensagem do VALIDATE, o resto do código da KEY-COMMIT é executado.

Obrigado pela ajuda Sergio e gfkauer!


Abraços!
GuiSS
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 20
Registrado em: Seg, 14 Jun 2010 11:17 am
Localização: São Paulo, SP
Guilherme

Pessoal,

Tenho mais uma dúvida com relação a esse assunto.

Implementei o código no início da key-commit mais ou menos com a ideia a seguir:

Selecionar tudo


  BEGIN

    VALIDATE(form_scope);
  
    IF NOT Form_Success THEN

          :bloco.campo1 := 'informacao';
          :bloco.campo2 := 'informacao';
	
          RAISE Form_Trigger_Failure;
  		
     END IF;

  END;

  -- Aqui continuam os calculos da key-commit


Beleza, o forms valida perfeitamente e salta fora da key-commit, disparando a mensagem de que existem campos requeridos que estao nulos.

Porém, gostaria que o cursor fosse posicionado no primeiro campo nulo requerido, assim como é nas validações comuns.

Preciso fazer algo?

Abçs...
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

Ba cara, dae.... pra fazer isto o único jeito que conheço é replicar as validações para dentro da KEY-COMMIT;

Algo tipo :

Selecionar tudo

IF :NOME_BLOCO.NOME_CAMPO IS NULL THEN
   GO_ITEM ('NOME_BLOCO.NOME_CAMPO');
   ..... mensagens de erro......
END IF;
Ou da pra fazer uma procedure que verifique quais campos nulos não foram informados e navegue para eles.

Algo tipo:

Selecionar tudo

IF get_item_property('NOME_BLOCO.NOME_CAMPO', REQUIRED, PROPERTY_TRUE and :NOME_BLOCO.NOME_CAMPO IS NULL THEN
   GO_ITEM('NOME_BLOCO.NOME_CAMPO');
    ---------- mensagens de erro ---------
END IF;
Eu acho que é muito trabalho fazer isto apenas para acusar qual campo está nulo.

De qualquer maneira espero que isso ajude.
Responder
  • Informação