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 20-06-2007
Avatar de andiget
andiget andiget is offline
Miembro
 
Registrado: mar 2007
Ubicación: Medellin, Colombia
Posts: 12
Poder: 0
andiget Va por buen camino
Tengo un Problema con el DecimalSeparator

Cordial Saludo,

Resulta que estoy desarrollando una aplicacion en Delphi 2007 que se conecta a una BD en Oracle 9i


Mi problema es el siguiente tengo una instruccion para insertar unos valores decimales en un campo de tipo number, pero me generaba un error de tipo "Invalid Number" buscando un poco, encontre que tenia que añadir la instruccion Código Delphi [-] DecimalSeparator := '.';



Hasta aca todo perfecto, pero en una ocasion probe mi aplicacion en otro computador y me volvio a generar el "Invalid Number" entonces comente la linea del DecimalSeparator y continuo trabajando normalmente.

Cuando comprobe la configuracion reginoal de los dos computadores esta exactamente igual, he probado la aplicacion en varios PC's desde eso y en algunos necesito definir el DecimalSeparator y en otros no.

Por ultimo le informo que mi aplicacion se conecta simultaneamente a varios servidores oracle, y no importa como suba el campo a la BD (con ',' o '.') estos quedan almacenados en los diferentes servidores separados por punto (.).

Incluso agregue este codigo que encontre en otro foro y no importa cual sea el PC me establece el DecimalSeparator como ',' y el ThousandSeparator como '.' pero igual al tratar de subir a la BD saca el mismo error en los mismos computadores


Código Delphi [-]
var
Decimal: PChar;
Thousand: PChar;
tmp: string;
begin

//get the decimal separator
Decimal := StrAlloc(10); //get the memory to the local decimal point value
GetLocaleInfo(LOCALE_SYSTEM_DEFAULT, LOCALE_SDECIMAL, Decimal, 10); //get the value
tmp := Decimal;
DecimalSeparator := tmp[1];

//get the thousand separator
Thousand := StrAlloc(10);
GetLocaleInfo(LOCALE_SYSTEM_DEFAULT, LOCALE_STHOUSAND, Thousand, 10);
tmp := Thousand;
ThousandSeparator := tmp[1];





Espero haber sido claro en mi explicacion y que puedan darme alguna ayuda
__________________
Código PHP:
echo ("Yo soy la clase de personas con las que mi padre no quiere que me junte"); 
Responder Con Cita
  #2  
Antiguo 20-06-2007
elopezf elopezf is offline
Miembro
 
Registrado: mar 2007
Posts: 15
Poder: 0
elopezf Va por buen camino
Smile

Yo tenia el mismo problema, y resulta que la configuracion regional por default es español España y por lo tanto te devuelve en los valores decimales una ,
el valor del campo te lo devuelve asi "34,56" y ese no es un valor decimal valido para la base.

Lo que tienes que hacer es:

Despues de iniciar tu aplicación (en el DPR) escribe esto:
Application.Initialize;
ShortDateFormat := 'dd/MM/yyyy';
DecimalSeparator := '.';
ThousandSeparator := ',';

Y despues continuas creando los objetos.

Bueno lo siguiente que hice para evitar el error en caso de que persista es crear una funcion que me devuelva el valor correctamente:

Function aDecimal(vValor: string):Real;
var
vPValor: String;
vEnDonde: integer;
begin
if vValor <> '' then
Begin
vPValor:= vValor;
if pos(',',vPValor) > 0 then
begin
vEnDonde:= pos(',',vPValor);
delete(vPValor,vEnDonde,1);
insert('.',vPValor,vEnDonde);
end;
Result:= strtofloat(vPValor);
End
else
Result:= 0.000;
End;

Y despues para usar la función solo escribo esto:

qryRecibosMercanciaEI_PESOBRUTO.value := aDecimal(cdsTxt.FieldValues['CAMPO14']);


Espero te ayude. A mi me resolvio el problema satisfactoriamente

Estamos en contacto. Bye
Responder Con Cita
  #3  
Antiguo 20-06-2007
Avatar de andiget
andiget andiget is offline
Miembro
 
Registrado: mar 2007
Ubicación: Medellin, Colombia
Posts: 12
Poder: 0
andiget Va por buen camino
Gracias por tu respuesta, ensaye esto y me funciono correctamente.

Te informo que tambien habia encontrado otra solucion que funciona, resulta que el regedit del cliente de oracle,
LOCAL_MACHINE -> SOFTWARE -> ORACLE -> HOME(#Version)
Hay un campo llamado NLS_LANG y descubri que en algunos pc's estaba configurado para españa y en otros para colombia, de hay se generaban las diferencias.

para arreglar este error se podian poner todos los pc's en la misma configuracion.

Luego buscando un poco mas, xq pense que no era conveniente cambiar la configuracion de los usuarios, encontre que al iniciar la conexion podia ejecutar la siguiente consulta.

ALTER SESSION SET NLS_NUMERIC_CHARACTERS = ",."

y esta permitia tener unos u otros separadores decimales segun como se asignaran.

Espero haber sido claro en mi explicacion y q esta le sea de utilidad a alguien mas.
Cualquier duda, lo pueden informar
__________________
Código PHP:
echo ("Yo soy la clase de personas con las que mi padre no quiere que me junte"); 
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
Tengo un problema con la libreria ElDioni Varios 0 15-07-2005 13:27:04
tengo un problema con el comando VAL perudelphi OOP 8 08-12-2004 03:31:30
Ayuda, tengo un problema fmonte Varios 5 06-10-2004 18:14:47
decimalSeparator y windows XP miquelm API de Windows 0 11-02-2004 11:25:39
Tengo un problema con la conexión al servidor subzero Firebird e Interbase 3 27-01-2004 18:25:14


La franja horaria es GMT +2. Ahora son las 23:14:15.


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