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.

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.