Filtrar DbGrid
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.
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.
Simone Grandini
Curtidas 0
Respostas
Pjrm1470
11/01/2010
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.
GOSTEI 0
Simone Grandini
11/01/2010
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;
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;
GOSTEI 0
Simone Grandini
11/01/2010
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.
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.
GOSTEI 0
Simone Grandini
11/01/2010
Problema resolvido.
GOSTEI 0
Klaus
11/01/2010
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?
GOSTEI 0
José
11/01/2010
Este tópico esta sendo fechado por inatividade. Se necessário, sinalizar para que seja reaberto ou abrir um novo.
GOSTEI 0