Array
(
)

Filtro não funciona no sqlServer 2008

Renegreiros
   - 10 set 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?

Alisson
|
MVP
Pontos: 3400
    10 set 2014

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.

Renegreiros
   - 11 set 2014

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.

Marcos P
   - 11 set 2014

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 ?

Renegreiros
   - 12 set 2014

Quem retorna o erro é o delphi

William (devwilliam)
   - 12 set 2014

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

#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;

Marcos P
   - 12 set 2014

A query roda direto no banco ?

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

Renegreiros
   - 16 set 2014

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.