Erro ao usar o filter do TFDQuery

28/06/2020

0

estou criando uma tela de pesquisa, mas quando eu uso o filter do componente ele me retorna o seguinte erro.
[FireDAC][Stan][Eval]-118. Error evaluating expression. Could not convert variant of type (UnicodeString) into type (Double).

Abaixo o comando.

with qryPesq do
      begin
         Filtered := False;
         Filter   := 'Upper('+sCampo_Pesquisa+') Like ' + UpperCase(QuotedStr('%' + edtPesquisa.Text + '%'));
         if cbxAtivo.ItemIndex < 2 then
            Filter   := Filter + ' and ' + sCampo_Ativo + ' = ' + IntToStr(cbxAtivo.ItemIndex);
         Filtered := True;
end;

Quando eu não coloco a parte do campo ativo, o filter funciona corretamente.
Lembrando que eu estou fazendo um tela de pesquisa. aonde eu possa chamar ela por uma function.

Segue o select que eu estou passando para o componente TFDQuery

SELECT PAR_ID, PAR_DESCRICAO, 
                  case PAR_ATIVO 
                 when 0 then 'Não' 
                 when 1 then 'Sim' 
                 end as Ativo 
                 FROM participantes
André Franzoi

André Franzoi

Responder

Post mais votado

28/06/2020

Boa noite...
Chefe faz o seguinte .:

if cbxAtivo.ItemIndex < 2 then
Filter := 'Upper('+sCampo_Pesquisa+') Like ' + UpperCase(QuotedStr('%' + edtPesquisa.Text + '%')) + ' and ' + sCampo_Ativo + ' = ' + IntToStr(cbxAtivo.ItemIndex)
else
Filter := 'Upper('+sCampo_Pesquisa+') Like ' + UpperCase(QuotedStr('%' + edtPesquisa.Text + '%'));

Marcos Junior

Marcos Junior
Responder

Mais Posts

29/06/2020

André Franzoi

Boa noite...
Chefe faz o seguinte .:

if cbxAtivo.ItemIndex < 2 then
Filter := ''Upper(''+sCampo_Pesquisa+'') Like '' + UpperCase(QuotedStr(''%'' + edtPesquisa.Text + ''%'')) + '' and '' + sCampo_Ativo + '' = '' + IntToStr(cbxAtivo.ItemIndex)
else
Filter := ''Upper(''+sCampo_Pesquisa+'') Like '' + UpperCase(QuotedStr(''%'' + edtPesquisa.Text + ''%''));


Boa noite amigo.
Continuou com o mesmo erro.

Eu tenho o mesmo código só que com o componnete zeus e não tenho essa dor de cabeça.

Obrigado.
Responder

29/06/2020

Emerson Nascimento

tente algo assim:
with qryPesq do
begin
      Filtered := False;
      Filter   := 'Upper('+sCampo_Pesquisa+') Like ' + UpperCase(QuotedStr('%' + edtPesquisa.Text + '%'));
      if cbxAtivo.ItemIndex < 2 then
            Filter   := Filter + ' and cast(' + sCampo_Ativo + ' as float) = ' + IntToStr(cbxAtivo.ItemIndex);
      Filtered := True;
end;

usei a função cast() para transformar o conteúdo do campo "sCampo_Ativo" em numérico (float), para comparar com o valor de cbxAtivo.ItemIndex, que também é um número.
não vi no teu post indicação de qual banco de dados você utiliza, então adeque o comando à sintaxe correta do teu banco.
tornei a transformação de tipos explícita porque muitas vezes o driver não consegue optar pelos tipos certos.
Responder

29/06/2020

André Franzoi

tente algo assim:
with qryPesq do
begin
      Filtered := False;
      Filter   := 'Upper('+sCampo_Pesquisa+') Like ' + UpperCase(QuotedStr('%' + edtPesquisa.Text + '%'));
      if cbxAtivo.ItemIndex < 2 then
            Filter   := Filter + ' and cast(' + sCampo_Ativo + ' as float) = ' + IntToStr(cbxAtivo.ItemIndex);
      Filtered := True;
end;

usei a função cast() para transformar o conteúdo do campo "sCampo_Ativo" em numérico (float), para comparar com o valor de cbxAtivo.ItemIndex, que também é um número.
não vi no teu post indicação de qual banco de dados você utiliza, então adeque o comando à sintaxe correta do teu banco.
tornei a transformação de tipos explícita porque muitas vezes o driver não consegue optar pelos tipos certos.


Desculpa faltou mesmo citar o banco, estou utilizando o sqlserver
Responder

29/06/2020

André Franzoi

tente algo assim:
with qryPesq do
begin
      Filtered := False;
      Filter   := 'Upper('+sCampo_Pesquisa+') Like ' + UpperCase(QuotedStr('%' + edtPesquisa.Text + '%'));
      if cbxAtivo.ItemIndex < 2 then
            Filter   := Filter + ' and cast(' + sCampo_Ativo + ' as float) = ' + IntToStr(cbxAtivo.ItemIndex);
      Filtered := True;
end;

usei a função cast() para transformar o conteúdo do campo "sCampo_Ativo" em numérico (float), para comparar com o valor de cbxAtivo.ItemIndex, que também é um número.
não vi no teu post indicação de qual banco de dados você utiliza, então adeque o comando à sintaxe correta do teu banco.
tornei a transformação de tipos explícita porque muitas vezes o driver não consegue optar pelos tipos certos.


Bom dia, Agora está com o seguinte retorno.
[FireDAC][Stan][Eval]-100. Column or function [cast] is not found. Hint: if the name is a function name, then add FireDAC.Stan.ExprFuncs to uses clause
Responder

Assista grátis a nossa aula inaugural

Assitir aula

Saiba por que programar é uma questão de
sobrevivência e como aprender sem riscos

Assistir agora

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar