Muitas vezes nos deparamos com telas de pesquisas que necessitam parâmetros opcionais na consulta.

A forma mais comum de resolver este problema é refazendo a query em tempo de execução de acordo com os critérios digitados nos campos, validando seu preenchimento.

O problema de utilizar este método é a dificuldade de manutenção na aplicação no caso de alguma alteração de estrutura de banco de dados ou para inserir um novo parâmetro de pesquisa.

No Exemplo que vou apresentar mostro uma forma de realizar a passagem de parâmetros de forma dinâmica de acordo com o contaúdo preenchido, bastando deixar o campo em branco ou sem seleção, no caso de Lookupcompbobox, para que os dados da consulta retornem no grid.

O exemplo eu criei com o uso de componentes ADO e banco MS Sql Server mas pode ser adaptado para qualquer banco de dados com quaisquer componentes de acesso.

Para o exemplo temos as seguintes tabelas:

create table cliente(
    IDCliente int,
    NomeCliente Varchar(50),
    Telefone Varchar(20),
    IDCidade int
)

create table Cidade(
    IDCidade int,
    NomeCidade Varchar(50)
)

Inserindo alguns dados para teste:

insert into Cidade values (1, Piracicaba)
insert into Cidade values (2, Catanduvas)
insert into Cidade values (3, São Miguel do Iguaçu)

Insert into cliente values (1, Raul Seixas, 3355-5588, 1)
Insert into cliente values (1, Zeca Baleiro, 4466-5566, 1)
Insert into cliente values (1, Dudu Nobre,9665-5566, 2)
Insert into cliente values (1, Roberto Carlos, 3144-5566, 3)
Insert into cliente values (1, Gilberto Gil, 4433,6644, 3)

A tela da aplicação fica conforme a figura 1.

Figura1.jpg
Figura 1 - Tela para entrada de parâmetros

As queries ficam da seguinte forma:

QryCidade:
select IDCidade, NomeCidade
from cidade

QryCliente: (Aqui está o segredo)
Select NomeCliente, Telefone
from cliente
where NomeCliente like :Nome + %
and (IDCidade = :idcidade or :idcidade1 = 0)

Note que está sendo utilizado o operador "OR" para comparar os parâmetros, desta forma, quando idCidade e idCidade1 recebem 0 retorna todas as ocorrências.

Traduzindo, a query que seria enviada ao banco de dados, após a passagem dos parâmetros, supondo o parâmetro :nome = raul e o parâmetro idcidade = 0, ficaria da seguinte forma:

Select NomeCliente, Telefone
from cliente
where NomeCliente like raul%
and (ICidade = 0 or 0 = 0)

Veja que o mecanismo da query compara o idcliente com 0 ou o 0 com 0, logicamente retornando todas as cidades, pois o idcidade será ignorado devido o operador OR.

Vamos a codificação disso tudo...

Configure as propriedades de dblookupcombobox1 conforme a figura 2.

Figura2.jpg
Figura 2 - Propriedades do dblookupcombobox1

Aponte a propriedade DataSource de dbGrid1 para dsCliente.

procedure TForm1.FormShow(Sender: TObject);
begin
  qryCidade.Open;
end;

procedure TForm1.btnTodosClick(Sender: TObject);
begin
  DBLookupComboBox1.KeyValue := null;
end;

O código do botão btnLocaliza fica da seguinte forma:

procedure TForm1.btnLocalizarClick(Sender: TObject);
var
  vIDCidade: Integer;
begin
  if DBLookupComboBox1.KeyValue = null then
    vIDCidade := 0
  else
    vIDCidade := DBLookupComboBox1.KeyValue;
  with qryCliente do
  begin
    Close;
    Parameters.ParamByName(nome).Value := Edit1.Text;
    Parameters.ParamByName(idcidade).Value := vIDCidade;
    Parameters.ParamByName(idcidade1).Value := vIDCidade;
    Open;
  end;
end;

Foi criada uma variável para retornar 0 quando o keyvalue de dblookupconbobox1 form null ou o próprio keyvalue quando tiver alguma cidade selecionada.
Daí temos a passagem dos parâmtros da tela para a query qryCliente.

Concluindo, verifica-se que com esta técnica podemos realizar consultas com parâmetros opcionais e, desta forma, facilitando a manutenção no código do sistema.