Validação de campos para pesquisa com PERCENTUAL

Dicas do Oracle Forms Builder - Blocos, Itens, LOV, Canvas, Triggers, comandos, PLL, d2kwutil, FMB, Alert, menus, etc
Responder
Avatar do usuário
tiago_pimenta
Rank: DBA Júnior
Rank: DBA Júnior
Mensagens: 213
Registrado em: Qua, 29 Jun 2011 9:49 am
Localização: Barretos / SP

Pessoal, boa tarde.

Estou com um problema para validar os campos para pesquisa e gostaria de saber se alguém já passou por isso e como resolveu. Sempre validei os campos para pesquisa ou até mesmo para cadastro com a seguinte sintaxe: ":bloco.campo is null", porém estou com uma situação agora, que essa validação está falhando. Quando eu digito por exemplo "123456" no campo e pesquiso, a validação acima funciona, porém, se eu colocar a porcentagem %, exemplo , a validação diz que o campo é vázio.

Até tenho a solução, mas tenho certeza que não a solução que eu pensei, não faz parte das boas práticas. Pensei em fazer assim "length(:bloco.campo) = 0", mas queria saber se tem alguma outra solução ou se tem uma solução melhor !!!

Att.

Tiago Pimenta
spernega
Rank: DBA Pleno
Rank: DBA Pleno
Mensagens: 232
Registrado em: Ter, 19 Jun 2007 2:12 pm
Localização: São Paulo - SP

Bom dia Tiago,

Não sei como você está montando a query, mas se você usar o LIKE deve resolver.

Você está usando isso na PRE-QUERY ou na cláusula WHERE do bloco?
Avatar do usuário
tiago_pimenta
Rank: DBA Júnior
Rank: DBA Júnior
Mensagens: 213
Registrado em: Qua, 29 Jun 2011 9:49 am
Localização: Barretos / SP

spernega, bom dia.

Na verdade, o meu problema hoje é o seguinte, já existe uma trigger "pre-query" em um bloco base-table, que verificado se os campos estão preenchidos ou não, se não estiverem, ele dá uma mensagem e não realiza a pesquisa. Quando eu digito por exemplo em um item "123456", ele faz a busca/pesquisa normalmente, porém, se eu colocar a porcentagem "%" no item para fazer a pesquisa, exemplo "12345%", ele entende como se o campo estivesse vazio e não realiza a busca. Porém o cliente precisa/quer realizar a busca com o "%".

Não sei se você está com o Forms em mãos ai, mas para visualizar o meu problema, é só criar um forms com um bloco base-table simples (Código, Descrição) e colocar na trigger "pre-query" do bloco a validação abaixo e tentar realizar a busca no código com o "%".

Selecionar tudo

if :bloco.campo is null then
	message('É nulo');
        message('É nulo');
        
        raise form_trigger_failure;
end if;
Não estou montando a query nem setando o default_where do bloco, a pesquisa é usando o "F7" e "F8".

[ ]s
spernega
Rank: DBA Pleno
Rank: DBA Pleno
Mensagens: 232
Registrado em: Ter, 19 Jun 2007 2:12 pm
Localização: São Paulo - SP

Ok,

Tenta fazer assim:

Selecionar tudo

if :bloco.campo is null then
   message('É nulo');
elsif INSTRB(:bloco.campo, '%') > 0 then
   message('usa LIKE');
else
   raise form_trigger_failure;
end if;
Avatar do usuário
tiago_pimenta
Rank: DBA Júnior
Rank: DBA Júnior
Mensagens: 213
Registrado em: Qua, 29 Jun 2011 9:49 am
Localização: Barretos / SP

Não rola pois na linha

Selecionar tudo

elsif INSTRB(:bloco.campo, '%') > 0 then
ele está "achando" que o :bloco.campo é nulo, ou seja, é como se a linha estivesse assim

Selecionar tudo

elsif INSTRB(null, '%') > 0 then
Muit'loko esse bug do Forms

[ ]s
spernega
Rank: DBA Pleno
Rank: DBA Pleno
Mensagens: 232
Registrado em: Ter, 19 Jun 2007 2:12 pm
Localização: São Paulo - SP

Estranho mesmo...
Fiz uns testes e funciona.

Quer postar a sua TRIGGER pra gente dar uma olhada?
Avatar do usuário
tiago_pimenta
Rank: DBA Júnior
Rank: DBA Júnior
Mensagens: 213
Registrado em: Qua, 29 Jun 2011 9:49 am
Localização: Barretos / SP

A trigger eu só coloquei o if do instr.. Então ficou assim

Selecionar tudo

if instrb(:bloco.campo, '%') > 0 then
   message('Passou');
end if;
Avatar do usuário
tiago_pimenta
Rank: DBA Júnior
Rank: DBA Júnior
Mensagens: 213
Registrado em: Qua, 29 Jun 2011 9:49 am
Localização: Barretos / SP

Ontem antes de enviar o e-mail, eu testei o length e deu certo, porém hoje já não está funcionando, ou seja, qualquer função/bult-in que eu use com esse campo number contendo o "%", ele não funciona.

Não posso deixar o cliente fazer uma busca sem pelo menos 1 campo como critério (Preenchido), ou seja, se ele chegar no bloco, aperta "F7" e logo em seguida "F8", eu não posso permitir, ele tem que preencher pelo menos 1 campo e se ele usar o "%".

Estou aceitando sugestões *rs*

[ ]s
spernega
Rank: DBA Pleno
Rank: DBA Pleno
Mensagens: 232
Registrado em: Ter, 19 Jun 2007 2:12 pm
Localização: São Paulo - SP

Tiago,

Eu faço da seguinte forma:

Crio um bloco de parâmetros, não base table.
E crio o bloco base table

A pré-query eu monto com base no bloco de parâmetros.

é mais ou menos assim que você está fazendo?
Avatar do usuário
tiago_pimenta
Rank: DBA Júnior
Rank: DBA Júnior
Mensagens: 213
Registrado em: Qua, 29 Jun 2011 9:49 am
Localização: Barretos / SP

spernega,

Não.. Eu faço um forms simples com um bloco base-table simples... Olha essa imagem

Imagem

Faça um forms parecido, só precisa de um item number... Ai você executa ele e faça uma pesquisa... Na validação da trigger, ele deveria mostrar a mensagem somente quando a gente aperta-se F7 e logo em seguida F8, para trazer *TODOS* os dados, correto ??? Porém, quando você digita qualquer número com o "%", ele dá um erro de 50016 se não me engano e zera o item, entendeu ?

[ ]s
Avatar do usuário
tiago_pimenta
Rank: DBA Júnior
Rank: DBA Júnior
Mensagens: 213
Registrado em: Qua, 29 Jun 2011 9:49 am
Localização: Barretos / SP

Tiraram o editar do fórum ???

-- Edit --

Link da imagem: http://tinypic.com/r/1z4admd/9 (Para mim, só aparece depois que abre a página e clica em "Zoom").
spernega
Rank: DBA Pleno
Rank: DBA Pleno
Mensagens: 232
Registrado em: Ter, 19 Jun 2007 2:12 pm
Localização: São Paulo - SP

Então, se o bloco é base table, o usuário digita alguma coisa e clica no F7, o FORMS vai validar o registro.
Ele entende que estava tentando inserir alguma coisa.
Por isso da o erro 50600.
Provavelmente o o campo é number e o usuário digitou %.
Dai tenta validar e da o erro

Dá para o usuário usar o processo usual?
Tecla F7, o bloco entra em modo de pesquisa, o usuário digita no campo que ele quiser o valor com ou sem % e tecla F8.
Dai não precisa nem da pre-query.

Ou eu não entendi direito...
Avatar do usuário
tiago_pimenta
Rank: DBA Júnior
Rank: DBA Júnior
Mensagens: 213
Registrado em: Qua, 29 Jun 2011 9:49 am
Localização: Barretos / SP

Perai que nós não estamos na mesma sintonia *rs*

Sim, o usuário vai fazer o processamento "usual", o que eu quis exemplificar e não consegui são 3 situações, deixa eu ver se consigo explicar de outra maneira.

Primeira Situação (Essa situação não pode acontecer)

1. Abre o forms/tela
2. F7
3. F8

Segunda Situação (Essa situação funciona e pode acontecer)

1. Abre o Forms/Tela
2. F7
3. Digita o valor inteiro, ex.: 123456
4. F8

Terceira Situação (Essa *PRECISA* acontecer e não está acontecendo)

1. Abre o Forms/Tela
2. F7
3. Digita o valor inteiro, ex.: 12345%
4. F8

Consegui explicar agora ? *rs*
spernega
Rank: DBA Pleno
Rank: DBA Pleno
Mensagens: 232
Registrado em: Ter, 19 Jun 2007 2:12 pm
Localização: São Paulo - SP

Explicou perfeitamente.

Mas nessa situação não tem que criar a pre-query, é natural do forms executar a pesquisa e respeitar o que foi digitado...

Você tentou executar o FORMS sem criar a pre-query?
Avatar do usuário
tiago_pimenta
Rank: DBA Júnior
Rank: DBA Júnior
Mensagens: 213
Registrado em: Qua, 29 Jun 2011 9:49 am
Localização: Barretos / SP

spernega escreveu:Explicou perfeitamente.

Mas nessa situação não tem que criar a pre-query, é natural do forms executar a pesquisa e respeitar o que foi digitado...

Você tentou executar o FORMS sem criar a pre-query?
Eu preciso criar pois não posso deixar a primeira situação acontecer, pois traz todos os registros da tabela e isso demora... Entendeu o porque da pre-query ???
spernega
Rank: DBA Pleno
Rank: DBA Pleno
Mensagens: 232
Registrado em: Ter, 19 Jun 2007 2:12 pm
Localização: São Paulo - SP

Bom dia,

Se você tentar limitar os registros na Maximum Records Fetched das propriedades do bloco e setar o Query all Recods como Não?

De resto não vejo porque o % não está funcionando.
Avatar do usuário
tiago_pimenta
Rank: DBA Júnior
Rank: DBA Júnior
Mensagens: 213
Registrado em: Qua, 29 Jun 2011 9:49 am
Localização: Barretos / SP

Então... Mas não sei se a validação que tem é por causa da quantidade de registros (Que foi o que aconteceu comigo), ou se é alguma regra de negócio de não permitir a consulta sem nenhum campo preenchido.

Quanto ao "problema" da porcentagem "%", ele dá um erro 50016 quando você tenta pesquisar em campo numérico, *PROVAVELMENTE* ele dá o erro e zera o campo, fazendo assim com que a condição do campo seja nula. Isso é o que eu acho, mas não tenho certeza.

[ ]s
spernega
Rank: DBA Pleno
Rank: DBA Pleno
Mensagens: 232
Registrado em: Ter, 19 Jun 2007 2:12 pm
Localização: São Paulo - SP

Tiago,

Chegou a hora de apelar para a ignorância, pelo menos pra resolver a mensagem de erro...
Na pre-query coloca

Selecionar tudo

:System.Message_Level := 24
depois volta para

Selecionar tudo

 :System.Message_Level := 0
vou pensar em testar se o campo está nulo.
Avatar do usuário
tiago_pimenta
Rank: DBA Júnior
Rank: DBA Júnior
Mensagens: 213
Registrado em: Qua, 29 Jun 2011 9:49 am
Localização: Barretos / SP

Cara, dei risada do seu "Chegou a hora de apelar para a ignorância"... O que eu pensei foi em tratar o erro no "ON-ERROR" com a seguinte "lógica"... Se deu erro de carácter inválido, é porque o campo não é nulo... Tendeu ??
spernega
Rank: DBA Pleno
Rank: DBA Pleno
Mensagens: 232
Registrado em: Ter, 19 Jun 2007 2:12 pm
Localização: São Paulo - SP

kkkkkkkkkkkkkkkkkkkkkkkkkkkk.... melhor sim

mas não consegui desvendar o % na pre-query e não achei nada na net.
De jeito nenhum o FORMS entende como não nulo quando tem o %.
spernega
Rank: DBA Pleno
Rank: DBA Pleno
Mensagens: 232
Registrado em: Ter, 19 Jun 2007 2:12 pm
Localização: São Paulo - SP

Tiago,

Se você resolver o problema do % na pre-query, conta pra gente.
Avatar do usuário
tiago_pimenta
Rank: DBA Júnior
Rank: DBA Júnior
Mensagens: 213
Registrado em: Qua, 29 Jun 2011 9:49 am
Localização: Barretos / SP

spernega, boa tarde.

Cara, o que foi feito foi desativa a trigger que fazia a validação se o campo estava nulo ou não, ou seja, desvestimos um santo para vestir outro.

Mas não fiquei satisfeito com isso não, mas por enquanto foi o que conseguimos :?
spernega
Rank: DBA Pleno
Rank: DBA Pleno
Mensagens: 232
Registrado em: Ter, 19 Jun 2007 2:12 pm
Localização: São Paulo - SP

Beleza, mas pensa em criar um bloco de parâmetros de pesquisa, você vai sofrer um pouquinho menos.
Mas o importante é funcionar.

Boa sorte
Avatar do usuário
tiago_pimenta
Rank: DBA Júnior
Rank: DBA Júnior
Mensagens: 213
Registrado em: Qua, 29 Jun 2011 9:49 am
Localização: Barretos / SP

Mas mesmo com o bloque de pesquisa, a situação seria a mesma não seria ? Teria um item nesse bloco number que o usuário iria colocar o "%" e iria dar o mesmo erro :(
spernega
Rank: DBA Pleno
Rank: DBA Pleno
Mensagens: 232
Registrado em: Ter, 19 Jun 2007 2:12 pm
Localização: São Paulo - SP

Bom dia Tiago,

Funciona sim...

Seguinte, montei um bloco base table numa tabela chamada cliente_proprietario e montei um bloco não base table chamado controle.

No bloco controle criei um campo chamado VALOR e montei uma pre-query no bloco cliente proprietario:

Selecionar tudo

Declare
	v_clau varchar2(2000);
begin
	if :controle.valor is null then
		 message('Query full não permitida!');
		 pause;
     --
     raise form_trigger_failure;
     --
	else
		if :controle.valor like '%' then
  		 message('Query com %!');
	  	 pause;
       set_block_property('cliente_proprietario', default_where, 'cliente_proprietario.cd_Clie_Fili like '||''''||:controle.valor||'''');
		else
  		 message('Query informada!');
	  	 pause;
       set_block_property('cliente_proprietario', default_where, 'cliente_proprietario.cd_Clie_Fili = '||:controle.valor);
		end if;
	end if;
end;
Desta forma ele considera corretamente o %.

veja se você consegue assim.
Avatar do usuário
tiago_pimenta
Rank: DBA Júnior
Rank: DBA Júnior
Mensagens: 213
Registrado em: Qua, 29 Jun 2011 9:49 am
Localização: Barretos / SP

spernega,

Primeiro desculpa a demora, fiz um forms simples de teste aqui com o bloco não base-table e mesmo assim não rolou... Dá uma olhada ai para você ver como eu faço aqui, pois eu não monto o default_where, entendeu ?

https://drive.google.com/open?id=0B2SBc ... XU3UFpCS0U

[ ]s
spernega
Rank: DBA Pleno
Rank: DBA Pleno
Mensagens: 232
Registrado em: Ter, 19 Jun 2007 2:12 pm
Localização: São Paulo - SP

Tiago,

Consegui baixar o arquivo mas abre com erro, deve ser falta de alguma pll aqui, ou alguma coisa assim.
Estou anexando o teste que eu fiz e com o script de criação de uma tabela que eu usei com alguns inserts.

Renomeia o arquivo pra .zip e veja se consegue ver do jeito que eu fiz.
Anexos
Temp_Programas.txt
renomear para .zip
(9.01 KiB) Baixado 479 vezes
Responder
  • Informação
  • Quem está online

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