En casos como este yo he tenido que darle varias vueltas al asunto y no ha podido ser con null's... asi que lo que he hecho es crear valores "bandera" que me indican como actuar... algo como
Código:
where (:TodosLosClientes = 'S' or IdCliente = :IdCliente) and
(:TodosLosTipos = 'S' or idTipo = :idTipo)
Es bastante engorroso, porque luego en delphi tenes que estar condicionando las asignaciones... pero al final, vas a obtener el resultado deseado:
Código:
q1.ParamByName('TodosLosClientes').AsString := IfThenElse(eCliente.Text = '', 'S', 'N');
q1.ParamByName('idCliente').AsInteger := IntToStr(eCliente.Text);
// esto en un try/except o alguna función que devuelva cualquier valor al elevarse la excepción...
q1.ParamByName('TodosLosTipos').AsString := IfThenElse(eTipo.Text = '', 'S', 'N');
q1.ParamByName('idTipos').AsString := eTipo.Text;
etc, etc...
Hasta luego.