PDA

Ver la Versión Completa : Redondeo


DavidSG4
07-10-2011, 17:37:33
Muy buenas y gracias por anticipado.utilizo delphi5 y paradox 7

tengo un problema con un campo de tipo numerico y es que me redondea a 2 digitos y quiero hacer que me redonde a 3 o simplemente que no haga redondeo. ejemplo:
En una tabla metales tengo el campo Niquel(Ni) al que le quiero meter el valor 22,563 y automaticamente me pone en el dbedit 22,56 e probado con mascaras y no se si es que no pongo la mascara correcta pero no me funciona

0.000
#0#.000 y mas y no lo consigo.

Saludos y gracias.

oscarac
07-10-2011, 17:41:31
y en la tabla cuantos decimales tiene permitidos?

ecfisa
07-10-2011, 19:02:33
Hola DavidSG4.

Crear campos calculados:

Doble click sobre el TTable o TQuery.
Click botón derecho sobre el editor de campos.
Elegí la opción Add all fields.

Una vez traídos los campos al editor posicionate sobre tu campo numérico 'Niquel' y en el Object Inspector, propiedad DisplayFormat escribí 0.000 si deseas 3 dígitos decimales. Si dejas el valor vacío, mostrará el número con todas sus cifras decimales.

Si realizas estos pasos y se trata de un campo numérico, tiene que mostrar el valor en el formato que le indiques. Tanto se trate de un tipo Number o de un tipo Money si su propiedad Currency esta en False.

Saludos.

Edito error: Donde dije: 'campos calculados' es 'campos persistentes' :o

DavidSG4
10-10-2011, 10:30:59
Hola y gracias por tu respuesta. He realizado los cambios que me comentas pero al poner el campo calculado no me deja escribir en el dbedit. la otra respuesta que dice que cuantos campos decimales tengo permitidos en la tabla, no se como puedo cambiarlos he mirado y no encuentro esta opcion en paradox 7

Gracias de nuevo. Saludos

Hola DavidSG4.

Crear campos calculados:

Doble click sobre el TTable o TQuery.
Click botón derecho sobre el editor de campos.
Elegí la opción Add all fields.

Una vez traídos los campos al editor posicionate sobre tu campo numérico 'Niquel' y en el Object Inspector, propiedad DisplayFormat escribí 0.000 si deseas 3 dígitos decimales. Si dejas el valor vacío, mostrará el número con todas sus cifras decimales.

Si realizas estos pasos y se trata de un campo numérico, tiene que mostrar el valor en el formato que le indiques. Tanto se trate de un tipo Number o de un tipo Money si su propiedad Currency esta en False.

Saludos.

ecfisa
10-10-2011, 21:49:14
Hola DavidSG4.

Mil disculpas, cometí un 'acto fallido'. Cuando escribí campos calculados, quise decir campos persistentes.
Por favor borra todos los campos calculados que creaste y seguí los pasos que te indiqué (esos son correctos :))

Un saludo y nuevamente disculpas.

DavidSG4
11-10-2011, 09:23:29
Muchas gracias y de disculpas nada por favor estaria bueno, pruebo y te comento. saludos

DavidSG4
11-10-2011, 17:11:59
Nada no encuentro la solucion, pongo en el displayformat 0.000 y currency=false y nada tambien he intentado redondear con una funcion en el oncalcfields y nada me lanza un error de memoria joder es una locura no entiendo... la solucion tiene que ser facil.

lo que ocurre que yo creo que hay alguna funcion por ahi escondida que me esta redondeando, pero el caso que si entro en la bbdd a editar el registro(database desktop) si que me muestra todos los digitos que yo le meti sin redondear aunque si no la edito solo me muestra 2

Gracias acepto todas las ideas posibles.

ecfisa
11-10-2011, 17:57:29
Hola DavidSG4.

Si estás viendo todos los dígitos decimales con el Database Desktop, coincido con vos que algún código está modificando la presentación.
Lo que podrías hacer es poner un break (click sobre el márgen izquierdo no editable del editor) en una línea del código que estés seguro que la función aún no pudo ser invocada (al abrir la tabla por ejemplo) y utilizar Trace Into (F7) para ir línea por línea y así descubrir donde se produce el 'redondeo' no deseado.

Un saludo.

DavidSG4
11-10-2011, 18:09:45
no creo que sea la manera mas elegante de conseguirlo pero lo que he hecho a sido forzar la mascara en el formcreate y si que se lo traga, asi que lo que me esta tocando las narices esta antes del form create.

lo que voy hacer para hacerlo un poco mas elegante es un metodo que cualquier tabla que le pases, te coja los campos tipo float y te los de el formato con 3 decimales.

Gracias por tu ayuda.

DavidSG4
13-10-2011, 12:35:06
Hola ecfisa.

como ya te comente estoy intentando hacer el metodo para que al pasarle una tabla me asigne la mascara que te comente. pero no soy capaz ya que cuando pongo table.fields[i].displayformat me dice que no es una propiedad del campo, en el desplegable de los atributos me sale editmask pero no el display format,

for i:=o to tabla.fields.count-1 do
begin
if table.fields[i] is floatfield then // por esta condicion pasa siempre y hay campos que son string
begin
table.fields[i].displayformat:= mascara // este displayformat no me reconoce.
end
end

a ver si me puedes ayudar gracias y un saludo

Casimiro Notevi
13-10-2011, 13:25:22
Recuerda poner etiquetas al código, ejemplo:

http://neftali.clubdelphi.com/images/UtilizarTAGs.png



Hay mucha diferencia de esto:
for i:=o to tabla.fields.count-1 do
begin
if table.fields[i] is floatfield then // por esta condicion pasa siempre y hay campos que son string
begin
table.fields[i].displayformat:= mascara // este displayformat no me reconoce.
end
end

a esto:

for i:=o to tabla.fields.count-1 do
begin
if table.fields[i] is floatfield then // por esta condicion pasa siempre y hay campos que son string
begin
table.fields[i].displayformat:= mascara // este displayformat no me reconoce.
end
end

¿no te parece? ;)

ecfisa
13-10-2011, 13:33:01
Hola DavidSG4.

No uso Paradox por lo que no sé si es la mejor forma, pero de este modo funciona correctamente:

procedure SetDisplayFormat(DataSet: TDataSet; const Mask: string);
var
i: Integer;
begin
for i:= 0 to DataSet.FieldCount-1 do
if DataSet.Fields.Fields[i].DataType = ftFloat then
TFloatField(DataSet.Fields[i]).DisplayFormat:= Mask;
end;


Ejemplo de llamada:

SetDisplayFormat(Query1, '0.00,00');


Las etiquetas... las etiquetas... ;)

Un saludo.

DavidSG4
13-10-2011, 15:51:55
funciona perfectamente. lo que no entiendo es porque en el dataset haces referencia 2 veces al campo fields DataSet.Fields.Fields[i].DataType el dataset es una tabla que tiene campos porque tienes que acceder a ese segundo nivel?

mil gracias y disculpa mi ignorancia.

Hola DavidSG4.

No uso Paradox por lo que no sé si es la mejor forma, pero de este modo funciona correctamente:

procedure SetDisplayFormat(DataSet: TDataSet; const Mask: string);
var
i: Integer;
begin
for i:= 0 to DataSet.FieldCount-1 do
if DataSet.Fields.Fields[i].DataType = ftFloat then
TFloatField(DataSet.Fields[i]).DisplayFormat:= Mask;
end;


Ejemplo de llamada:

SetDisplayFormat(Query1, '0.00,00');


Las etiquetas... las etiquetas... ;)

Un saludo.