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.
ViamaisBLOG
Privacy Overview

This website uses cookies so that we can provide you with the best user experience possible. Cookie information is stored in your browser and performs functions such as recognising you when you return to our website and helping our team to understand which sections of the website you find most interesting and useful.