Filtro não funciona no sqlServer 2008

10/09/2014

Uns dias atrás postei aqui no fórum uma dúvida referente a um filtro de pesquisa, e seguindo a dica funcionou corretamente. Estou desenvolvendo outra aplicação mas o Banco de Dados é o SqlServer 2008 e pensei em usar o mesmo filtro dada a sua grande funcionalidade. Mas está dando erro de novo e gostaria de novamente pedir ajudar
segue o código:

begin
if ds.DataSet.FieldByName(CampoFiltro) is TWideStringField then
begin
ds.DataSet.Filter := CampoFiltro + ' like ' + QuotedStr( '*' + edtFiltro.Text + '*');
end
else
begin
ds.DataSet.Filter := CampoFiltro +'='+ edtFiltro.Text;
end;
ds.DataSet.Filtered := True;

end;

ele retorna o seguinte erro:
os argumentos sao incorretos, estão fora do intervalo aceitável ou estão em conflito
se eu pesquipo pelo codigo a pesquisa corre tudo bem, mas quando poe letras, numa pesquisa por nome por exemplo dá esse erro. O que estou errando?

Renegreiros

Respostas

10/09/2014

Alisson

O seu campo filtro qual é o que está verificando?
Pelo que pude entender está fazendo um like em um campo int e passando string para ele.
Responder Citar

11/09/2014

Renegreiros

O filtro ele faz busca por número, que é o código do cliente, e deveria fazer por nome. É possível que seja isso mesmo que você disse, o que não entendo é que ele funcionava muito bem em outra aplicação, que utilizava o firebird, mas quando utilizo a mesma regra no filtro no sqlserver não funciona.
Responder Citar

11/09/2014

Marcos P

Quem retorna o erro, o Delphi ou o Sql Server ?

Se for o Sql Server, você poderia colocar um exemplo de uma query final, passada ao banco, quando o erro ocorre ?
Responder Citar

12/09/2014

Renegreiros

Quem retorna o erro é o delphi
Responder Citar

12/09/2014

William (devwilliam)

Tente assim, substituindo '*' por '%':

begin
if ds.DataSet.FieldByName(CampoFiltro) is TWideStringField then
begin
ds.DataSet.Filter := CampoFiltro + ' like ' + QuotedStr( '%' + edtFiltro.Text + '%');
end
else
begin
ds.DataSet.Filter := CampoFiltro +'='+ edtFiltro.Text;
end;
ds.DataSet.Filtered := True;

end;
Responder Citar

12/09/2014

Marcos P

A query roda direto no banco ?

Coloca aqui um exemplo de uma query final, passada ao banco, quando o erro ocorre ?
Responder Citar

16/09/2014

Renegreiros

Amigos procurei a resposta nesses dias sobre o problema do filtro. Encontrei a resposta posto aqui para que seja útil para outros também.

procedure TfrmModelodados.btnPesquisarClick(Sender: TObject);
begin
if ds.DataSet.FieldByName(CampoFiltro) is TStringField then
begin
ds.DataSet.Filter := CampoFiltro+' like '+ QuotedStr('*'+edtFiltro.Text+'*');
end
else begin
ds.DataSet.Filter := CampoFiltro+'='+edtFiltro.Text;
end;
ds.DataSet.Filtered := True;
end;

antes estava usando TWideStringField mudei para TSTringField assim o Filtro funcionou como era esperado.
obrigado pelas dicas.
Responder Citar