Tamires Postado Setembro 14, 2006 Denunciar Share Postado Setembro 14, 2006 Olá, gostaria de saber como faço pra colocar um valor real em uma SQL, sendo que ele vem de um edit.O Erro que dá é esse : Token unknown - line 1, char 81 ,Dá esse erro porque está passando para SQL o valor do campo separando as casas decimais por vírgula e tem que ser com ponto.Ex: SELECT * FROM CARA200 WHERE CARA200.COD_TAXA = 1 AND CARA200.VAL_INIFAI = 0,01 AND CARA200.VAL_FINFAI = 499,99 ORDER BY CARA200.DAT_VIGOR, CARA200.DAT_INCLUS DESCObservação : Eu programo em Delphi 7 e uso o FireBird 1.5 e IBExpert como banco de dadosEx:// *** passo os valores que a pessoa digita na tela para uma variável : try vValIniFai := StrToFloat(edtValIniFai.Text); vValFinalFai := StrToFloat(edtValFinalFai.Text); except ShowMessage('Preço inicial/final da faixa inválido.'); exit; end;//*** faço uma SQL para buscar na tabela(CARA200) os preços cadastrados para aquela faixa with (FdmList.Objects[FdmList.IndexOf('CARA200')] as Tdm) do begin cds.Close; cds.CommandText := 'SELECT * ' + 'FROM CARA200 ' + 'WHERE CARA200.COD_TAXA = ' + edtCodTaxa.Text + ' AND ' + 'CARA200.VAL_INIFAI = ' + FloatToStr(vValIniFai) + ' AND ' + 'CARA200.VAL_FINFAI = ' + FloatToStr(vValFinalFai) + ' ' + 'ORDER BY CARA200.DAT_VIGOR, CARA200.DAT_INCLUS DESC '; cds.Open; end; //*** Abaixo segue os campos que existem na tabela e que eu utilizo na SQLName: COD_TAXA - FieldTipe: INTEGER - Domain:DINTEIROName: VAL_INIFAI - FieldTipe: DECIMAL - Domain:DECIMAL12I2D - Size: 14 - Scale: 2Name: VAL_FINFAI - FieldTipe: DECIMAL - Domain:DECIMAL12I2D - Size: 14 - Scale: 2Name: DAT_VIGOR - FieldTipe: DATE - Domain:DATEName: DAT_INCLUS - FieldTipe: DATE - Domain:DATE//***Peço por favor a ajuda de vocêsMuito obrigada...bjos... Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Micheus Postado Setembro 14, 2006 Denunciar Share Postado Setembro 14, 2006 Tamires, já que seus campos são "realmente numéricos", passe os valores como parâmetro, não o "texto":with (FdmList.Objects[FdmList.IndexOf('CARA200')] as Tdm) do begincds.Close;cds.CommandText := 'SELECT * ' +'FROM CARA200 ' +'WHERE CARA200.COD_TAXA = ' + edtCodTaxa.Text + ' AND ' +'CARA200.VAL_INIFAI = :ValInicial AND ' +'CARA200.VAL_FINFAI = :ValFinal ' +'ORDER BY CARA200.DAT_VIGOR, CARA200.DAT_INCLUS DESC ';cds.Params.ParamByName('ValInicial').AsFloat := vValIniFai;cds.Params.ParamByName('ValFinal').AsFloat := vValFinalFai;cds.Open;end;Se não me engano a propriedade Params do CDS possui o método ParamByName. Se não tiver pode usar Params[0] e Params[1], respectivamente. Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Guest Visitante Postado Setembro 14, 2006 Denunciar Share Postado Setembro 14, 2006 muito obrigada Micheus...Eu já achei na internet uma função que substitui a vígula do campo por ponto. Mas vou tentar dessa maneira que você me passou também.E sobre passar os parâmetros e não o texto, não sei ao certo pois nunca usei essa propriedade(params), mas acho que a SQL só aceita dados 'Strings'.Bjos.... Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Guest Visitante Postado Setembro 14, 2006 Denunciar Share Postado Setembro 14, 2006 Ahhh.... vou deixar a função que eu consegui aqui só pra você ver e pra outras pessoas que também precisarem.function VirgPonto(Valor: string): String; Var i: Integer; begin if Valor <> ' ' then begin for i := 0 to Length(Valor) do begin if Valor[i]='.' then begin Valor[i]:=','; end else if Valor[i] = ',' then begin Valor[i]:='.'; end; end; end; Result := valor; end; procedure TForm1.Button1Click(Sender: TObject); begin Edit1.Text := VirgPonto(Edit1.Text); end; Bjuss Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Tamires Postado Setembro 14, 2006 Autor Denunciar Share Postado Setembro 14, 2006 Ichi... nem percebi que não tava logada com meu nome.... Mas agr dá pra saber que sou eu né?! Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Churc Postado Setembro 14, 2006 Denunciar Share Postado Setembro 14, 2006 opada pra saber que é você sim rsrtem maneiras mais faceis de voce então utilizar essa funcao pra trocar virgula por ponto...adicione em Usesstrutils;como seu exemplo seriaedit1.text := ansireplacetext(edit1.text, ',', '.');bjos Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Micheus Postado Setembro 14, 2006 Denunciar Share Postado Setembro 14, 2006 E sobre passar os parâmetros e não o texto, não sei ao certo pois nunca usei essa propriedade(params), mas acho que a SQL só aceita dados 'Strings'.O uso de parâmetro da forma como propus deve funcionar perfeitamente. Quando você enviar o camando ao banco (executar/abrir consulta) ele será devidamente convertido em um comando que o banco entenda.[]s Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Churc Postado Setembro 14, 2006 Denunciar Share Postado Setembro 14, 2006 também sou bem mais favorável ao que o Micheus falou....abraços Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Tamires Postado Setembro 15, 2006 Autor Denunciar Share Postado Setembro 15, 2006 Brigadão... dessa forma fica bem mais fácil mesmo...Bjuu Citar Link para o comentário Compartilhar em outros sites More sharing options...
Pergunta
Tamires
Olá, gostaria de saber como faço pra colocar um valor real em uma SQL, sendo que ele vem de um edit.
O Erro que dá é esse : Token unknown - line 1, char 81 ,
Dá esse erro porque está passando para SQL o valor do campo separando as casas decimais por vírgula e tem que ser com ponto.
Ex: SELECT * FROM CARA200 WHERE CARA200.COD_TAXA = 1
AND CARA200.VAL_INIFAI = 0,01
AND CARA200.VAL_FINFAI = 499,99
ORDER BY CARA200.DAT_VIGOR, CARA200.DAT_INCLUS DESC
Observação : Eu programo em Delphi 7 e uso o FireBird 1.5 e IBExpert como banco de dados
Ex:
// *** passo os valores que a pessoa digita na tela para uma variável :
try
vValIniFai := StrToFloat(edtValIniFai.Text);
vValFinalFai := StrToFloat(edtValFinalFai.Text);
except
ShowMessage('Preço inicial/final da faixa inválido.');
exit;
end;
//*** faço uma SQL para buscar na tabela(CARA200) os preços cadastrados para aquela faixa
with (FdmList.Objects[FdmList.IndexOf('CARA200')] as Tdm) do begin
cds.Close;
cds.CommandText := 'SELECT * ' +
'FROM CARA200 ' +
'WHERE CARA200.COD_TAXA = ' + edtCodTaxa.Text + ' AND ' +
'CARA200.VAL_INIFAI = ' + FloatToStr(vValIniFai) + ' AND ' +
'CARA200.VAL_FINFAI = ' + FloatToStr(vValFinalFai) + ' ' +
'ORDER BY CARA200.DAT_VIGOR, CARA200.DAT_INCLUS DESC ';
cds.Open;
end;
//*** Abaixo segue os campos que existem na tabela e que eu utilizo na SQL
Name: COD_TAXA - FieldTipe: INTEGER - Domain:DINTEIRO
Name: VAL_INIFAI - FieldTipe: DECIMAL - Domain:DECIMAL12I2D - Size: 14 - Scale: 2
Name: VAL_FINFAI - FieldTipe: DECIMAL - Domain:DECIMAL12I2D - Size: 14 - Scale: 2
Name: DAT_VIGOR - FieldTipe: DATE - Domain:DATE
Name: DAT_INCLUS - FieldTipe: DATE - Domain:DATE
//***
Peço por favor a ajuda de vocês
Muito obrigada...
bjos...
Link para o comentário
Compartilhar em outros sites
8 respostass a esta questão
Posts Recomendados
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.