Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 29-11-2008
einarcito einarcito is offline
Miembro
 
Registrado: may 2008
Posts: 101
Poder: 16
einarcito Va por buen camino
proeblmas con decimales en la DB

hola chicos una pregunta, estoy haciendo un calculo q me genera decimales del tipo '0.000' asi los defini en la tabla, a los calculos q hago los guardo en un edit y de ahi los paso a la tabla. El problema es q me genera un error del tipo Data truncated para un sierto campo, el problema creo q esta en la ',' como puedo hacer para almancenar en la tabla eso valor sin esa coma, osea q remplaze la coma por el punto??? gracias
Responder Con Cita
  #2  
Antiguo 29-11-2008
Avatar de Delphius
[Delphius] Delphius is offline
Miembro Premium
 
Registrado: jul 2004
Ubicación: Salta, Argentina
Posts: 5.582
Poder: 25
Delphius Va camino a la fama
Hola einarcito,
¿Porqué no nos dices el error exacto que te da?
Dices que es posiblemente por la coma, pero el hecho de que dices que el error es del tipo "data truncated" me marea. Si fuera por una cuestión del símbolo decimal el error que te arrojaría sería del tipo InvalidException, informandote de que el símbolo decimal no es el que corresponde.

Para asesorarte debidamente es fundamental y necesario que nos aportes los detalles necesarios, y si te da error debemos conocer el nombre exacto del error.

Si en efecto, es culpa del símbolo decimal, lo adecuado sería que en en onCreate de tu form principal establezcas el símbolo adecuado en la variable global DecimalSeparator:

Código Delphi [-]
DecimalSeparator := '.'; // o ',' según sea el caso

Las otras opciones pueden ir desde modificar en la configuración regional, o incluso detectar en el evento OnKeyPress la tecla pulsada y realizar la "conversión" de coma al punto.

De cualquier forma esto que te he comentado fue ampliamente discutido. Realiza una búsqueda por favor.

Saludos,
__________________
Delphius
[Guia de estilo][Buscar]
Responder Con Cita
  #3  
Antiguo 29-11-2008
einarcito einarcito is offline
Miembro
 
Registrado: may 2008
Posts: 101
Poder: 16
einarcito Va por buen camino
si dephius el error es del tipo q me tira es data truncated form coloum ley19032 (este es un campo de la tabla reteciones) nada mas, veamos si me hago entender, por defecto cuando se hacen calculos decimales en delphi el resultado que nos arroja es siempre con una coma no con un punto(si corresponde), entonces ese valor es el q tengo q almacenar en la tabla y la DB solo recepciona en los tipos de datos el '.' (punto), es por eso q cuando copio ese resultado con ',' a la tabla me genera el error (creo) . Otra cosa al evento key press no lo necesito en este caso porq no lo ingreso por teclado a ese valor solo lo calculo lo mando a un edit y de ahi a la tabla. Me entiendes?
Responder Con Cita
  #4  
Antiguo 29-11-2008
Avatar de Delphius
[Delphius] Delphius is offline
Miembro Premium
 
Registrado: jul 2004
Ubicación: Salta, Argentina
Posts: 5.582
Poder: 25
Delphius Va camino a la fama
¿Podríamos saber algo del código que empleas? ¿Que motor de base de datos usas? ¿Qué componentes?
Necesitamos de esos datos para asesorarte debidamente.

Saludos,
__________________
Delphius
[Guia de estilo][Buscar]
Responder Con Cita
  #5  
Antiguo 30-11-2008
einarcito einarcito is offline
Miembro
 
Registrado: may 2008
Posts: 101
Poder: 16
einarcito Va por buen camino
amigo te cuento q ya lo soluciones solo use el algo como esto.

adoquery.parametres:=Floattostro(ROund(datoReal));

el round me trunca esas comas de porqueria.
gracias de todos modos
Responder Con Cita
  #6  
Antiguo 30-11-2008
Avatar de Delphius
[Delphius] Delphius is offline
Miembro Premium
 
Registrado: jul 2004
Ubicación: Salta, Argentina
Posts: 5.582
Poder: 25
Delphius Va camino a la fama
Hola einarcito,
¿Porqué estás guardando el valor real como un string?
¿No sería mejor guardarlo como un real?. Si se trata de una expresión moneda, lo más conveniente sería emplear el formato Currency o el equivalente al moneda en el motor que usas.

Lo bueno de emplear parámetros es que te olvidas de los formatos, esto hace que asuma el trabajo el motor.

Por otro lado, Round() hará que te redondee el número, perdiendo los décimales que previamente calculaste. Ahora, si lo que buscas es que tus datos se "muestren" con los decimales, a pesar de tener solamente parte entera (algo como por ejemplo: 3432.000) lo mejor es que guardes el dato como un entero, dejando a fines de visualización los dichosos decimales. Para ello puedes valerte de la propiedad DisplayFormat.

Espero que se me entienda,
Saludos,
__________________
Delphius
[Guia de estilo][Buscar]
Responder Con Cita
  #7  
Antiguo 30-11-2008
einarcito einarcito is offline
Miembro
 
Registrado: may 2008
Posts: 101
Poder: 16
einarcito Va por buen camino
depiuhs algo entendi me podrias escribirlo para mejor entendimiento, si el roud lo q me hace es redondear pero bueno es la solucion q encontre, en si quiero cargar los datos y q se visualicen con las comas. algo como q me de un resultado 99,239 y asi pasarlo a la tabla, aparte lo necesito con las comas para mostrar en un reporte, se trata de una liquidacion de haberes,, razon por la cual necesito esas comas. gracias
Responder Con Cita
  #8  
Antiguo 30-11-2008
Avatar de Delphius
[Delphius] Delphius is offline
Miembro Premium
 
Registrado: jul 2004
Ubicación: Salta, Argentina
Posts: 5.582
Poder: 25
Delphius Va camino a la fama
Hola einarcito,
Bueno, por lo que veo pareciera que usas componentes ADO.
Ahora sería bueno saber que motor empleas.
Y como he dicho antes ¿Podemos conocer algo más de tu situación? ¿Un poco más del código? ¿Que reporteador usas?

Veamos si nos explicamos mejor. Porque tu tampoco has sido muy detallista en tus explicaciones.

Por un lado mencionas de que necesitas mostrar con comas, pero por el otro necesitas guardar con punto.
Bueno, como he dicho antes: existe una propiedad llamada DisplayFormat. Mediante esta propiedad se puede establecer el formato a los campos para ser mostrados. Es en esta propiedad donde puedes indicar que en vez de punto emplees coma. Cómo se guardarán los datos, es otro tema y mejor dejarselo al motor quien sabe.
DisplayFormat sólo da el formato a efectos de visualización, no afecta en como se guarde internamente el dato.

Además el reporteador debería ser capaz de trabajar y extraer el formato para el campo. Si es así, no debería haber problemas.

Ahora bien, hay algo extraño en esa minúscula muestra de código. Redondeas. Cuando lo haces, obtienes en realidad la parte entera. En caso de que la variable sea del los tipos flotantes (como ser real o double) el valor quedaría así: 453.000.

Yo amablemente te he preguntado, en que formato estás guardando el dato. Por el código pareciera que es string.
Yo me pregunto ¿es necesario guardar el dato como string?
Y ahora viene el tema, en donde se mezclan reales, enteros, y strings.

La pregunta importante a formularte es: ¿Inicialmente, y verdaderamente, de que tipo el el dato? ¿Trabajas con reales, o enteros? Los ceros a la derecha de la coma no tienen significado. Y si es un requisito mostrar los decimales, aun a pesar de ser enteros, a efectos de visualización es mejor destinar esa propiedad DisplayFormat y guardar el dato como entero.

Ahora bien, si el dato realmente es real, y se necesita de los decimales (distintos de ceros) si es necesario tener un campo en la base de datos que soporte el equivalente al tipo necesario.

De cualquier forma, sean enteros o reales, el componente Field dispone de la propiedad y es ella quien determina como se mostrará el valor.

Y aquí otra cuestión, supuestamente pareciera ser que estamos hablando de dinero... más motivo aún para indicarte que se debería trabajar con el tipo Moneda, Currency.

Si nos detallaras mejor tu problema, más fácil sería ayudarte.

Saludos,
__________________
Delphius
[Guia de estilo][Buscar]
Responder Con Cita
  #9  
Antiguo 30-11-2008
Avatar de Delphius
[Delphius] Delphius is offline
Miembro Premium
 
Registrado: jul 2004
Ubicación: Salta, Argentina
Posts: 5.582
Poder: 25
Delphius Va camino a la fama
En resumen:
1. Establecer el separador decimal adecuado. Por ejemplo, en el OnCreate:

Código Delphi [-]
DecimalSeparator := '.';


2. Establecer el formato en DisplayFormat, en campos persistentes.

Código Delphi [-]
NombreDataSetNombreCampo.DisplayFormat := '.###'; // o tal vez...
NombreDataSetNombreCampo.DisplayFormat := '.0000'; // en enteros tranformados en reales

Saludos,
__________________
Delphius
[Guia de estilo][Buscar]
Responder Con Cita
  #10  
Antiguo 30-11-2008
einarcito einarcito is offline
Miembro
 
Registrado: may 2008
Posts: 101
Poder: 16
einarcito Va por buen camino
eres un genio eso era el error, muchas gracias por tu atencion delphuissssssssssssssssssss adios grax
Responder Con Cita
  #11  
Antiguo 01-12-2008
Avatar de Delphius
[Delphius] Delphius is offline
Miembro Premium
 
Registrado: jul 2004
Ubicación: Salta, Argentina
Posts: 5.582
Poder: 25
Delphius Va camino a la fama
Cita:
Empezado por einarcito Ver Mensaje
eres un genio eso era el error, muchas gracias por tu atencion delphuissssssssssssssssssss adios grax
¿Cúal? ¿Era el DisplayFormat? ¿El DecimalSeparator? ¿El tipo del campo?
Sería oportuno que expongas la solución. Es posible que otros foristas con la misma duda pasen por aqui, y sería muy útil que expongas como solucionaste el problema.

No es por ser repitente, pero si eres bien descriptivo mejor. No te vamos a cobrar por las palabras.

Saludos,
__________________
Delphius
[Guia de estilo][Buscar]
Responder Con Cita
  #12  
Antiguo 01-12-2008
einarcito einarcito is offline
Miembro
 
Registrado: may 2008
Posts: 101
Poder: 16
einarcito Va por buen camino
NombreDataSetNombreCampo.DisplayFormat := '.###'; // o tal vez...
NombreDataSetNombreCampo.DisplayFormat := '.0000';

no establecia el separadaor
Responder Con Cita
  #13  
Antiguo 01-12-2008
Avatar de Delphius
[Delphius] Delphius is offline
Miembro Premium
 
Registrado: jul 2004
Ubicación: Salta, Argentina
Posts: 5.582
Poder: 25
Delphius Va camino a la fama
OK. Entiendo.

Y además, si los campos no son persistentes igual se puede hacer. Bastará con establecer en tiempo de ejecución, una vez que la Query se ejecute, la propiedad DisplayFormat al campo adecuado.

Por ejemplo se puede hacer algo así:
Código Delphi [-]
TXxxField(NombreQuery.Fields[0]).DisplayFormat := '.0000';

Siendo TXxxField el tipo de campo adecuado. Por ejemplo un TNumericField.

Saludos,
__________________
Delphius
[Guia de estilo][Buscar]
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Decimales eduardo360 Varios 1 19-02-2008 02:29:28
Decimales oregon Varios 1 26-10-2006 15:53:08
Decimales Luis Alberto Varios 1 19-05-2006 16:40:25
decimales jfontane Varios 2 24-06-2003 05:35:19
Decimales alexisns Conexión con bases de datos 2 22-06-2003 21:45:40


La franja horaria es GMT +2. Ahora son las 01:52:46.


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
Copyright 1996-2007 Club Delphi