Pesquisa

Dicas do Oracle Forms Builder - Blocos, Itens, LOV, Canvas, Triggers, comandos, PLL, d2kwutil, FMB, Alert, menus, etc
Responder
pmv1980
Rank: Analista Júnior
Rank: Analista Júnior
Mensagens: 97
Registrado em: Qua, 07 Jan 2009 12:39 pm
Localização: Recife

Eu tenho um campo de numero de documento e abaixo uma lista com vários números, tem como fazer uma pesquisar tipo a da lov, quando você vai digitando vai sendo listado, exemplo, eu começo com 1 e ele só listas os docs com inicio 1.
Avatar do usuário
dr_gori
Moderador
Moderador
Mensagens: 5024
Registrado em: Seg, 03 Mai 2004 3:08 pm
Localização: Portland, OR USA
Contato:
Thomas F. G

Você já respondeu a dúvida de alguém hoje?
https://glufke.net/oracle/search.php?search_id=unanswered

Bom, talvez dá pra fazer um TIMER que fique executando a query de tempos em tempos...
Ou melhor ainda: O timer guarda numa variável a última coisa que ele filtrou. Caso o campo esteja diferente, ele executa a query. Assim o programa não vai ficar executando muitas vezes se o usuário esquecer a tela aberta... sei lá, é uma idéia.
RodrigoValentim
Moderador
Moderador
Mensagens: 367
Registrado em: Ter, 25 Mar 2008 3:41 pm
Localização: Salvador - BA
Rodrigo Valentim
Analista de Sistemas
Oracle Developer

Campanha: Faça uma pesquisa antes de perguntar!!!

Deixa eu ver se eu entendi...

Você tem um campo (NR_DOC) que ao você digitar um valor, você quer que, em um LIST_ITEM ele filtre os valores dessa lista com base no que está sendo escrito no NR_DOC ?

Caso positivo, você pode criar essa lista de forma dinâmica a cada key-down disparado nesse campo NR_DOC.


Abaixo segue código para criação da lista...

Selecionar tudo

PROCEDURE criar_lista (pQuery varchar2, pRgName varchar2, pNmLista varchar2) IS
BEGIN
  /*  
  ** Built-in:  CREATE_GROUP_FROM_QUERY 
  ** Exemplo:   Cria um record_group de uma query e popula um list_item. 
  */ 
  DECLARE 
    rg_name  VARCHAR2(40); 
    rg_id    RecordGroup; 
    errcode  NUMBER; 
  BEGIN 
  	rg_name := pRgName;
    /* 
    ** Certifica que o grupo não existe ainda. 
    */ 
    rg_id := Find_Group( rg_name ); 
    /* 
    ** Se não existe, cria ele e adiciona as duas 
    ** colunas necessarias pra ele. 
    */ 
    IF Id_Null(rg_id) THEN 
      rg_id := Create_Group_From_Query( rg_name, pQuery);
      
                  'SELECT SAL-MOD(SAL,1000) BASE_SAL_RANGE,' 
                 ||'COUNT(EMPNO) EMPS_IN_RANGE ' 
                 ||'FROM EMP ' 
                 ||'GROUP BY SAL-MOD(SAL,1000) ' 
                 ||'ORDER BY 1');
    END IF; 
    /* 
    ** Popula o grupo 
    */ 
    errcode := Populate_Group( rg_id ); 
    /* 
    ** Apaga os elementos da sua lista 
    */ 
    clear_list(pNmLista);
    /* 
    ** popula seu item com o grupo criado 
    */ 
    populate_list(pNmLista, rg_id ); 
  END;
END;
Espero ter ajudado.
pmv1980
Rank: Analista Júnior
Rank: Analista Júnior
Mensagens: 97
Registrado em: Qua, 07 Jan 2009 12:39 pm
Localização: Recife

A idéia é essa, mas seria possível ao invés do lista, ser em um text, porque eu tenho uma tela com 20 numeros de doc e acima um campo de pesquisa.

Digamos q eu entre com o num 1 para pesquisa, na tela só iriam aparecer os com inicio 1, deu pra entender ?

Eu vi isso em outro programa, mas não sei qual é a linguagem.
RodrigoValentim
Moderador
Moderador
Mensagens: 367
Registrado em: Ter, 25 Mar 2008 3:41 pm
Localização: Salvador - BA
Rodrigo Valentim
Analista de Sistemas
Oracle Developer

Campanha: Faça uma pesquisa antes de perguntar!!!

possível até é... se vai ficar legal eu não sei porque ainda não entendi onde você quer chegar.

você pode fazer um cursor usando like ':BLK.NR_DOC_PESQ%' e preencher os varios text com o resultado..[/code]
pmv1980
Rank: Analista Júnior
Rank: Analista Júnior
Mensagens: 97
Registrado em: Qua, 07 Jan 2009 12:39 pm
Localização: Recife

Digamos q eu tenha uma tela de consulta, com 5 registros.

doc

1015
1018
2536
2555
1477

Dai no compo da pesquisa por documento, eu entro com 1, na medida em q vou digitando, ele deixa na tela apenas os q atenderem a minha pesquisa entendeu ?
RodrigoValentim
Moderador
Moderador
Mensagens: 367
Registrado em: Ter, 25 Mar 2008 3:41 pm
Localização: Salvador - BA
Rodrigo Valentim
Analista de Sistemas
Oracle Developer

Campanha: Faça uma pesquisa antes de perguntar!!!

Acho que na trigger de KEY-DOWN relacionada ao campo da pra fazer.

a cada key-down, refaça a consulta deixando somente o que atende a condição
pmv1980
Rank: Analista Júnior
Rank: Analista Júnior
Mensagens: 97
Registrado em: Qua, 07 Jan 2009 12:39 pm
Localização: Recife

Eu faço um cursor ?

Selecionar tudo

Declare
	
	Cursor cPesquisa is Select Nr_Documento
	                      From Pagamento
	                     Where Nr_Documento = :Pagamento.Nr_Documento; 
	            
nDoc Pagamento.Nr_Documento%TYpe;

Begin
	
	Open cPesquisa;
	 Fetch cPesquisa Into nDoc;
	Close cPesquisa;

  If nDoc is Not Null Then
  	Execute_Query;
  End If;
  
End;
RodrigoValentim
Moderador
Moderador
Mensagens: 367
Registrado em: Ter, 25 Mar 2008 3:41 pm
Localização: Salvador - BA
Rodrigo Valentim
Analista de Sistemas
Oracle Developer

Campanha: Faça uma pesquisa antes de perguntar!!!

o fetch é direto no campo da tela. assim, você so vai exibir o que atende sua solicitação, ou, você pode setar o default_where (não sei se pode dar set_block_property na key-down)
pmv1980
Rank: Analista Júnior
Rank: Analista Júnior
Mensagens: 97
Registrado em: Qua, 07 Jan 2009 12:39 pm
Localização: Recife

O fetch está sendo direto no campo da tela, mas não está fazendo nada.
Avatar do usuário
gpilger
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 29
Registrado em: Qua, 21 Abr 2010 3:34 pm
Localização: Novo Hamburgo - RS
Gilson Pilger
"Por não saber que erra impossível, ele foi lá e fez" autor desconhecido

Não tinha pensando nisso ainda, mas acho que da pra fazer sim...

Pensei em fazer da seguinte forma.

1)Na trigger WHEN_NEW_ITEM-INSTANCE do campo de pesquisa eu criou um TIMER que é executado continuamente.

Selecionar tudo

DECLARE
  v_timer TIMER;
  tm_id   TIMER;
  V_SEG   number := 60; -- 1 segundo

BEGIN
  
  tm_id:=Find_Timer('MEU_TIMER');
  
  IF NOT Id_Null(tm_id) THEN
    Delete_Timer(tm_id);
  END IF;
  
  v_timer := CREATE_TIMER('MEU_TIMER',V_SEG,NO_REPEAT);

END;
2)Na trigger WHEN-TIMER-EXPIRED, a nível de bloco, eu invoco esse TIMER e seto o default_where do bloco abaixo e executo a query. Isso eu vou fazer de segundo em segundo, de acordo com definido no TIMER criado acima.

Selecionar tudo

IF GET_APPLICATION_PROPERTY(TIMER_NAME) = 'MEU_TIMER'
  THEN
  -- Defino o where
  set_item_property('bloco.item',default_where,' documento_nro like '||:bloco.campo_pesquisa||'%');
  -- atualizo aplicação
  synchronize;
  --executo a query
  execute_query;

  --
END IF;  
3) Agora preciso que meu timer pare de executar algum momento. Isso eu faço no WHEN-VALIDADE-ITEM do campo de pesquisa. O mesmo que invoquei o timer. Mas porque na W-V-I? Porque assim tanto na saído pelo teclado quanto pelo mouse ela será executada, diferente da trigger KEY-NEXT-ITEM, que se restringe a saído do teclado.

Selecionar tudo

DECLARE
  v_timer TIMER;
  tm_id   TIMER;
  V_SEG   number := 60; -- 1 

BEGIN
  
  tm_id:=Find_Timer('MEU_TIMER');
  
  IF NOT Id_Null(tm_id) THEN
    Delete_Timer(tm_id);
  END IF;

END;
Legal a idéia, vou ter replicá-la amanhã no trabalho. Muito barbada de fazer.

Se alguém conseguir fazer funcionar posta ai a solução, mesmo se for esta que dei.

Abraços,
Responder
  • Informação
  • Quem está online

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