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)
-   -   no actualiza un campo correctamente ( decimal) (https://www.clubdelphi.com/foros/showthread.php?t=19102)

DynaRoc 04-03-2005 15:15:14

no actualiza un campo correctamente ( decimal)
 
Hola pues tengo lo siguiente :

TSQLConnection
TSQLQuery ( llamado qryModifica)

con 1 TcurrencyEdit llamado precio

luego tengo la el campo PRECIO el cual es un numeric(15,4)

pues bien actualizo dicho campo de la siguiente manera..

Código:

with datos.qryModifica do begin
  SQL.Add('UPDATE articulos SET PRECIO1 = ''' + precio.Text + '''');
  SQL.Add('WHERE clave = 7507');
  ExecSQL;
  end;

Si le meto por ejemplo : 12,12

en la db se guarda como 1212 ( sin la , )


alguien me puede ayudar?

saludos y gracias..

AdrianD 04-03-2005 16:54:46

por que cargarlo de esa maner???
Lo mejor seria con un parametro

with datos.qryModifica do begin
SQL.Add('UPDATE articulos SET PRECIO1 = :Precio');
SQL.Add('WHERE clave = 7507');
ParamByName('Precio').AsCurrency := StrToCurr(precio.Text);
ExecSQL;
end;
ExecSQL;
end;

DynaRoc 04-03-2005 18:33:49

gracias AdrianD por contestar

lo que me has indicado funciona la 1º vez ( algo raroo)

no tenía conocimiento de parametros ( para que veas que estoy algo verde xD).


en realidad tengo 3 datos reales en una clase derivada de TField ( QcurrEdit)

la cual me devuelve un valor real con el método Value ( ejemplo : Precio.value)

a la hora de hacer la actualización obtengo un error EdatabaseError parametro 'Descuento' no found.

tengo lo siguiente a la hora de actualizar :


Código:

SQL.Add('UPDATE clientes SET nombre = ''' + txtNombre.Text + ''',');
SQL.Add('RFC = ''' + txtRfc.Text+ ''',');
SQL.Add('CALLE = '''+ Calle.Text + ''',');
SQL.Add('Ciudad = '''+ Ciudad.Text+ ''',');
SQL.Add('LOCALIDAD = '''+ localidad.Text + ''',');
SQL.Add('ESTADO = '''+ estado.text+ ''',');
SQL.Add('CP = ''' + cp.Text + ''',');
SQL.Add('DESCUENTO =  :Descuento '',');
....
...
SQL.Add('LIMITECREDITO = :Credito '',');
SQL.Add('precio = :Precio ' );
SQL.Add('WHERE clave = ' + IntToStr(iClave));
ParamByName('Descuento').AsString  := FloatToStr(txtDescuento.Value);
ParamByName('Credito').AsString := FloatToStr(txtCredito.Value);
ParamByName('Precio').AsString := FloatToStr(txtPrecio.Value);
ExecSQL;
Close;

Si pudieras orientarme, es que haciendolo directamente ( sin parametros) no se guarda la maldita coma (,)


saludos

AdrianD 04-03-2005 21:16:23

Vamos al principio:
1- ¿Que componentes usas?
2- ¿Por que cargar el query de esa forma y no hacerlo en tiempo de diceño?
3- si para 2 hay una respuesta valida, antes de volverlo a cargar deberias "limpiarlo" con: datos.qryModifica.SQL.Clear; o algo parecido

DynaRoc 05-03-2005 02:18:13

1- ¿Que componentes usas?

TSQLConnection
TSQLQuery ( llamado qryModifica)

2- ¿Por que cargar el query de esa forma y no hacerlo en tiempo de diceño?

Pq dicho query lo utilizo tb para otros updates de diferentes tablas y en otros forms.


3- aqui no te entiendo.

El problema que tengo es que a la hora de actualizar/insertar el campo precio, no se me actualizan/insertan los decimales ( si le meto 1,2 al hacer el update se guarda como 12)

saludos y espero que me heches una mano, ya que no puedo seguir haciendo cosas sin resolver este problema.

gracias y saludos

DynaRoc 05-03-2005 09:49:30

he estado por ahy y a lo mejor puede ser por culpa de la base de datos

en la propiedad DEFAULT CHARACTER SET;

esta propiedad indica el juego de caracteres que se utiliza

podría poner lo siguiente ?

DEFAULT CHARACTER SET WIN1250;

que opinas ?

saludos

Lepe 05-03-2005 13:02:58

Cita:

Empezado por DynaRoc
lo que me has indicado funciona la 1º vez ( algo raroo)

Cita:

Empezado por AdrianD
3- si para 2 hay una respuesta valida, antes de volverlo a cargar deberias "limpiarlo" con: datos.qryModifica.SQL.Clear; o algo parecido

La primera vez, el sql.text está vacio, por eso funciona, pero la segunda vez que llamas a esa query, ya tiene el sql.text anterior, y lo que estas haciendo es añdiendo sentencias, es decir, la segunda vez, tendrás en el sql algo como esto:

Código SQL [-]
UPDATE articulos SET PRECIO1 = 1500
WHERE clave = 7507
UPDATE articulos SET PRECIO1 = 100
WHERE clave = 250
La primera vez actualizas la clave de 7507 y la segunda vez 250
Te debería dar un error en la sentencia sql.

Solución:
- Antes de hacer el sql.Add pon un sql.Clear

En cuanto a la otra pregunta, puede que la coma la esté tomando como separador de miles en lugar de separador decimal, (que por otra parte es lógico en españa), usa 1.2 en lugar de 1,2

Saludos

DynaRoc 05-03-2005 20:43:59

Cita:

Empezado por Lepe
La primera vez, el sql.text está vacio, por eso funciona, pero la segunda vez que llamas a esa query, ya tiene el sql.text anterior, y lo que estas haciendo es añdiendo sentencias, es decir, la segunda vez, tendrás en el sql algo como esto:

Código SQL [-]
UPDATE articulos SET PRECIO1 = 1500
WHERE clave = 7507
UPDATE articulos SET PRECIO1 = 100
WHERE clave = 250
La primera vez actualizas la clave de 7507 y la segunda vez 250
Te debería dar un error en la sentencia sql.

Solución:
- Antes de hacer el sql.Add pon un sql.Clear

Exacto con eso se soluciona el error a medias

pues como dices ahora ...

Cita:

En cuanto a la otra pregunta, puede que la coma la esté tomando como separador de miles en lugar de separador decimal, (que por otra parte es lógico en españa), usa 1.2 en lugar de 1,2
Pues si, he probado utilizar el punto (.) como separador decimal y funciona, pero esto no es lo que quiero ya que en españa suena mal introducir un número (123123123,12) y se transforme en el QcurrEdit como 123,123,123.12)

Aunque en la DB se guarda correctamente ( 123123123,12)

hombre me gustaría saber como utilizar el separador coma ( ,) como DECIMAL

saludos

vic_ia 05-03-2005 20:56:06

HOLA...

si quieres cambiar esta accion por default en todo el sistema de tu maquina lo que tienes que hacer es entrar a Panel de Control, Configuracion Regional, seleccionar en el primer Tab los formatos generales del idioma/pais o personalizarlos....

si solo te interesa que sea adecuado en tu programa solo necesitas al iniciar tu programa cambiar el valor de :
Código Delphi [-]
DecimalSeparator := ',';
// y correspondientemente
ThousandSeparator := '.'; // o el valor que le quieras dar al separador de miles
espero te sirva...

saludos...

Lepe 06-03-2005 12:29:21

A la acertada respuesta de Vic_ia solamente añadir que debes hacerlo en el primer Form o datamodule que crees en tu aplicación, en la seccion initialization del mismo, es decir, abajo del todo de la unidad, tienes que añadir:
Código Delphi [-]
initialization
  DecimalSeparator := ',';
  // y correspondientemente
  ThousandSeparator := '.'; // o el valor que le quieras dar al separador de miles

Tu siguiente pregunta será como usar el punto que hay en el teclado numerico como separador decimal..... te veo venir porque me ha pasado, así que te recomiendo este dichoso separador decimal


Saludos


La franja horaria es GMT +2. Ahora son las 14:49:43.

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