Bloquear Caracteres no campo do Forms

Dicas do Oracle Forms Builder - Blocos, Itens, LOV, Canvas, Triggers, comandos, PLL, d2kwutil, FMB, Alert, menus, etc
Responder
vindalencio
Rank: Analista Sênior
Rank: Analista Sênior
Mensagens: 140
Registrado em: Qui, 16 Fev 2006 9:42 am
Localização: Curitiba
Vanderlei Indalencio

Caros amigos algém sabe de alguma forma de bloquer caracteres num campo do forms, mas este campo é char., pois na base é varchar também...
rogenaro
Rank: DBA Pleno
Rank: DBA Pleno
Mensagens: 232
Registrado em: Sex, 30 Mar 2007 7:26 pm
Localização: Londrina - PR
Rafael O. Genaro

Você pode fazer algo assim no WHEN-VALIDATE-ITEM do campo:

Selecionar tudo

declare
  v number;
begin
  v := :bloco.campo;
exception
  when others then
    -- carcater inválido
end;
Eduardo Salles
Rank: Estagiário Sênior
Rank: Estagiário Sênior
Mensagens: 8
Registrado em: Qua, 07 Mai 2008 8:53 pm
Localização: pr

Analisando algumas queries de relatório e muitas delas tratavam saída de CPF utilizando SUBSTR e
vários subcomponentes para tratar essa saída.
Observe que o código abaixo:

Selecionar tudo

SUBSTR(C1,1,3)||'.'||SUBSTR(C1,4,3)||'.'||SUBSTR(C1,7,3)||'-'||SUBSTR(C1,10)
O mesmo resultado pode ser obtido utilizando o regexp_replace, minimizando a utilização de várias funções com concatenação
para algo mais simples:

Selecionar tudo

REGEXP_REPLACE(C1, '^(\d{3})(\d{3})(\d{3})(\d{2})$', '\1.\2.\3-\4')
Observe que substituímos a utilização de quatro funções SUBSTR por uma única REGEXP_REPLACE, o
que mudou foi como formatamos a saída.
Exemplo:

Selecionar tudo

SQL> create table t1 (cpf varchar2(11));
SQL> insert into t1 values('12345678901');
SQL> insert into t1 values('12345678911');
SQL> insert into t1 values('12345678921');
SQL> insert into t1 values('12345678931');
SQL> insert into t1 values('12345678941');
SQL> insert into t1 values('12345678951');
SQL> insert into t1 values('12345678961');
SQL> insert into t1 values('12345678971');
SQL> insert into t1 values('12345678981');
SQL> insert into t1 values('12345678991');
SQL> commit;
Testando a utilização do regexp

Selecionar tudo

SQL> select regexp_replace(cpf, '^(\d{3})(\d{3})(\d{3})(\d{2})$', '\1.\2.\3-\4') from
t1;
123.456.789-01
123.456.789-11
123.456.789-21
123.456.789-31
123.456.789-41
123.456.789-51
123.456.789-61
123.456.789-71
123.456.789-81
123.456.789-91
Observe como funcionam os argumentos utilizados:

regexp_replace(COLUNA, 'BUSCA', 'RESULTADO')
COLUNA : Coluna da tabela
BUSCA: Expressão regular para busca
^..: Indica início do registro
$..: Indica o final do registro
().: Cria um marcador
\d.: Dígitos (números)
{}.: Quantidade de caracteres
(\d{3})..: Marcador de 3 números (exemplo dado)
(\d{2})..: Marcador de 2 números (exemplo dado)
RESULTADO: Como será o resultado da substituição
\1..: Primeiro marcador, e assim por diante para cada () da busca

O marcador mostra onde aparecerá cada campo, um exemplo simples é efetuar a seguinte alteração no regexp
para melhorar um pouco o entendimento:

Selecionar tudo

SQL> select regexp_replace(cpf, '^(\d{3})(\d{3})(\d{3})(\d{2})$', '\4 - \1.\2.\3') from
t1;

01 - 123.456.789
11 - 123.456.789
21 - 123.456.789
31 - 123.456.789
41 - 123.456.789
51 - 123.456.789
61 - 123.456.789
71 - 123.456.789
81 - 123.456.789
91 - 123.456.789
Observe que o dígito verificador do CPF ficou na frente, e assim podemos redefenir como a saída do regexp
poderá sair de formas diferentes com pequenas alterações no código.

Seguindo a mesma linha de raciocínio sobre o cpf, é possível criar
uma tabela com uma coluna UF que aceita somente duas letras.
Criando a tabela:

Selecionar tudo

CREATE TABLE T1 (
C1 VARCHAR(2) NOT NULL
CONSTRAINT C1_UF_FORMAT
CHECK(REGEXP_LIKE(C1 '[A-Z]{2}’, ‘c’)));
Parâmetros utilizados:
C1 ...: coluna da tabela
[A-Z] : cadeia de caracteres válidos (A a Z)
{2} ..: quantidade exata de caracteres
c ….: indica que a expressão é case sensitive

Como anteriormente, o número especificado entre chaves indica a quantidade exata de caracteres que serão
aceitos. A novidade está na utilização de uma lista de caracteres disponíveis definidos entre colchetes


Outro exemplo seria utilizando um campo varchar2 com o objetivo de preencher o número do cpf.
Para tanto é preciso controlar a entrada para que contenha somente onze números.
Criando a tabela:

Selecionar tudo

CREATE TABLE T1 (
C1 VARCHAR2(11) NOT NULL
CONSTRAINT C1_NUMBER_FORMAT
CHECK(REGEXP_LIKE(C1, '\d{11}')));
Parâmetros utilizados:
C1 ..: coluna da tabela
\d ..: indica somente números
{11} : quantidade exata de caracteres

Utilizando estes parâmetros, forçamos a utilização de números e na quantidade exata de onze, não menos.


**** Estas Informações foram extraídas do blog criado por "Marcos Aurélio Braga" - excelente profissional que posta muitas dicas interessantes! ****
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

Se o objetivo é só validar o tamanho e tipo de dados uma mascara no campo já da conta.
Responder
  • Informação
  • Quem está online

    Usuários navegando neste fórum: Nenhum usuário registrado e 16 visitantes