Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Conexión con bases de datos (https://www.clubdelphi.com/foros/forumdisplay.php?f=2)
-   -   Float a TFMTBCD ...... (https://www.clubdelphi.com/foros/showthread.php?t=73898)

Chaja 24-05-2011 00:06:50

Float a TFMTBCD ......
 
Estimados:
Bien, tengo un tema que si bien lei por ahi que los campos FMT o BCD cuando se generan en el ClientDataSet, toma por defecto prescion=15 y size 3, para los culaes el size se refiere a la cantidad de decimales, segun el libro de la cara oculta de D6. Ahora, tengo un Field del tipo FMTBCDS el cual le aisgo un valor de una variable float, la variable contiene el valor ej: 8.522234 y al asignarla al campo me queda 8.522, por lo que me genera errores de calculo. el dato es un precio de un art. pero sin el IVA, lo que la mostrarlo con el iva me da diferencia de decimales:
1 x 10 = 10 ((1 X 8.2644) *1.21 )

cuando el multiplicador es menor de 8 todo bien pero cuando es mayor me da error de 0,001/2/3

no se por que cuando le asigno el valor float me trunca los demas decimales despues del trecero.
Alguna sugerencia?????

Gracias

Luis Roldan
Mar del Plata
Argentina

newtron 24-05-2011 09:05:39

Hola.

¿No será que en el campo de la tabla tienes definidos 3 decimales?

Saludos

Chaja 25-05-2011 18:10:14

hola... gracias por responder, si en la base lo tengo definido como Numeric (15,3), pero esto cuando tenia en uso el BDE no era problema. Ahora veo que si hago 10 /1.21 es decir le saco el iva y se lo vuelo a poner 10*1.21 no me da lo mismo... es un garron....pues ahora me deprecia los digitos despues del tercer decimal

no se me ocurre como solucionarlo...:rolleyes::rolleyes::rolleyes:

newtron 25-05-2011 18:20:18

A ver que me estoy perdiendo.

¿Te trunca los valores en variables de memoria o en los campos de las tablas?

Chaja 26-05-2011 00:58:07

hago un calculo de un valor real / 1.21 y se lo asigo al campo de la tabla, l valor da como x.123456789 y solo asigna x.123

newtron 26-05-2011 10:10:17

Pues claro, si en la tabla tienes un máximo de 3 decimales te lo corta en el tercero, ¿no?

Chaja 26-05-2011 14:59:18

si si... esto me complica por que si tengo que tomar un valor de precio sin el iva y debo mostrarlo con el iva incluido, no me dan las cuentas....

newtron 26-05-2011 17:33:33

Pues una de dos, o cambias la forma de hacer los cálculos o cambias el tipo del campo de la tabla para poder guardar los decimales que necesites.

Chaja 27-05-2011 05:10:04

Bueno:
Algo pra decir es que he descubierto que he tendio este problema hace mucho, lo que psas ahora es que como me trunca los decimales a 3 decimales, no me hace el caculo inverso del IVA por falta de todos los decimales.
Y La verdad no se como corregir
ej
P.UNIT C IVA CANTIDAD TOTAL
1.390 323 448.97

ahora le saco el IVA ( 21%)

1.149 323 371.127 le agrego el IVA (x 1,21)= 449.064

la cuenta no me da... y no se como resolver esto que es parace mas a un tema de resolucion matematica, que de prog. o no se.

:(:(:(

newtron 27-05-2011 09:08:18

A ver...

Hay veces que si de un total le sacas la base imponible, la redondeas, le vuelves a calcular el iva y se lo sumas no cuadra con el total original pero eso es matemáticamente así.

Lo que hago yo en estos casos es que si la suma de la base original más el iva no coincide con el total le sumo un céntimo o bien a la base o bien al importe de iva para que cuadre.

Imagino que ese es tu problema.

Saludos

Lepe 27-05-2011 09:19:17

Ejem, ¿y quien te dice que el valor exacto de 8.522234 es ese?

Es que... los floats, por diseño, no son precisos, se hicieron para que los cálculos matemáticos fueran rápidos, pero insisto, no precisos.

Sin investigar, yo diría que el ClientDataset tendría que coger la precisión y escala del campo de la BBDD, claro, puede ser normal que se definan todos los importes como numeric(15, 3).

Chaja 27-05-2011 13:25:41

Estimado Lepe...
no te entendi mucho , pero como puede ser un posible parche a esta situacion?. En el CDS ???? en una ocasion quise limitar los campos pero no me da bolilla. inclusive ahora que me toma como campos los tipo TFMBCD por mas que le ponga 20 de size , me toma 4 ( ahora cambie la base a 4 decimales el numeric(15,4)).

Lepe 27-05-2011 16:59:09

La solución es crear/modificar los campos de la BBDD a 6 decimales. Digo 6 porque fué lo que hicieron las compañías telefónicas al entrar el euro. Todas las operaciones monetarias se realizan con 6 decimales y después si hay que redondear, se hace en el último importe.

Al menos en españa, solo se puede redondear el total de una factura, pero ni se te ocurra redondear el importe de un artículo, la base imponible de la factura o cálculos intermedios, porque estarías contradiciendo la ley.

Como ya hace años que andamos con sólo el euro, también puedes poner a True la propiedad Currency que tienen los campos numéricos (es lo que se hace con el dolar desde hace años).

Resumiendo: campos con numeric(15, 6) y Currency a True (para que solo muestre dos decimales y el símbolo del € (propiedad DisplayFormat del campo a ,0.00 €


Saludos


La franja horaria es GMT +2. Ahora son las 06:04:17.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi