Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Firebird e Interbase (https://www.clubdelphi.com/foros/forumdisplay.php?f=19)
-   -   problemas con decimales al insertar en tabla (https://www.clubdelphi.com/foros/showthread.php?t=86668)

anubis 14-09-2014 00:03:46

problemas con decimales al insertar en tabla
 
Buenas amigos,

La verdad no se donde puede estar el problema.
Tengo una tabla que tiene un campo decimal(4,2) le escribo en un edit 5.38 y me lo guarda como 5.37.
Ya probe a hacer

Código SQL [-]
 convierte:=strtofloat(preciosiniva.text);
          showmessage(floattostr(convierte));
     fmodulo.zqcompras.FieldByName('preciocoste').AsFloat:=convierte;

le puse 5.38, lo convierto y lo vuelvo a mostrar con el showmessage y me marca 5.38, pero a la hora de guardarlo me pone 5.37.

Ya probe a añadirlo directamente con un dbgrid y no hay problema, me pone 5.38.

No me pasa con todos los numeros, solo con algunos, por alguna razon a la hora de escribir en la tabla lo redondea o nose, porque si le pongo en el edit, por ejemplo 5.388 si me guarda 5.38.

Ya revise el query por si habia algo en las propiedades pero no lo encontre.

y la cosa esta rara :(.

alguno sabe por donde puedo mirar?

ecfisa 14-09-2014 01:23:51

Hola anubis.

Puede producirse por el tipo definido en la creación de la tabla o por el modo de asignación que estas haciendo al componente.
Te aconsejo usar tipos escalados en la definicion de la tabla: Usando NUMERIC y DECIMAL.

Y desde Delphi usar el tipo Currency de este modo:
Código Delphi [-]
var
  convierte: Currency;
begin
  convierte:= StrToCurr(preciosiniva.text);
  fmodulo.zqcompras.Edit;
  fmodulo.zqcompras.FieldByName('preciocoste').AsCurrency:= convierte;

Saludos :)

anubis 14-09-2014 04:31:45

si gracias por responder pero use decimal(4,2), el problema ahora es mayor proque si cambio el asfloat por ascurrency, ademas de haber cambiado en el query
Código Delphi [-]
 Campo6                 := Tcurrencyfield.Create(fmodulo.zqprecios);
   Campo6.FieldName       := 'precio';
   Campo6.FieldKind       := fkdata;
   Campo6.DataSet         := fmodulo.zqprecios;

   Campo3                 := Tfloatfield.Create(fmodulo.zqprecios);
   Campo3.FieldName       := 'preciocoste';
   Campo3.FieldKind       := fkdata;
   Campo3.DataSet         := fmodulo.zqprecios;

donde campo6 es del tipo currencyfield y el campo3 es floatfield, ahi el currency da error de violacion.

Pense que si cambiaba el floatfield por currencyfield era lo mismo.

anubis 14-09-2014 06:14:30

Bueno el tema del currency la verdad nose porque no funciona asignandolo a currency, sale un aviso de operacion de coma flotante invalida.

Ya habia hecho un miniprograma de una base de datos ejemplo para probar todo esto y al final tuve que cambiar el tipo decimal(4,2) por numeric(6,2), pense que la decimal era de mas precision que la numerica, pero bueno ya quedo bien el tema

gracias

engranaje 15-09-2014 11:37:26

Me extraña el asunto siendo decimal el campo, no sé tampoco que sistema gestor de bd estas utilizando. Yo siempre le echo la culpa al paso de decimal a binario cuando me pasan estas cosas con algunos números y con otros no. Entonces compruebo si al pasar de decimal a binario dan un valor exacto en binario o son periódicos. Cuando es un decimal exacto y en binario también no hay problema pero cuando en binario pasa a ser periodico me pasan estas cosas asi que al final siempre acabo redondeando a mano a los decimales que necesito los campos que leo de la bd. Mis investigaciones al respecto me han llevado a la conclusión de que la mayoria de las bd guardan en binario los datos númericos y cuando estos son flotantes pueden surgir este tipo de problemas.

anubis 15-09-2014 16:34:03

gracias por contestar.
uso firebird y la verdad tampoco entiendo porque hace eso, aun probando en un base de datos nueva de ejemplo. pero bueno ya pude cambiar a numeric y funciona pero no deja de ser extraño

Toni 16-09-2014 23:16:24

Ecfisa tienes un privado. Gracias!


La franja horaria es GMT +2. Ahora son las 16:13:45.

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