In order for this site to work correctly we need to store a small file (called a cookie) on your computer. Most every site in the world does this, however since the 25th of May 2011, by law we have to get your permission first. Please abandon the forum if you disagree.

Para que este foro funcione correctamente es necesario guardar un pequeño fichero (llamado cookie) en su ordenador. La mayoría de los sitios de Internet lo hacen, no obstante desde el 25 de Marzo de 2011 y por ley, necesitamos de su permiso con antelación. Abandone este foro si no está conforme.

SET DECIMALS não interfere nos cálculos???

Foro de Xailer profesional en español
Responder
Sommus
Mensajes: 310
Registrado: Vie Jul 24, 2009 9:39 pm

SET DECIMALS não interfere nos cálculos???

Mensaje 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
Sommus
Mensajes: 310
Registrado: Vie Jul 24, 2009 9:39 pm

SET DECIMALS não interfere nos cálculos???

Mensaje 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
Cassiano de Oliveira
Mensajes: 475
Registrado: Mar Jul 24, 2012 10:21 pm

SET DECIMALS não interfere nos cálculos???

Mensaje 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
Jose A. Suarez
Mensajes: 58
Registrado: Sab Nov 24, 2012 3:50 pm

SET DECIMALS não interfere nos cálculos???

Mensaje 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
Avatar de Usuario
jfgimenez
Site Admin
Mensajes: 5718
Registrado: Lun Abr 06, 2015 8:48 pm
Contactar:

SET DECIMALS não interfere nos cálculos???

Mensaje 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
José F. Giménez
[Equipo de Xailer / Xailer team]
http://www.xailer.com
http://www.xailer.info
Sommus
Mensajes: 310
Registrado: Vie Jul 24, 2009 9:39 pm

SET DECIMALS não interfere nos cálculos???

Mensaje 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
Avatar de Usuario
ignacio
Site Admin
Mensajes: 9440
Registrado: Lun Abr 06, 2015 8:00 pm
Ubicación: Madrid, Spain
Contactar:

SET DECIMALS não interfere nos cálculos???

Mensaje 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
Ignacio Ortiz de Zúñiga
[OZ Software]
https://www.ozs.es
--
[Equipo de Xailer / Xailer team]
https://www.xailer.com
Responder