Casas Decimais ...
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
Respostas
Lucas Silva
25/02/2004
edit1.text := formatFloat(´0.00´, VARIAVEL_FLOAT).
Diogoalles
25/02/2004
o Float guarda valores como por exemplo 15,289999999 ... eqto o tipo decimal ou numeric seria 15,29.....
abraço
Gustavolange
25/02/2004
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
Diogoalles
25/02/2004
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
Gustavolange
25/02/2004
Origado!
Diogoalles
25/02/2004
abraço
Gustavolange
25/02/2004
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?
Diogoalles
25/02/2004
me passe a função q vc está usando
antes, tente utilizar Numeric (9,2)
abraço
Diogo
Gustavolange
25/02/2004
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
Diogoalles
25/02/2004
´,´+quotedstr(FormatFloat(´#,,,0.00´,StrToCurr(edtPreco.text));
abraço
Gustavolange
25/02/2004
eu ja tinha tentado com formatfloat...
segue o erro...
´generic sql error.
arithmetic exception, numeric overflow, or string truncation´
mais alguma ideia ???
abraço
Gustavolange
25/02/2004
Diogoalles
25/02/2004
Firebird tem q ser Dialeto 3
e ver se vc está definindo charset e collate
vc acessa via bde ?
Gustavolange
25/02/2004
Gustavolange
25/02/2004
e se eu usar VarChar, consigo fazer meus cálculos normalmente???
Diogoalles
25/02/2004
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
Aroldo Zanela
25/02/2004
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.
Vasques
25/02/2004
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
Gustavolange
25/02/2004
Vou fuçar aqui !
Muito obrigado pelas respostas !
Abraço !
Gustavolange
25/02/2004
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
Aroldo Zanela
25/02/2004
Informe o tipo de dado do banco e coloque um fragmento do código pra gente analisar melhor.
Gustavolange
25/02/2004
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)
Aroldo Zanela
25/02/2004
Faça o seguinte teste:
//e aki... ´,´+tranlateval(edtPrecoCusto.text) /100+
e coloca o códiga da Função tranlateval pra gente olhar.
Gustavolange
25/02/2004
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;
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 ?
Aroldo Zanela
25/02/2004
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;
Gustavolange
25/02/2004
mas muito obrigado!
e ainda bem que existe um fórum sobre delphi !
Jasig Aurumalfa
25/02/2004
Espero ter ajudado...
Gustavolange
25/02/2004
Espero ter ajudado...[/quote:768530c02e]
Ajudaria se vc me dissece(n repare meu português) como se usa isso, de notação cientifica...
Falow!
Jasig Aurumalfa
25/02/2004
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...
Jasig Aurumalfa
25/02/2004
Jasig Aurumalfa
25/02/2004
Desculpe-me
Gustavolange
25/02/2004
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
Aroldo Zanela
25/02/2004
Tente atualizar o BDE, pois havia uma problema com o BDE e Interbase Dialeto 3. Ou se puder, troque por outros componentes, como: IBX.