Ir para conteúdo
Fórum Script Brasil
  • 0

Type mismatch in expression


Ronaldo Lanhellas

Pergunta

Bom, ao tentar consultar um valor no meu sistema que seja um inteiro, float ele me retorna o erro Type mismatch in expression, eu acho que o erro está na pesquisa pois olha o código:

procedure TfrmModelo.btnpesquisarClick(Sender: TObject);
begin
if (cbxcampo.text <> EmptyStr) and (Edtvalor.Text <> EmptyStr) then
  begin
  Ds.DataSet.Filter := 'Upper('+Ds.DataSet.Fields[ListaField[cbxcampo.ItemIndex]].FieldName+') like '+QuotedStr(UpperCase(edtvalor.text)+'%');
  Ds.DataSet.Filtered := True;

  if not Ds.DataSet.Active then
  Ds.DataSet.Open;
  end;
end;

Eu acho que na parte que esta edtvalor.text deveria ser algo que também aceitasse um inteiro ou float, não tenho certeza se é isto mesmo !

Link para o comentário
Compartilhar em outros sites

14 respostass a esta questão

Posts Recomendados

  • 0
quando faço uma pesquisaa em um EditBox com o valor string ele pesquisa normalmente, se eu usar um integer ele já não pesquisa e da este Type mismatch expression error.

esse erro acontece quando você cria um tipo de campo no banco, e na senteça o mesmo campo está com outro tipo

exemplo:

o campo cbxcampo é do tipo Alfanumerico, então se no campo edtvalor.text voce digita uma string não ocorre o erro

mas se o campo cbxcampo é do tipo Numerico, então o operador Like não pode ser usado, mesmo que voce faça uma conversão de tipo na sentença

neste caso para procurar um valor numerico voce pode usar o IN no lugar o LIKE, ou outro operador

exemplo:

SELECT NUM, NUMVENDA
FROM Moviment
WHERE  NUMVENDA IN (1)
no seu caso deveria ser:
Ds.DataSet.Filter := 'Upper('+Ds.DataSet.Fields[ListaField[cbxcampo.ItemIndex]].FieldName+') IN '+'('+edtvalor.text+')');

abraço

Link para o comentário
Compartilhar em outros sites

  • 0

ok entendi e vou testar, porém tem ainda um problema a ser resolvido, no caso eu uso valores alfanumericos e numericos para pesquisa, por exemplo:

se um usuario quiser pesquisar pela marca ela seleciona lá na combobox "MARCA" e no campo do editbox ele escreve a marca. Porém se o usuario quiser pesquisar pelo preço, ele seleciona preço no combobox e no editbox ele coloca o preço. Resumindo, eu teria que fazer um if else para valores alfanumericos e numericos, agora como testar se o campo a se pesquisado é alfanumerico ou numerico.

mais ou menos assim:

if "edtvalor.text tiver um valor numerico" then

Ds.DataSet.Filter := 'Upper('+Ds.DataSet.Fields[ListaField[cbxcampo.ItemIndex]].FieldName+') IN '+'('+edtvalor.text+')');

else

Ds.DataSet.Filter := 'Upper('+Ds.DataSet.Fields[ListaField[cbxcampo.ItemIndex]].FieldName+') LIKE '+'('+edtvalor.text+')');

o que ficararia no if ?

Link para o comentário
Compartilhar em outros sites

  • 0
o que ficararia no if ?

exemplo:

procedure TForm1.edtvalorExit(Sender: TObject);
var
  Code, I : Integer;
begin

  Val(edtvalor.Text,Code,I);

  if Code > 0 then
    Ds.DataSet.Filter := 'Upper('+Ds.DataSet.Fields[ListaField[cbxcampo.ItemIndex]].FieldName+') IN '+'('+edtvalor.text+')')
  else
    Ds.DataSet.Filter := 'Upper('+Ds.DataSet.Fields[ListaField[cbxcampo.ItemIndex]].FieldName+') LIKE '+'('+edtvalor.text+')');

end;

abraço

Link para o comentário
Compartilhar em outros sites

  • 0

Val Procedure

Converts a string to a numeric representation.

Converte uma string em uma representação numerica

Val(edtvalor.Text,Code,I);

se voce digitar uma string o valor de Code será < 0

se voce digitar um inteiro ou um float o valor de Code será > 0

OBS: esses comandos são nativos do delphi ( F1 ) se voce não ler sobre a sintaxe desses comandos, levará muito tempo para aprender

abraço

Link para o comentário
Compartilhar em outros sites

  • 0

procedure TfrmModelo.btnpesquisarClick(Sender: TObject);
var
Code, I: Integer;
begin
if (cbxcampo.text <> EmptyStr) and (EdtValor.Text <> EmptyStr) then

  val(edtvalor.Text,Code,I);

  if Code > 0 then
  begin
  Ds.DataSet.Filter := 'Upper('+Ds.DataSet.Fields[ListaField[cbxcampo.ItemIndex]].FieldName+') IN '+QuotedStr(UpperCase(EdtValor.text)+'%');
  Ds.DataSet.Filtered := True;
  if not Ds.DataSet.Active then
  Ds.DataSet.Open;
  end

  else
  begin
  Ds.DataSet.Filter := 'Upper('+Ds.DataSet.Fields[ListaField[cbxcampo.ItemIndex]].FieldName+') LIKE '+QuotedStr(UpperCase(EdtValor.text)+'%');
  Ds.DataSet.Filtered := True;
  if not Ds.DataSet.Active then
  Ds.DataSet.Open;
  end;

end;

meu código ficou assin no final, ao procurar um número ele diz: '(' expected but "5%" found

Link para o comentário
Compartilhar em outros sites

  • 0

Ds.DataSet.Filter := 'Upper('+Ds.DataSet.Fields[ListaField[cbxcampo.ItemIndex]].FieldName+') IN '+QuotedStr(UpperCase(EdtValor.text)+'%');

com o operador IN não se pode usar %

Ds.DataSet.Filter := 'Upper('+Ds.DataSet.Fields[ListaField[cbxcampo.ItemIndex]].FieldName+') IN '+QuotedStr(UpperCase(EdtValor.text));
observe no exemplo
SELECT NUM, NUMVENDA
FROM Moviment
WHERE  NUMVENDA IN (12)

veja que é obrigatório o uso de parenteses (12) entre o numero com o operador IN

abraço

Link para o comentário
Compartilhar em outros sites

  • 0

coloquei o codigo da seguinte forma:

Ds.DataSet.Filter := 'Upper('+Ds.DataSet.Fields[ListaField[cbxcampo.ItemIndex]].FieldName+') IN '+QuotedStr(UpperCase(EdtValor.text));

porém ao digitar o numero que desejo na editbox e clicar em pesquisar ele mostra o seguinte erro: expected '(' but 32 found , no caso o 32 é o numero que eu digitei na editbox, se eu digitar 45 e clicar em pesquisar ele mostra o erro expected '(' but 45 found

Link para o comentário
Compartilhar em outros sites

  • 0
Ds.DataSet.Filter := 'Upper('+Ds.DataSet.Fields[ListaField[cbxcampo.ItemIndex]].FieldName+') IN '+QuotedStr(UpperCase(EdtValor.text));

voce erra em coisas que não deveria ... se voce não entende a mensagem de erro, fica dificil ...

erro: expected '(' but 32 found , no caso o 32 é o numero que eu digitei na editbox
erro: esperado '(' 32 encontrado .... ou seja, deveria ter um parenteses e voce não colocou

Ds.DataSet.Filter := 'Upper('+ Ds.DataSet.Fields[ListaField[cbxcampo.ItemIndex]].FieldName +') IN ('+ EdtValor.text + ')');

abraço

Link para o comentário
Compartilhar em outros sites

  • 0

PELO Contrario amigo, eu compreendi o erro só não encontrei onde faltava esse '('

veja só coloquei igualzinho voce me disse

Ds.DataSet.Filter := 'Upper('+ Ds.DataSet.Fields[ListaField[cbxcampo.ItemIndex]].FieldName +') IN ('+ EdtValor.text + ')');

mais ele mostra como se estivesse errado no ultimo parenteses, e de fato tem um parenteses a mais, porem se eu por

Ds.DataSet.Filter := 'Upper('+ Ds.DataSet.Fields[ListaField[cbxcampo.ItemIndex]].FieldName +') IN ('+ EdtValor.text + ');

também não funciona

Link para o comentário
Compartilhar em outros sites

  • 0
Ds.DataSet.Filter := 'Upper('+ Ds.DataSet.Fields[ListaField[cbxcampo.ItemIndex]].FieldName +') IN ('+ EdtValor.text + ');

faça o seguinte para testar a linha de comando

coloque um showmessage antes do Ds.DataSet.Filter para saber qual valor ele esta recebendo... verifique se esta correto

showmessage('Upper('+ Ds.DataSet.Fields[ListaField[cbxcampo.ItemIndex]].FieldName +') IN ('+ EdtValor.text + '));

abraço

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,2k
    • Posts
      651,9k
×
×
  • Criar Novo...