Filtrar DbGrid

11/01/2010

11

Olá,

criei um formulário de pesquisa com um edit e um botão. Neste edit, o usuário digita um nome, ou parte dele, e, ao clicar no botão, o formulário de pesquisa se fecha. Após o fechamento do formulário, o DbGrid do formulário que está ativo deve exibir apenas os dados do nome digitado no edit. O que devo fazer pra que isso ocorra?

Grata.
Responder

Posts

11/01/2010

Pjrm1470

Colega, Creio que pelo DBGrid seje bastante trabalhoso fazer isso (mas tem jeito). A maneira que conheço é pelo DataSet.   Exemplo: O TClientDataSet tem duas propriedades "Filter" e "Filtered". Onde no "Filter" vc adiciona o conteudo a ser filtrado: TClientDataSet.Filtered := False; //De preferencia deixe false para colocar o filtro TClientDataSet.Filter := 'FieldNome = '+TEdit.Text; //No caso funciona com like e muito mais. TClientDataSet.Filtered := True; //abra para filtrar os dados.   E basta limpar a propriedade "Filter" ou desativar o filtro para voltar ao estado normal. Espero que ajude.
Responder
Plínio,

fiz conforme seu exemplo, mas não deu certo. O dbgrid continua sem filtro. Posso digitar parte do nome ou o nome inteiro que o código apenas aponta o nome correspondente no dbgrid, não excluindo os outros nomes. O que estou fazendo errado? Segue abaixo o código:

procedure TFrmBusca.EdtNomcliChange(Sender: TObject);
begin
  Dados.TbClientes.Locate('nome',EdtNomcli.text,[locaseinsensitive,lopartialkey]);
  Dados.TbClientes.Refresh;
end;

procedure TFrmBusca.BtnConfirmaClick(Sender: TObject);
begin
  if CdsBusca.Locate('nome',EdtNomcli.text,[locaseinsensitive,lopartialkey]) then
    begin
      CdsBusca.Filtered := False;
      CdsBusca.Filter := 'upper(nome) like ' +uppercase(quotedstr('%' + EdtNomcli.Text + '%'));
      CdsBusca.Filtered := True;
      FrmBusca.Close;
    end
  else
    begin
      Application.MessageBox('Registro não encontrado!', 'Aviso', MB_ICONWarning);
      EdtNomcli.Clear;
      EdtNomcli.Setfocus;
      CdsBusca.Filtered := False;
    end;
end;
Responder
Olá a todos, resolvi o problema qto a tela de consulta, mas surgiu outro. Criei uma tela onde inseri um DBText e um DBGrid. O primeiro componente está ligado a tabela Clientes e o segundo a tabela Seguros. Consegui fazer com que o DBGrid mostrasse os seguros cadastrados por meio de uma Query. Porém, aparecem todos os seguros cadastrados pq não sei como filtrá-los, fazendo com que só sejam exibidos no grid os seguros correspondentes ao cliente mostrado no DBText. Além disso, para cada seguro há um status de "ativo" ou "inativo" que deve ser exibido por um Label. O que devo fazer pra resolver esses problemas? Segue abaixo o código da Query.     procedure TFrmSegCli.FormShow(Sender: TObject);
var
  Status: String;
begin
  QrySegCli.Close;
  QrySegCli.SQL.Clear;
  QrySegCli.SQL.Add('Select nome, ativo, modelo, placa ');
  QrySegCli.SQL.Add('from clientes inner join seguros ');
  QrySegCli.SQL.Add('on clientes.codigo=seguros.cliente');
  QrySegCli.Open;   Status := QrySegCli.FieldByName('ativo').Value;
  if Status = '0' then
    LblStatus.Caption := 'Inativo'
  else
    LblStatus.Caption := 'Ativo'
end;     Grata.
Responder
Problema resolvido.    
Responder

30/05/2011

Klaus


Problema resolvido.
 
 
 


Tenho o mesmo problema que vc falou ( o 1º), mas vc não colocou a resolução dele no forum.
Será possível que alguém atualize a questão com a solução?
Responder

29/04/2013

José

Este tópico esta sendo fechado por inatividade. Se necessário, sinalizar para que seja reaberto ou abrir um novo.
Responder