Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Lívio Bruno

Pesquisar mais de um campo

Recommended Posts

Bom dia pessoal,

 

bom... uso Delphi 2010, ADOTable, três Edit's e Banco de dados Access e desejo fazer uma pesquisa que filtre os dados dos três edit's. Fiz dessa forma:

 

DM.TBL_AMIGOS.Close;

DM.TBL_AMIGOS.Open;

 

DM.TBL_AMIGOS.Filtered := False;

DM.TBL_AMIGOS.Filter := 'Nome =' + quotedstr(Edit2.Text) + 'and Data_de_nascimento =' + quotedstr(Edit8.Text) + 'and Titulo =' + quotedstr(Edit5.Text);

DM.TBL_AMIGOS.Filtered := True;

 

Até aqui tudo bem mas, o problema é que se eu deixar um dos edit's em branco o filtro não funciona. Se alguém puder me ajudar a fazer com que o filtro continue funcionando eu agradeceria e muito!

 

Obrigado pela atenção.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Fala Lívio, pelo que notei, você está utiliza sentença and que a tradução E, ao invés de and coloque OR que tradução é OU.

DM.TBL_AMIGOS.Filter := 'Nome =' + quotedstr(Edit2.Text) + 'or Data_de_nascimento =' + quotedstr(Edit8.Text) + 'or Titulo =' + quotedstr(Edit5.Text);

Acho que isso irá te ajudar.

Abraço

Compartilhar este post


Link para o post
Compartilhar em outros sites

Media, acho que a questão aqui é um pouco mais complexa do que simplesmente mudar o and pelo or no código do colega Lívio. Cabe aqui a seguinte pergunta: que tipo de pesquisa está tentando ser realizada neste filtro? Para retornar os dados é obrigatório que nos registros selecionados existam os todos os dados passados por parâmetro ou só um deles? Se for para retornar todos os registros que tenham apenas um dos campos passados por referência, então a troca do and pelo or resolve. Agora, se quando eu informar só o nome e o título por exemplo a consulta deva retornar somente registros que contenham os dois campos com os valores referenciados, ai há a necessidade de alterar o código do Lívio para que a consulta sql seja montada de acordo com os campos de pesquisa usando and.

 

Lívio, explique melhor o que está tentando fazer por favor.

Compartilhar este post


Link para o post
Compartilhar em outros sites

?

 

Media, acho que a questão aqui é um pouco mais complexa do que simplesmente mudar o and pelo or no código do colega Lívio. Cabe aqui a seguinte pergunta: que tipo de pesquisa está tentando ser realizada neste filtro? Para retornar os dados é obrigatório que nos registros selecionados existam os todos os dados passados por parâmetro ou só um deles? Se for para retornar todos os registros que tenham apenas um dos campos passados por referência, então a troca do and pelo or resolve. Agora, se quando eu informar só o nome e o título por exemplo a consulta deva retornar somente registros que contenham os dois campos com os valores referenciados, ai há a necessidade de alterar o código do Lívio para que a consulta sql seja montada de acordo com os campos de pesquisa usando and.

 

Lívio, explique melhor o que está tentando fazer por favor.

 

 

 

É... o negócio é meio complicado... o que eu quero é um botão que filtre três edits de uma vez e somente um deles também ou seja com esses códigos que postei eu só consigo filtrar os três edits de uma vez e o primeiro edit, quando faço a pesquisa com o primeiro e o segundo edits vazios dá erro.

 

Vou explicar de outra forma: Tenho um DataModule, ADOConection, ADOTable, DataSource e BD ACCESS. A tabela tem 29 campos, o FORM tem 28 Edits, 1 ComboBox, 1 DBGrid e 4 Buttons sendo que um dos buttons é o de pesquisa. Agora o que eu quero é filtrar a quantidade de Edits(Campos) que eu desejar e o resultado apareça no DBGrid por exemplo:

 

Quero saber quantas pessoas cadastradas com o nome João com data de nascimento 19/03/1991 residentes no Pará existem no meu banco de dados e assim sucessivamente com todos os registros da tabela.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Lívio, o que eu coloquei foi o seguinte: sempre que usar o and, sua pesquisa obrigará que todos os filtros da consulta sejam satisfeitos... assim, deixar algum dos filtros em branco só funcionaria para filtrar registros onde estes mesmos campos fossem vazios, entende? Se sua pesquisa varia de acordo com que edits forem preenchidos pelo usuário, você não pode fixar no filtro uma regra fixa com todos os campos possíveis de filtragem sendo passados ao mesmo tempo, pois o and obrigará que os registros retornados atendam aos 3 filtros obrigatóriamente. Se usar o or, como sugerido pelo Media, se o usuário preencher os 3 filtros mas o registro só possuir um dos 3 preenchido com o valor informado pelo usuário o mesmo será retornado, visto que o or obrigaria o registro a ter pelo menos 1 campo que atenda os filtros selecionados. Essa diferença é uma regra básica de SQL, que você deve ter em mente sempre que montar um filtro. A questão que deixei antes era exatamente para entender se os registros retornados pelo seu filtro deveriam atender a pelo menos um dos filtros informados (o que permitiria o uso do or apenas como sugerido pelo Media) ou se deveriam atender a todos os filtros informados pelo usuário, independente dele informar apenas 1, 2, 3 ou mais filtros. Considerando que o modelo implementado seja o segundo, que é o que sua explicação dá a entender, você não pode simplesmente jogar no filtro os 3 campos de filtragem o tempo todo, visto que você não obriga o usuário a informar todos eles para a execução da consulta. Você terá que montar os filtros dinâmicamente, de acordo com os campos preenchidos pelo usuário, usando o and. Algo do tipo:

 

var sFiltros: string;
begin
sFiltros := '';

if Edit2.text <> ''
begin
	sFiltros := 'Nome =' + quotedstr(Edit2.Text);
end

if	Edit5.text <> ''
begin
	if sFiltros <> ''
		sFiltros := sFiltros + 'and Titulo =' + quotedstr(Edit5.Text);
	else
		sFiltros := 'Titulo =' + quotedstr(Edit5.Text);
end	

if	Edit8.text <> ''
begin
	if sFiltros <> ''
		sFiltros := sFiltros + 'and Data_de_nascimento =' + quotedstr(Edit8.Text);
	else
		sFiltros := 'Data_de_nascimento =' + quotedstr(Edit8.Text);
end

DM.TBL_AMIGOS.Close;
DM.TBL_AMIGOS.Open;

DM.TBL_AMIGOS.Filtered := False;		
DM.TBL_AMIGOS.Filter := sFiltros;
DM.TBL_AMIGOS.Filtered := True;
end

 

Ps.: montei o código na mão, já que no serviço não uso delphi aqui... pode precisar de ajustes.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Valeu pela idéia amigão funcionou dessa forma:

 

procedure TFRM_ADD_DEL.BitBtn8Click(Sender: TObject);

var

sFiltros: string;

begin

 

sFiltros := '';

 

if (Edit2.text <> '') then

begin

sFiltros := 'Nome =' + quotedstr(Edit2.Text);

end else

begin

if (Edit8.text <> '') then

begin

sFiltros := 'Data_de_nascimento =' + quotedstr(Edit8.Text);

end else

begin

if (Edit5.text <> '') then

begin

sFiltros := 'Titulo =' + quotedstr(Edit5.Text);

end;

end;

 

end;

 

 

DM.TBL_AMIGOS.Close;

DM.TBL_AMIGOS.Open;

 

DM.TBL_AMIGOS.Filtered := False;

DM.TBL_AMIGOS.Filter := sFiltros;

DM.TBL_AMIGOS.Filtered := True;

 

Obrigado pela ajuda!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Só um comentário final Livio... da forma que codificou, o usuário nunca conseguirá filtrar por mais de um campo ao mesmo tempo, mesmo preenchendo todos os edits... a forma que postei visava permitir filtrar por 1 ou N edits ao mesmo tempo.

 

Da forma que montou, só vai funcionar para filtrar por 1 edit por vez. ;)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Só um comentário final Livio... da forma que codificou, o usuário nunca conseguirá filtrar por mais de um campo ao mesmo tempo, mesmo preenchendo todos os edits... a forma que postei visava permitir filtrar por 1 ou N edits ao mesmo tempo.

 

Da forma que montou, só vai funcionar para filtrar por 1 edit por vez. ;)

 

 

OPS!... é verdade mas do seu jeito também não funcionou. Estava dando erro por causa dessa linha:

 

DM.TBL_AMIGOS.Filter := sFiltros;

 

Vou explicar... essa variável, sFiltros, está recebendo o valor de cada campo quando percorre a tabela então ela recebe somento o valor do campo aonde para no código. Para que ela podesse fazer a pesquisa por mais campos de uma vez teríamos que somar os filtros dos campos ficando com essa estrutura:

 

procedure TFRM_ADD_DEL.BitBtn8Click(Sender: TObject);

var

Filtro, Soma_Filtro: string;

cont: Integer;

begin

 

Filtro := '';

Soma_Filtro := '';

cont := 0;

 

if (Edit1.text <> '') then

begin

Filtro := 'COD =' + quotedstr(Edit1.Text);

Soma_Filtro := Soma_Filtro + Filtro;

end else // Aqui não precisa tirar o else pois o campo COD não se repete

 

begin

if (Edit2.text <> '') then

begin

cont := cont + 1;

if cont = 1 then

begin

Filtro := 'Nome =' + quotedstr(Edit2.Text);

Soma_Filtro := Soma_Filtro + Filtro;

end else

begin

Filtro := 'and Nome =' + quotedstr(Edit2.Text);

Soma_Filtro := Soma_Filtro + Filtro;

end;

end; //Se você colocar um else aqui o código para

 

begin

if (Edit8.text <> '') then

begin

cont := cont + 1;

if cont = 1 then

begin

Filtro := 'Data_de_nascimento =' + quotedstr(Edit8.Text);

Soma_Filtro := Soma_Filtro + Filtro;

end else

begin

Filtro := 'and Data_de_nascimento =' + quotedstr(Edit8.Text);

Soma_Filtro := Soma_Filtro + Filtro;

end;

end; //Se você colocar um else aqui o código para

 

begin

if (Edit5.text <> '') then

begin

cont := cont + 1;

if cont = 1 then

begin

Filtro := 'Titulo =' + quotedstr(Edit5.Text);

Soma_Filtro := Soma_Filtro + Filtro;

end else

begin

Filtro := 'and Titulo =' + quotedstr(Edit5.Text);

Soma_Filtro := Soma_Filtro + Filtro;

end;

end;

 

end;

end;

end;

 

Variável Filtro: É a variável que vai receber o filtro do campo.

Variável cont: É a variável que vai definir se o filtro vai levar and na frente do campo ou não. Exemplo: 'and Titulo =' + quotedstr(Edit5.Text);

Variável Soma_Campo: É a variável que vai receber a soma de todos os campos ficando assim:

 

DM.TBL_AMIGOS.Filter := Soma_Filtro;

 

Que é o mesmo que:

 

DM.TBL_AMIGOS.Filter := 'Nome =' + quotedstr(Edit2.Text) + 'and Titulo =' + quotedstr(Edit5.Text);

 

Mas é isso aí... duas cabeças pensaum melhor do que uma e assim sucessivamente.

 

Obrigado pela atenção!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom, o que você fez é praticamente o que eu fiz, mas usando uma variável a mais.... rs.

 

OPS!... é verdade mas do seu jeito também não funcionou. Estava dando erro por causa dessa linha:

 

DM.TBL_AMIGOS.Filter := sFiltros;

 

Bom, só uma pergunta: você debugou o código que eu tinha postado e verificou o valor da variável sFiltros na hora que deu o erro na linha acima indicada? Só de bater o olho no código que eu tinha deixado postado, vi que o espaço que tinha que ter nos trechos que concatenava os and estava faltando (não sei se foi erro meu ou se usar a tag code do fórum comeu o espaço em branco agora rs), mas o provável é que a concatenação na sFiltros tenha gerado uma string onde os and vinham colados ao valor com QuotedStr do Edit anterior... assim, se o Edit2 tinha o valor José e o 5 tinha o valor 123 por exemplo, a variável sFiltro deveria estar montando algo do tipo Nome ='José'and Titulo ='123', ao invés de Nome = 'José' and Titulo = '123', o que gerava o erro na linha reportada.

 

De todo modo, eu havia dito que o código talvez precisasse de ajustes rs... mas se o problema já está resolvido então beleza. Sucesso!!

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.