Página 1 de 1
SET DECIMALS não interfere nos cálculos???
Publicado: Vie Jun 07, 2013 3:16 pm
por Sommus
Pessoal,
A documentação do Harbour (na verdade, desde o clipper), diz que o comando SET DECIMALS TO, não interfere no cálculo dos valores numéricos. Porém, ao gravar no banco de dados os cálculos abaixo, percebemos que não é isso que acontece...
Façam o teste:
nNumero1:=1
nNumero2:=3
nResultado:=nNumero1/nNumero2
-> Com SET DECIMALS TO 2 (Padrão): Grava 0.33
-> Com SET DECIMALS TO 8 : Grava 0.33333333
O correto seria realmente usar o "SET DECIMALS TO 8"?
Obrigado pela atenção,
Reginaldo
SET DECIMALS não interfere nos cálculos???
Publicado: Vie Jun 07, 2013 6:50 pm
por Sommus
Caros desenvolvedores de Xailer,
Após mais testes, percebemos que o problema está no método Update() do TMySQLDataSource...
Se gravar diretamente no banco, usando o comando UPDATE ou INSERT, funciona:
oMySQL:Execute('UPDATE tabela SET valor=(1/3)') -> Grava 0.333333333
Mas, usando o método Update(), não funciona:
oSQLQuery:Edit()
oSQLQuery:valor:=(1/3)
oSQLQuery:Update() -> Grava 0.33
Nesse caso, o que observamos, é que o "SET DECIMALS TO" influencia, ou seja, se colocar SET DECIMALS TO 8, grava 0.33333333
Observando o fonte TMySQLRecords.prg, vimos que o problema está na função "ValToStr()", na linha, onde converte o valor numérico em string:
"x := ToString( x )"... Ou seja, o problema parece estar na função ToString()
Qual seria a solução?
Obrigado pela atenção,
Reginaldo
SET DECIMALS não interfere nos cálculos???
Publicado: Vie Jun 07, 2013 8:44 pm
por Cassiano de Oliveira
Reginaldo pra mim esta certo a lógica, pois o default ao meu ver é 2 casas
decimais, ou seja, se quisermos mais casas teríamos que setar isto via SET
DECIMALS TO X casas
[]´s
"Sommus - Reginaldo" wrote in message news:51b20f59$[email=1@svctag-j7w3v3j....]1@svctag-j7w3v3j....[/email]
Caros desenvolvedores de Xailer,
Após mais testes, percebemos que o problema está no
método Update() do TMySQLDataSource...
Se gravar diretamente no banco, usando o comando UPDATE ou
INSERT, funciona:
oMySQL:Execute('UPDATE tabela SET valor=(1/3)') -> Grava
0.333333333
Mas, usando o método Update(), não funciona:
oSQLQuery:Edit()
oSQLQuery:valor:=(1/3)
oSQLQuery:Update() -> Grava 0.33
Nesse caso, o que observamos, é que o "SET DECIMALS TO"
influencia, ou seja, se colocar SET DECIMALS TO 8, grava
0.33333333
Observando o fonte TMySQLRecords.prg, vimos que o problema
está na função "ValToStr()", na linha, onde converte o
valor numérico em string:
"x := ToString( x )"... Ou seja, o problema parece estar na
função ToString()
Qual seria a solução?
Obrigado pela atenção,
Reginaldo
SET DECIMALS não interfere nos cálculos???
Publicado: Dom Jun 09, 2013 12:25 am
por Jose A. Suarez
En esta instrucción:
oMySQL:Execute('UPDATE tabela SET valor=(1/3)')
la operación es realizada por el servidor de SQL (ya sea MySQL, SQLite,
o cualquier otro), por lo que SET DECIMALS no tiene actuación sobre el
resultado.
Si quieres que el resultado se guarde con determinado número de
decimales, debes calcularlo antes:
SET DECIMALS TO 2
r := 1/3 (r es 0,33)
oMySQL:Execute('UPDATE tabela SET valor=' + str( r,5,2))
Saludos
Alf+.
El 07/06/13 18:50, Sommus - Reginaldo escribió:
> Caros desenvolvedores de Xailer,
>
> Após mais testes, percebemos que o problema está no
> método Update() do TMySQLDataSource...
>
> Se gravar diretamente no banco, usando o comando UPDATE ou
> INSERT, funciona:
> oMySQL:Execute('UPDATE tabela SET valor=(1/3)') -> Grava
> 0.333333333
>
>
> Mas, usando o método Update(), não funciona:
> oSQLQuery:Edit()
> oSQLQuery:valor:=(1/3)
> oSQLQuery:Update() -> Grava 0.33
> Nesse caso, o que observamos, é que o "SET DECIMALS TO"
> influencia, ou seja, se colocar SET DECIMALS TO 8, grava
> 0.33333333
>
>
> Observando o fonte TMySQLRecords.prg, vimos que o problema
> está na função "ValToStr()", na linha, onde converte o
> valor numérico em string:
> "x := ToString( x )"... Ou seja, o problema parece estar na
> função ToString()
>
>
> Qual seria a solução?
>
> Obrigado pela atenção,
>
> Reginaldo
SET DECIMALS não interfere nos cálculos???
Publicado: Dom Jun 09, 2013 7:51 pm
por jfgimenez
Reginaldo,
tienes razón. Creo que la función ToString() no está respetando el valor
real, sino que lo está truncando a los decimales de SET DECIMALS. Vamos
a revisarlo y corregirlo cuanto antes.
Un saludo,
José F. Giménez
http://www.xailer.com
http://www.xailer.info
SET DECIMALS não interfere nos cálculos???
Publicado: Mié Jun 12, 2013 6:01 pm
por Sommus
Outro problema em relação ao TSQLQuery:Update(), quanto a gravação das casas decimais:
Tabela: venda
Campos: valor, desconto
No meu formulário tenho um TDBMaskEdit apontando para o campo "desconto", esse componente está com máscara "@E 99,999.99"
Se editar o campo diretamente, é lógico que o Update() irá gravar o campo com duas casas, pois é o que está na máscara...
Porém, se atribuir valor diretamente, ele também grava conforme a máscara, isso não parece correto, veja o exemplo:
TSQLQuery:Edit()
TSQLQuery:desconto:=0.4932
TSQLQuery:Update()
O valor gravado no campo desconto foi "0.49" e não "0.4932" conforme a instrução...
Como resolver isso?
Obrigado pela atenção,
Un saludo,
Reginaldo
SET DECIMALS não interfere nos cálculos???
Publicado: Mié Jun 12, 2013 7:26 pm
por ignacio
Buenos días,
Si el campo es utilizado en algún datacontrol y además lo está asignando manualmente tiene que tener la precaución de poner la propiedad lAutoSave a falso.
Un saludo