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.