FormatFloat!!!!!!!!

Delphi

14/03/2005

Colegas..

Trabalho com SQL para inserir dados numa tabela paradox, o campo é tipo float..

Quando dou um FormatFloat(´0.00´, valor), e mando o sql, o banco retorna ´type mismatch error´, isto é o valor não é valido, quando debugo aparece ex: ´256,35´, daí direto no banco ele só aceita ´256.35´, isto é o decimal separator tem que ser ´.´, mas como fazer isso, já tentei de todas as forma e nada..

Uso delphi 5, e Paradox..

Agradeço a atenção


Cabelo

Cabelo

Curtidas 0

Respostas

Rômulo Barros

Rômulo Barros

14/03/2005

procedure TForm1.Button2Click(Sender: TObject);
Var
   Teste : String;
begin
   Teste := ´256,89´;
   StringReplace(Teste,´,´,´.´,[]);
end;



GOSTEI 0
Cabelo

Cabelo

14/03/2005

O problema é que se eu colocar assim, o banco entende como separador de milhares..

aí está o problema, na hora d visualizaros dados aparece como separador de milhares, se fizer isso com cada dado que aparecerá na tela, irá ficar muito lento, tenho que gravar de forma que o banco entenda..


GOSTEI 0
Fred

Fred

14/03/2005

a mascara para ponto( . ) eh ´,´ tipo #,0.00 que seria 1.000,00;
0.00 seria 1000,00 e , creio que daria isso 1.000 e no seu caso, tenta 0,00 ou seja o ponto eh a virgula e a virgula eh o ponto!! entendeu!! ve ae se funga!!! :?


GOSTEI 0
Levisants

Levisants

14/03/2005

StringReplace(campo ou variavel,DecimalSeparator,´.´,[rfReplaceAll]);
StringReplace(campo ou variavel,ThousandSeparator,´´,[rfReplaceAll]);


GOSTEI 0
Cabelo

Cabelo

14/03/2005

Colegas..

Como faço para pegar o retorno do evento click num ImputBox..

Preciso saber se foi o Ok, ou o cancel..


GOSTEI 0
Rômulo Barros

Rômulo Barros

14/03/2005

Cabelo, vc poderá utilizar o [b:06297928e1]InputQuery [/b:06297928e1]ao invés do [b:06297928e1]InputBox[/b:06297928e1].

If(InputQuery... ... ..())Then
  Showmessage(´Clicou em ok´);


Se vc for dentro da Unit [b:06297928e1]Dialogs[/b:06297928e1], irá ver que internamente o método [b:06297928e1]InputBox[/b:06297928e1] executa o método [b:06297928e1]InputQuery[/b:06297928e1]


[u:06297928e1][b:06297928e1]Veja:[/b:06297928e1][/u:06297928e1]
function InputBox(const ACaption, APrompt, ADefault: string): string;
begin
  Result := ADefault;
  InputQuery(ACaption, APrompt, Result);
end;



[u:06297928e1][b:06297928e1]MÉTODO INPUTQUERY:[/b:06297928e1][/u:06297928e1]

Verifique q o [b:06297928e1]InputQuery[/b:06297928e1] possui os botões definidos como [b:06297928e1]mrOk [/b:06297928e1]e [b:06297928e1]mrCancel[/b:06297928e1]. Com isso, vc poderá capturar o botão q foi clicado.

function InputQuery(const ACaption, APrompt: string;
  var Value: string): Boolean;
var
  Form: TForm;
  Prompt: TLabel;
  Edit: TEdit;
  DialogUnits: TPoint;
  ButtonTop, ButtonWidth, ButtonHeight: Integer;
begin
  Result := False;
  Form := TForm.Create(Application);
  with Form do
    try
      Canvas.Font := Font;
      DialogUnits := GetAveCharSize(Canvas);
      BorderStyle := bsDialog;
      Caption := ACaption;
      ClientWidth := MulDiv(180, DialogUnits.X, 4);
      Position := poScreenCenter;
      Prompt := TLabel.Create(Form);
      with Prompt do
      begin
        Parent := Form;
        Caption := APrompt;
        Left := MulDiv(8, DialogUnits.X, 4);
        Top := MulDiv(8, DialogUnits.Y, 8);
        Constraints.MaxWidth := MulDiv(164, DialogUnits.X, 4);
        WordWrap := True;
      end;
      Edit := TEdit.Create(Form);
      with Edit do
      begin
        Parent := Form;
        Left := Prompt.Left;
        Top := Prompt.Top + Prompt.Height + 5;
        Width := MulDiv(164, DialogUnits.X, 4);
        MaxLength := 255;
        Text := Value;
        SelectAll;
      end;
      ButtonTop := Edit.Top + Edit.Height + 15;
      ButtonWidth := MulDiv(50, DialogUnits.X, 4);
      ButtonHeight := MulDiv(14, DialogUnits.Y, 8);
      with TButton.Create(Form) do
      begin
        Parent := Form;
        Caption := SMsgDlgOK;
        ModalResult := mrOk;
        Default := True;
        SetBounds(MulDiv(38, DialogUnits.X, 4), ButtonTop, ButtonWidth,
          ButtonHeight);
      end;
      with TButton.Create(Form) do
      begin
        Parent := Form;
        Caption := SMsgDlgCancel;
        ModalResult := mrCancel;
        Cancel := True;
        SetBounds(MulDiv(92, DialogUnits.X, 4), Edit.Top + Edit.Height + 15,
          ButtonWidth, ButtonHeight);
        Form.ClientHeight := Top + Height + 13;          
      end;
      if ShowModal = mrOk then
      begin
        Value := Edit.Text;
        Result := True;
      end;
    finally
      Form.Free;
    end;
end;


_________________________________
Utilize a pesquisa do fórum


GOSTEI 0
Emerson Nascimento

Emerson Nascimento

14/03/2005

voltando à primeira pergunta...

se o campo é do tipo float e a variável também, pra que usar o FormatFloat()? é só passar o parâmetro normalmente:

query.parambyname(´valor´).asfloat := valor;

se você não usa parâmetros, pense em usar, pois haverá momentos em que será necessário trabalhar com datas, valores e outros tipos de dados com formatações diferentes das normalmente utilizadas. quando você manda via parâmetros, o próprio dataset se encarrega da formatação dos dados.


GOSTEI 0
Joaoshi

Joaoshi

14/03/2005

Outra solução seria você substituir a virgula por ponto na separação decimal e mandar o campo como string QUOTEDSTR(VALOR).

Espero ter ajudado.


GOSTEI 0
Cabelo

Cabelo

14/03/2005

Não consigui..

Acontece o seguinte..

Se eu usar uma máquina que estiver configurada de acordo com o meu programa, funciona perfeitamente, mas se colocar em uma que estiver diferente, começam os problemas..

Acho que em algum determinado momento, o windows, dependendo da versão altera as configurações regionais, e por isso dá erro..

Gostaria de saber como faço para alterar definitivamente essas configurações, quando o sistema estiver rodando..

Alguém sabe?


GOSTEI 0
Emerson Nascimento

Emerson Nascimento

14/03/2005

utilize pârametros e vc não precisará se preocupar com as configurações regionais.

publique sua query para que possamos fazer um exemplo prático.


GOSTEI 0
Fred

Fred

14/03/2005

Para evitar estas configurações diferentes de maquina p/ maquina, coloque isso no on create do seu form principal:

ShortDateFormat := ´dd/mm/yyyy´;
DecimalSeparator := ´,´;
ThousandSeparator := ´.´;

Ai idependete do que estiver configurado nas opções regionais do windows o programa vai utilizar da maneira acima!!!


GOSTEI 0
Cabelo

Cabelo

14/03/2005

utilize pârametros e vc não precisará se preocupar com as configurações regionais. publique sua query para que possamos fazer um exemplo prático.


Eu sei como utilizar os parâmetros na query..

Esta não é minha dúvida.. o q maisquero entender, é pq funciona em outras partes do sistema.. e em outras não.. em algumas máquinas funciona em outras não..

Será que é o banco?


GOSTEI 0
Cabelo

Cabelo

14/03/2005

Para evitar estas configurações diferentes de maquina p/ maquina, coloque isso no on create do seu form principal: ShortDateFormat := ´dd/mm/yyyy´; DecimalSeparator := ´,´; ThousandSeparator := ´.´; Ai idependete do que estiver configurado nas opções regionais do windows o programa vai utilizar da maneira acima!!!


Colega... isso ei já faço..

É aí que está minha dúvida.. pq está alterando sozinho esta configuração.. mas não são em todos as máquinas, só em algumas.. eu tô achando que algum outro aplicativo tipo thread está alterando essas configuração, não sei..

Mas de qualquer maneira preciso resolver..


GOSTEI 0
Emerson Nascimento

Emerson Nascimento

14/03/2005

se vc já utiliza parâmetros não deveria acontecer nenhum erro. não é necessário se preocupar com formatos.

se vc tem uma variável floate um parâmetro tipo float:
qry.parambyname(´param1´).asfloat := variavelfloat; // não importa se está com ponto ou com vírgula

se vc tem uma variável data e um parâmetro data:
qry.parambyname(´param2´).asdatetime := variaveldata; // não importa se dd/mm/yyyy ou yyyy/mm/dd ou mm/dd/yyyy


GOSTEI 0
POSTAR