Validando diversos campos no Oracle Forms 6i

[ad#texto]
Existem alguns Forms que pelo seu tempo de vida e diversas correções e implementações de novas regras de negócio fazem com que um único Forms contenha as funções e complexidades de um sistema completo (já operei com um Forms que o arquivo fonte .FMB tinha 10 Mb).

Um Forms desse tipo com certeza terá diversos campos, e estes campos por sua vez deverão conter validações e consistências com o intuito de manter e assegurar que os dados inseridos pelos usuários são os corretos ou na pior das situações o menos errado possível.

E deixar o código-fonte do seu PL/SQL embutido no Forms completamente abarrotado de IF´s para realizar essas consistências, realmente não é o melhor caminho, pois torna a manutenção maçante e lenta, além de deixar o seu código “feio”.

Veja um exemplo, de como consistir campos de forma inteligente e elegante, dando simplicidade e agilidade tanto no desenvolvimento quanto na manutenção do código-fonte PL/SQL:

/* **************************************************************************************************
 
* Autor:             Petter Rafael
* Empresa:           Viamais Web Intelligence
* Desde:             Dezembro/2010
* Versão:            1.0.1 – Oracle Forms 6i / Oracle PL/SQL 8
*
* Objetivo:        Consistir blocos de dados no Forms de forma automática e funcional, eliminando a
*                  necessidade de construção de procedures e outros artefatos para consistir diversos
*                  campos. Ideal para blocos de dados com grande quantidade de campos.
*
* Variáveis:       p_nome_bloco           = Nome do bloco que será consistido.
*                  p_tipo_valida          = Tipo de consistência que será realizada.
*                                            1 - para consistência de campos nulos.
*                                            2 - para consistência de campos negativos.
*                  p_campo_tipo           = Tipo do campo que será consistido. Obs.: precisar ser idêntico à nomenclatura do Forms (consulte F1 para ajuda).
*                  p_mens_err_pro         = Identifica se q mensagem de erro padrão será substituída por uma mensagem de erro definida pelo desenvolvedor.
*                  p_mensagem_erro        = Texto da mensagem de erro própria. Somente será preenchido caso a mensagem de erro personalizada esteja ativa.
*                  p_cor_erro             = Cor que o fundo do campo deve assumir caso sinalize inconsistência. Caso esteja nulo uma cor padrão é assumida. Padrão de cores Forms (consulte F1 para ajuda).
*
* Retorno:         Retorna mensagem de erro caso os critérios indiquem inconsistência informando o
*                  HINT do campo para sinalizar para o usuário qual campo precisa ser corrigido.
*                  Alterar a cor de fundo (background) do campo caso possível.
************************************************************************************************* */
 
PROCEDURE C_CONSIS_GERAL(p_nome_bloco IN varchar2
                        ,p_tipo_valida IN NUMBER
                        ,p_campo_tipo IN varchar2
                        ,p_mens_err_pro IN BOOLEAN
                        ,p_mensagem_erro IN varchar2
                        ,p_cor_erro IN varchar2) IS
w_campo_fim                  varchar2(400);
w_campo_ini                  varchar2(400);
w_erro                       varchar2(4000);
w_cor_back                   varchar2(15) := 'r350g0b0';
 
BEGIN
-- Controle da mensagem de erro.
IF p_mens_err_pro = TRUE THEN
 w_erro := p_mensagem_erro;
ELSE
 w_erro := 'Os seguintes campos estão com erros: ';
END IF;
 
-- Controle para cor de background de campos consistidos
IF p_cor_erro IS NOT NULL THEN
 w_cor_back := p_cor_erro;
END IF;
 
-- Resgatando dados para início da consistência.
w_campo_ini := get_block_property(p_nome_bloco, first_item);
w_campo_fim := get_block_property(p_nome_bloco, last_item);
go_item(p_nome_bloco || '.' || w_campo_ini);
loop
 -- Somente atua sobre campos de tipo específico
 IF get_item_property(:system.cursor_item, item_type) = p_campo_tipo THEN
  IF p_tipo_valida = 1 THEN
   IF :system.current_value IS NULL THEN
    message(w_erro || get_item_property(:system.cursor_item, hint_text));
    set_item_property(:system.cursor_item, background_color, w_cor_back);
   END IF;
  elsif p_tipo_valida = 2 THEN
   IF :system.current_value < 0 THEN
    message(w_erro || get_item_property(:system.cursor_item, hint_text));
    set_item_property(:system.cursor_item, background_color, w_cor_back);
   END IF;
  END IF;
 END IF;
 
 -- Saída caso alcance o último campo do bloco
 IF w_campo_fim = :system.current_item THEN
  exit;
 END IF;
 
 next_item;
END loop;
END;

Como utilizar? É muito simples, no Forms crie uma procedure (Program units) e cole o código PL/SQL que listei acima.

Pronto, agora é só chamar a procedure, passando os parâmetros de acordo com a sua necessidade. Pode ser utilizada a partir de qualquer triggers do Forms ou ainda embutida em outra procedure ou function.

As principais vantagens são:

  • Código PL/SQL embutido no Forms, mais coeso, simples de ser mantido e/ou alterado;
  • Maior eficiência, pois trata a consistência orientada por tipo do campo e validação e não caso a caso como normalmente vemos;
  • Maior agilidade no desenvolvimento é mais versátil;
  • Permite customizar a mensagem de erro por campo, de forma transparente para o desenvolvedor, sem a necessidade de alterar código-fonte PL/SQL;
  • Testada no Oracle Forms 6i, porém não existem restrições para versões posteriores do Forms.
Tags:,
Petter Rafael
Petter Rafael

Desenvolvedor Web atua com as tecnologias Java e PHP apoiadas pelos bancos de dados Oracle e MySQL. Além dos ambientes de desenvolvimento acima possuiu amplo conhecimento em servidores Apache/Tomcat, Photoshop, Arte & Foto, Flash e mais uma dezena de ferramentas e tecnologias emergentes. Atualmente colabora com o Viablog escrevendo sobre programação e tecnologia.

Assinar blog por e-mail

Digite seu endereço de e-mail para assinar este blog e receber notificações de novas publicações por e-mail.

Junte-se a 323 outros assinantes

Busca

agosto 2020
DSTQQSS
 1
2345678
9101112131415
16171819202122
23242526272829
3031 

Categorias