Pesquisa com vários campos de busca
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:
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?
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
Curtidas 0
Melhor post
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
10/05/2017
Isso mesmo, monte sua consulta de maneira dinâmica.
Segue exemplo:
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
10/05/2017
E na propriedade sql da query eu deixo como?
GOSTEI 0
Natanael Ferreira
10/05/2017
Se você usa esta Query apenas para esta consulta, você pode deixar em branco ou apenas:
No exemplo que passei esta propriedade será limpada e preenchida dinamicamente quando aquele código for chamado.
select * from pacientes
No exemplo que passei esta propriedade será limpada e preenchida dinamicamente quando aquele código for chamado.
GOSTEI 1