Pesquisa com vários campos de busca

Delphi

10/05/2017

Boa tarde! Em um formulário de pesquisa tenho 4 edits, EditNome onde busca pelo nome, EditProntGrad, EditProntPos, EditProntEmer (ambos buscam pelo número do prontuário). O usuário tem a opção de preencher um ou varios campos. Estou usando dbexpress, na sql da query coloquei:

select * from pacientes
where UPPER (nome_paciente) like UPPER (:NomePaciente)
or pront_grad = :ProntGrad
or pront_pos = :ProntPos
or pront_emerg = :ProntEmerg

No código fiz o seguinte:

  ClientPacientes.Close;
  QueryPacientes.Close;
// Edit Nome
   if EditPaciente.Text <> ' ' then
   begin
    QueryPacientes.ParamByName('NomePaciente').AsString
    := '%' + EditPaciente.Text + '%';
   end
    else
     begin
      QueryPacientes.ParamByName('NomePaciente').AsString := '%%';
     end;
 //Edit Pront Grad
   if EditGrad.Text <> ' ' then
   begin
     QueryPacientes.ParamByName('ProntGrad').AsString := EditGrad.Text;
   end;
// Edit Pront Pos
   if EditPos.Text <> ' ' then
   begin
     QueryPacientes.ParamByName('ProntPos').AsString := EditPos.Text;
   end;
if EditEmerg.Text <> ' ' then
   begin
     QueryPacientes.ParamByName('ProntEmerg').AsString := EditEmerg.Text;
   end;

QueryPacientes.Open;
ClientPacientes.Open;



Se o usuario digita no campo nome a pesquisa está ok, mas se digita em algum dos campos de pront a dbgrid me traz todos os dados e não somente o desejado. Alguém pode me ajudar na solução?
Deise Souza

Deise Souza

Curtidas 0

Melhor post

Jones Granatyr

Jones Granatyr

10/05/2017

Olá! No seu comando SQL você precisa colocar um "and" ao invés de "or". Nesse caso, eu sugiro que você construa o SQL dinamicamente de acordo com o que o usuário selecionar na interface, e passando esse comando para a query (qry.Sql.Add)
GOSTEI 2

Mais Respostas

Natanael Ferreira

Natanael Ferreira

10/05/2017

Isso mesmo, monte sua consulta de maneira dinâmica.

Segue exemplo:

var
  SqlWhereAnd: string;
begin
  ClientPacientes.Close;

  with QueryPacientes do
  begin
    Close;
    SQL.Clear;
    SQL.Add('select * from pacientes');

    SqlWhereAnd := 'where';
    // Edit Nome
    if Trim(EditPaciente.Text) <> EmptyStr then
    begin
      SQL.Add(SqlWhereAnd + ' UPPER(nome_paciente) like UPPER(:NomePaciente)');
      ParamByName('NomePaciente').AsString := '%' + EditPaciente.Text + '%';
      SqlWhereAnd := ' and ';
    end;

    // Edit Pront Grad
    if EditGrad.Text <> EmptyStr then
    begin
      SQL.Add(SqlWhereAnd + ' pront_grad = :ProntGrad');
      ParamByName('ProntGrad').AsString := EditGrad.Text;
      SqlWhereAnd := ' and ';
    end;

    // Edit Pront Pos
    if EditPos.Text <> EmptyStr then
    begin
      SQL.Add(SqlWhereAnd + ' pront_pos = :ProntPos');
      ParamByName('ProntPos').AsString := EditPos.Text;
      SqlWhereAnd := ' and ';
    end;

    if EditEmerg.Text <> EmptyStr then
    begin
      SQL.Add(SqlWhereAnd + ' pront_emerg = :ProntEmerg');
      ParamByName('ProntEmerg').AsString := EditEmerg.Text;
      SqlWhereAnd := ' and ';
    end;

    Open;
  end;

  ClientPacientes.Open;
end;
GOSTEI 1
Deise Souza

Deise Souza

10/05/2017

E na propriedade sql da query eu deixo como?
GOSTEI 0
Natanael Ferreira

Natanael Ferreira

10/05/2017

Se você usa esta Query apenas para esta consulta, você pode deixar em branco ou apenas:

select * from pacientes


No exemplo que passei esta propriedade será limpada e preenchida dinamicamente quando aquele código for chamado.
GOSTEI 1
POSTAR