Ir para conteúdo
Fórum Script Brasil
  • 0

(Resolvido) filtrar registros sem fazer nova consulta ao banco


etspaz

Pergunta

bom dia a todos.

bem eu tenho um dbgrid e um edit para filtrar, inicialmente eu tinha um botão e no onclick fazia um select assim:

'select * from tabtal where upper(nome) like upper(' + #39 + '%' + edit_NomeCliente.Text + '%' + #39 + ') order by nome';

funciona, mas o que eu quero é não ter que fazer outra pesquisa no banco diminuindo a performance, um colega disse pra eu usar locate.

CDS_CONTATO.Locate('NOME',Edit_filtranome_contato.Text,[loCaseInsensitive]);

esse código aí não faz nada, pois eu quero que a medida que o usuario vai digitando as letras os nomes vão sendo filtrados no grid.

vlw!

Link para o comentário
Compartilhar em outros sites

3 respostass a esta questão

Posts Recomendados

  • 0
Guest Jorge Mantini
// Meu caro esse será meu primeiro post, espero que lhe ajude.

// crie esta função.

function ProcuraDB(Txt: string): string;
begin
  WITH query DO
    if TXT <>'' THEN
    begin
      DisableControls;
      First;
      while not Eof  do
       begin
        IF (LSTRCMP(PCHAR(COPY(FieldByName('campo').AsString,1,LENGTH(TXT))),PCHAR(TXT))=0)  OR
           (LSTRCMPI(PCHAR(COPY(FieldByName('campo').AsString,1,LENGTH(TXT))),PCHAR(TXT))=0) THEN
          BEGIN
            RESULT:=FieldByName('campo').AsString;
            BREAK;
          END;
       next;
       end;
     EnableControls;
    end;

end;

==========================================================================================================

// declare esta variavel publica - bPAUSA : boolean;

// no evento onchange do edit, faça esta procedura

procedure Edit1Change(Sender: TObject);
var
iB: INTEGER;
 begin
 if Edit1.Text <> '' then
  begin
   IF NOT bPAUSA AND ACTIVE THEN
   BEGIN
    IF PROCURADB(Edit1.TEXT) <> '' THEN
    BEGIN
      iB:=LENGTH(Edit1.TEXT);
      Edit1.TEXT:=PROCURADB(Edit1.TEXT);
      Edit1.SELSTART:=iB;
      Edit1.SELLENGTH:=LENGTH(PROCURADB(Edit1.TEXT))-iB;
    end;
  END;
  if NOT bPAUSA THEN
  Begin
   query.DisableControls;
   query.first;
   while not query.Eof DO
    begin
      IF query.FieldByName('campo').AsString = Edit1.TEXT THEN
       BREAK;
      query.next;
    end;
   query.EnableControls;
  end;
 end;
end;


Espero ter ajudado....
Um grande abraço!!!

Link para o comentário
Compartilhar em outros sites

  • 0
bem eu tenho um dbgrid e um edit para filtrar, inicialmente eu tinha um botão e no onclick fazia um select assim:

'select * from tabtal where upper(nome) like upper(' + #39 + '%' + edit_NomeCliente.Text + '%' + #39 + ') order by nome';

funciona, mas o que eu quero é não ter que fazer outra pesquisa no banco diminuindo a performance, um colega disse pra eu usar locate.

Se você só faz a consulta quando o botão é pressionado e ainda passa um sub-string como filtro, eu diria que esta talvez seja a melhor opção. Observe que você vai buscar no banco apenas os registros similares, o que com certeza retorna muito menos registros do que se você trabalhar com todas as linhas de sua tabela.

CDS_CONTATO.Locate('NOME',Edit_filtranome_contato.Text,[loCaseInsensitive]);

esse código aí não faz nada, pois eu quero que a medida que o usuario vai digitando as letras os nomes vão sendo filtrados no grid.

para fazer algo, você terá que o colocar no evento OnChange do Edit_filtranome_contato e a sua SQL de consulta não terá o filtro como acima (ou seja, sem cláusula where).

Abraços

Link para o comentário
Compartilhar em outros sites

  • 0

eu consegui resolver, tirei o botão de pesquisa, pois quando o form é carregado já traz todos registro no grid, e no evento onchange do edit coloquei:

cds_contato.Filtered := False;
  cds_contato.Filter := 'nome like ' + #39 + '%' + Edit_filtranome_contato.Text + '%' + #39;
  cds_contato.Filtered := True;

assim quando o usuario vai digitando, o resultado vai sendo filtrado, como no help de alguns programas e não precisa fazer outro select só pra isso.

obrigado a todos pela ajuda.

abraços.

Editado por Micheus
Incluída tag's CODE para melhorar a visualização. Utilize a identação também ;)
Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,4k
×
×
  • Criar Novo...