Casas Decimais ...

Delphi

25/02/2004

Galera...
Como que fasso para salvar um valor na minha tabela com apenas duas casas após a virgula?
ja tentei varias funcoes que axei aqui no clube, mas nada funciona.
O interessante é que por exemplo, se eu salvar um valor como, 50,50 ele salva assim mesmo
mas se eu salvo como 50,30 ele salva alguma coisa como 50,298745200245 entendem ???

Alguem pode me ajudar???

Obrigado.

Gustavo
gustavo@joscil.com.br


Gustavolange

Gustavolange

Curtidas 0

Respostas

Lucas Silva

Lucas Silva

25/02/2004

edit1.text := formatFloat(´0.00´, VARIAVEL_FLOAT).



GOSTEI 0
Diogoalles

Diogoalles

25/02/2004

o interessante seria vc utilizar Numeric ou Decimal ao invés de utilizar o tipo Float ....
o Float guarda valores como por exemplo 15,289999999 ... eqto o tipo decimal ou numeric seria 15,29.....


abraço


GOSTEI 0
Gustavolange

Gustavolange

25/02/2004

vou explicar melhor.
na edit eu digito o preço de custo, 4561,97 e na tabela ele salva como 4561,979999547805427.
ja tentei usar algumas variaveis auxiliares para transformar o valor,
varAux := formatfloat(´0.00´,edtPrecoCusto.text); ele salvou o valor sem a virgula!

Não sei mais o que fazer, alguem pode me ajudar? Abaixo Segue exemplo do código utilizado
para inserção na tabela!

MySQL(dm.qryGenerica,´insert into produtos (cod,produto,preco,unMed,dtInc,prcusto,narrativa,ipi) values ´+

´(´+lblCod.caption+´,´+quotedstr(edtProduto.text)+

//aqui acontece o problema
´,´+quotedstr(tranlateval(edtPreco.text))+

´,´+quotedstr(cmbUnMed.text)+

´,´+quotedstr(lblDate.caption)+

//aqui acontece o problema tambem!
´,´+quotedstr(tranlateval(edtPrecoCusto.text))+

´,´+quotedstr(mm.lines.text)+´,´+quotedstr(tranlateval(edtIpi.text))+´)´)

e ai???hehe
alguem me ajuda?

Desde já agradeço!

Gustavo
gustavo@joscil.com.br


GOSTEI 0
Diogoalles

Diogoalles

25/02/2004

Olá

bem , como eu dizia é exatamente problema por causa do tipo de dado do campo na tabela.. qdo for Float assim como o Double precision utilizam um formato determinado pelo IEEE q ñ garante a precisão dos valores, por isso deve ser usado Numeri ou Float.
Você pode utilizar uma função para arrendodar os valores float, q é o q eu fazia qdo utilizava campos Float e tinha esse problema.

abraço

Diogo


GOSTEI 0
Gustavolange

Gustavolange

25/02/2004

Ta blz Diogo, vo muda os campos da minha tabela e qualque coisa eu posto aqui de novo!

Origado!


GOSTEI 0
Diogoalles

Diogoalles

25/02/2004

em minha resposta anterior acabei escrevendo q vc deveria utilizar ´numeric ou float´ , eu quis dizer Numeric ou Decimal que são os corretos.

abraço


GOSTEI 0
Gustavolange

Gustavolange

25/02/2004

Diogo...
mudei todos os campos float da minha tabela por decimal(9,2), mas agora se eu coloco tipo 9564,61 ele salva na tabela como 956461,00...

o que que é isso?
preciso usa alguma otra função pra gravar os dados na tabela?


GOSTEI 0
Diogoalles

Diogoalles

25/02/2004

a princío não tem nenhum detalhe
me passe a função q vc está usando

antes, tente utilizar Numeric (9,2)

abraço

Diogo


GOSTEI 0
Gustavolange

Gustavolange

25/02/2004

Diogo...
como mudei os campos para ´numeric(9,2)´ não estou usando mais nem uma função, o código é
o que postei acima sem a função ´tranlateval´, mas segue abaixo novamente !

MySQL(dm.qryGenerica,´insert into produtos (cod,produto,preco,unMed,dtInc,prcusto,narrativa,ipi) values ´+
´(´+lblCod.caption+´,´+quotedstr(edtProduto.text)+

//aqui
´,´+quotedstr(edtPreco.text)+

´,´+quotedstr(cmbUnMed.text)+
´,´+quotedstr(lblDate.caption)+

//aqui
´,´+quotedstr(edtPrecoCusto.text)+

´,´+quotedstr(mm.lines.text)+´,´+quotedstr(tranlateval(edtIpi.text))+´)´)

Ok?

A mudei de decimal para numeric, continua o mesmo erro !

Abraço
Gustavo


GOSTEI 0
Diogoalles

Diogoalles

25/02/2004

tente utilizar FormatFloat

´,´+quotedstr(FormatFloat(´#,,,0.00´,StrToCurr(edtPreco.text));


abraço


GOSTEI 0
Gustavolange

Gustavolange

25/02/2004

nada de funcionar Diogo...
eu ja tinha tentado com formatfloat...
segue o erro...

´generic sql error.
arithmetic exception, numeric overflow, or string truncation´

mais alguma ideia ???

abraço


GOSTEI 0
Gustavolange

Gustavolange

25/02/2004

mais nem 1 ideia ???


GOSTEI 0
Diogoalles

Diogoalles

25/02/2004

que banco de dados vc utiliza ?

Firebird tem q ser Dialeto 3
e ver se vc está definindo charset e collate

vc acessa via bde ?


GOSTEI 0
Gustavolange

Gustavolange

25/02/2004

eu to usando Interbase 6 e BDE


GOSTEI 0
Gustavolange

Gustavolange

25/02/2004

Será que ninguem tem uma função pra resolver esse problema?

e se eu usar VarChar, consigo fazer meus cálculos normalmente???


GOSTEI 0
Diogoalles

Diogoalles

25/02/2004

Gustavo,

dê uma pesquisada sobre como usar campo do tipo Numeric (poste uma nova pergunta no fórum referente a isso se precisar) ...
vc com certeza encontrará a solução ..
o primeiro problema vc já resolveu q era substituir o Float por Numeric .. agora é só ver pq dá o erro ...
eu não tenho esse problema q vc está tendo , então não tenho mais o q sugerir ..

abraço

Diogo


GOSTEI 0
Aroldo Zanela

Aroldo Zanela

25/02/2004

Galera... Como que fasso para salvar um valor na minha tabela com apenas duas casas após a virgula? ja tentei varias funcoes que axei aqui no clube, mas nada funciona. O interessante é que por exemplo, se eu salvar um valor como, 50,50 ele salva assim mesmo mas se eu salvo como 50,30 ele salva alguma coisa como 50,298745200245 entendem ??? Alguem pode me ajudar??? Obrigado. Gustavo gustavo@joscil.com.br


Você pode solucionar o seu problema conforme já foi sugerido, ou seja, utilizar Numeric ou Decimal (15,2). A questão da representação de números reais em sistemas de computador está relacionado ao espaço reservado para armazenar a mantissa.


GOSTEI 0
Vasques

Vasques

25/02/2004

Olá!

penso que usar campos numéricos na base de dados para guardar valores monetários é uma boa ideia. é também o que eu uso.
Se eu percebi bem qual o seu problema, penso que seja sufuciente mudar as propriedades do windows e do BDE, alterando os separadores decimal e o separador de agrupamento de digitos. Pelo que percebi você usa um formato tipo 100,000.12 - pode tambem ajustar no delphi as variáveis de ambiente DECIMALSEPARATOR := ´.´ e
THOUSANDSEPARATOR := ´,´. pode ainda formatar os valores antes de os guardar na base de dados usando a função FloatToStrf. veja no help as várias formatações que pode usar com este comando. se usar o FloatToStrf tem de acertar os valores das duas variaveis de ambiente.

espero ter ajudado
saudações
Claudio Vasques


GOSTEI 0
Gustavolange

Gustavolange

25/02/2004

Ta ok...

Vou fuçar aqui !

Muito obrigado pelas respostas !

Abraço !


GOSTEI 0
Gustavolange

Gustavolange

25/02/2004

bom...o problema de gravar com muitas casas apos a virgula eu resolvi...
mas agora, tenho outro (hehe), ao inves de 352,52 ele grava como 35252,00

e ai?alguem pra me dar uma luz?

Abraço

Gustavo
gustavo@joscil.com.br


GOSTEI 0
Aroldo Zanela

Aroldo Zanela

25/02/2004

Colega,

Informe o tipo de dado do banco e coloque um fragmento do código pra gente analisar melhor.


GOSTEI 0
Gustavolange

Gustavolange

25/02/2004

o campo eh Numeric(9,2) e o código segue..

if not MySQL(dm.qryGenerica,´insert into produtos (cod,produto,preco,unMed,dtInc,prcusto,narrativa,ipi) values ´+
´(´+lblCod.caption+´,´+quotedstr(edtProduto.text)+

//aki...
´,´+tranlateval(edtPreco.text)+´,´+quotedstr(cmbUnMed.text)+

´,´+quotedstr(lblDate.caption)+

//e aki...
´,´+tranlateval(edtPrecoCusto.text)+

´,´+quotedstr(mm.lines.text)+

//e nesse também! numeric (3,2)
´,´+tranlateval(edtIpi.text)+´)´) then
Application.messagebox(´Erro tentando gravar na tabela de Produtos...´,´Erro´,
mb_ok+mb_iconerror)


GOSTEI 0
Aroldo Zanela

Aroldo Zanela

25/02/2004

Colega,

Faça o seguinte teste:

//e aki... 
´,´+tranlateval(edtPrecoCusto.text) /100+ 


e coloca o códiga da Função tranlateval pra gente olhar.


GOSTEI 0
Gustavolange

Gustavolange

25/02/2004

código da função tranlateval...

function TranlateVal(Value: String): String;
var
I: Word;
S: String;
begin
S := ´0´;
if Length(Value) > 0 then
begin
for I := 1 to Length(Value) do
begin
if Value[I] in [´0´..´9´] then
S := S + Value[I]
else
if Value[I] = ´,´ then
S := S + ´.´;
end;
end;
Result := S;
end;


GOSTEI 0
Gustavolange

Gustavolange

25/02/2004

//e aki... 
´,´+tranlateval(edtPrecoCusto.text) /100+ 


Aroldo, não funcionou, pois tenta dividir uma string...
Não sei mais o que fazer...

Se eu mudar os campos pra varchar, eu consigo soma, subtrai, dividir...normalmente usando o strtofloat ?


GOSTEI 0
Aroldo Zanela

Aroldo Zanela

25/02/2004

:D Desculpe, muitas horas de VB dá nisso. hehehehe

Fiz um teste aqui com Paradox, sendo um campo numerico e outro money e funcionou corretamente. Veja abaixo:

procedure TForm1.Button1Click(Sender: TObject);
var nCod: Integer;
begin
Query1.Close;
  table1.Last;
nCod := table1codigo.AsInteger+1;
  with Query1 do
  begin
  SQL.Clear;
    SQL.Add(´Insert into TESTE values (´+IntToStr(nCod)+´, ´+TrocaSeparador(edit1.text)+´)´);
    ExecSQL;
  end;
end;

function TForm1.TrocaSeparador(Valor: String): String;
var nPos: Integer;
begin
nPos := Pos(´,´, Valor);
  Delete(Valor, nPos, 1);
  Insert(´.´, Valor, nPos);
  TrocaSeparador := Valor;
end;



GOSTEI 0
Gustavolange

Gustavolange

25/02/2004

Falo Aroldo, só vo pode testa esse codigo segunda-feira, ou quem sabe amanha de manha, ai te informo se fui bem sucedido!

mas muito obrigado!

e ainda bem que existe um fórum sobre delphi !


GOSTEI 0
Jasig Aurumalfa

Jasig Aurumalfa

25/02/2004

Tente usar notação científica...
Espero ter ajudado...


GOSTEI 0
Gustavolange

Gustavolange

25/02/2004

[quote:768530c02e=´Jasig Aurumalfa´]Tente usar notação científica...
Espero ter ajudado...[/quote:768530c02e]

Ajudaria se vc me dissece(n repare meu português) como se usa isso, de notação cientifica...

Falow!


GOSTEI 0
Jasig Aurumalfa

Jasig Aurumalfa

25/02/2004

Lembra aqueles calculos que se usa para a simplificação do calculo, geralmente para funções decimais:
Ex:
20000000000000000
Seria:
2 multiplicado por 10 elevado a 16...
Ex²:
0,0000000000000002
Seria
2 multiplicado por 10 elevado a -16...
Assim, aquele seu calculo que você está tentando desenvolover, seria resolvido com um calculo...


GOSTEI 0
Jasig Aurumalfa

Jasig Aurumalfa

25/02/2004

Mil desculpas, eu apenas queria responder, por favor, deletem esse tópico...


GOSTEI 0
Jasig Aurumalfa

Jasig Aurumalfa

25/02/2004

Mil desculpas novamente, eu achei q tinha criado um novo tópico, por não ver nenhuma mensagem nessa nova página...
Desculpe-me


GOSTEI 0
Gustavolange

Gustavolange

25/02/2004

bom...até agora tudo q tentei nao deu certo...
até a fução que eu usava já mudei...

mas é o seguinte...

eu digito na edit 97,5 a função substitui a ´,´ por um ´.´ para gravar no banco, pq se nao da erro. ta tudo funciona a troca. mas grava esse valor é gravado como 97,00. nao faço a minima ideia do porque disso. eu uso interbase 6.

se alguem puder me ajudar...

Por Favor !!!

Mto Obrigado!

Gustavo


GOSTEI 0
Aroldo Zanela

Aroldo Zanela

25/02/2004

Colega,

Tente atualizar o BDE, pois havia uma problema com o BDE e Interbase Dialeto 3. Ou se puder, troque por outros componentes, como: IBX.


GOSTEI 0
POSTAR