Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   MySQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=21)
-   -   UPDATE con reales (https://www.clubdelphi.com/foros/showthread.php?t=34639)

taru 16-08-2006 16:55:10

UPDATE con reales
 
Hola tengo un problemilla y llevo dandole vueltas toda la tarde. El problema es este query que se ejecuta bien osea funciona, pero el hijo de su madre me mete integer en las columnas ptotal, pagado y debe que por supuesto son float.
Código Delphi [-]
query.SQL.Text := 'UPDATE ' + bdticket + ' SET  ptotal = ' + quotedstr(ptotal.caption) + ' , pagado=' + quotedstr(editentrega.Text) + ' , debe=' + quotedstr(floattostr(resto)) + ' WHERE id=' + quotedstr(inttostr(idcabecera));

y no hay manera. He imprimido en pantalla el query ya evaluado y me sale:


Código SQL [-]
UPDATE ticket SET ptotal='27,46', pagado='10,28', debe='17,18' WHERE id='492'



Creo que esta todo bien pero en este caso me updatea 27, 10 y 17 respectivamente.

Alguien sabe porque?

PD: Los campos de la tabla mysql son float.
Gracias por adelantado.

roman 16-08-2006 17:53:40

Supongo que usando un punto en lugar de una coma decimal. Seguramente MySql no entiende la coma y hace lo mejor que puede para interpretar la entrada como un número, y en ese sentido toma sólo antes de la coma.

// Saludos

maeyanes 16-08-2006 18:11:04

Otro detalle que noto es que está mandando los valores de las campos como si fueran cadenas de texto, o sea, entre comillas simples. No se si eso se pueda en MySQL, pero en otros manejadores me imagino que daría error de tipos no compatibles. Prueba tu query de esta forma:

Código Delphi [-]
query.SQL.Text := 'UPDATE ' + bdticket + ' SET  ptotal = ' + ptotal.caption + ' , pagado=' + editentrega.Text + 
  ' , debe=' + floattostr(resto) + ' WHERE id=' + inttostr(idcabecera);

Lo cual te debe resultar en algo como:

Código SQL [-]
UPDATE ticket SET ptotal=27,46, pagado=10,28, debe=17,18 WHERE id=492

Otra posibilidad es usar la función format:

Código Delphi [-]
query.SQL.Text := Format('UPDATE %s SET ptotal = %f, pagado = %f, debe = %f where id = %d',
  [bdticket, StrToFloat(ptotal.caption), StrToFloat(editentrega.Text), resto, idcabecera]);



Saludos...

taru 16-08-2006 18:24:48

Gracias por responder.

Me sique dando un error y he probado de las dos formas que me habeis propuesto.

Os cuento cuando se evalua el update queda talque asi:

Código SQL [-]
UPDATE ticket SET ptotal=27,46, pagado=10,28, debe=17,18 WHERE id=492

y da problemas por las comas de los decimales con las comas de separacion de campos.

Hay alguna forma de que no tome esa coma de decimales como coma de separacion de campos. Me explico, Hay otra forma de hacer un UPDATE sin utilizar las comas de separacion?.

El MySql si que hacepta las comas de decimales ya que los precios y demas los estoy metiendo con un dbgrid y no me deja meter puntos solo hacepta comas. Si intento meter un punto en los decimales te pita.

Gracias por adelantado.

roman 16-08-2006 18:36:44

No, no. MySql no acepta comas decimales. Lo que sucede son dos cosas:

1. Tu DBGrid acepta comas y no puntos porque seguramente así está la configuración regional de tu pc.

2. Al hacer la actualización a través de un control de datos, éste hace la conversión de formato cambiando las comas por puntos.

Pero el punto es el punto :) Si vas a agregar directamente los datos mediante SQL, debes usar puntos, no comas decimales.

Esto también lo puedes subsanar si utilizas parámetros (y siempre debieran usarse parámetros) en lugar de concatenar los valores de los Edits directamente:

Código SQL [-]

update ticket set ptotal=:precio where id=:id

Aquí, los : indican que precio e id son parámetros que debes proporcionar así:

Código Delphi [-]
Query.ParamByName('precio').AsFloat := valor;

Siendo valor un dato float que puedes obtener del edit con las funciones que comenta maeyanes. La componente Query se encargará de colocar los parámetros en el formato correcto (punto o comas).

// Saludos

maeyanes 16-08-2006 18:36:55

Prueba entonces con una query con parámetros:

Código Delphi [-]
query.SQL.Text := 'UPDATE ' + bdticket + ' SET ptotal = :ptotal, pagado = :pagado, debe = :debe ' +
  'where id = :id';
query.Prepare;
query.ParamByName('ptotal').AsFloat := StrToFloat(ptotal.Caption);
query.ParamByName('pagado').AsFloat := StrToFloat(editentrega.Text);
query.ParamByName('debe').AsFloat := resto;
query.ParamByName('id').AsInteger := idcabecera;
query.Execute

Update: Vaya, se me adelantaron... :P

Saludos...

taru 16-08-2006 18:47:18

:) Soys unos maquinas ya funciona!!!

Parecera una tonteria pero llevo todo el puto dia con esto. La Solucion:

Código Delphi [-]
query.SQL.Text := 'UPDATE ' + bdticket + ' SET ptotal = :ptotal, pagado = :pagado, debe = :debe ' +  'where id = :id';
    query.Prepare;
    query.ParamByName('ptotal').AsFloat := StrToFloat(ptotal.Caption);
    query.ParamByName('pagado').AsFloat := StrToFloat(editentrega.Text);
    query.ParamByName('debe').AsFloat := resto;
    query.ParamByName('id').AsInteger := idcabecera;

por cierto donde salen las caritas hay que poner dospuntospe vale?

roman 16-08-2006 18:55:50

Cita:

Empezado por taru
Código Delphi [-]

query.SQL.Text := 'UPDATE ' + bdticket + ' SET ptotal = :ptotal, pagado = :pagado, debe = :debe ' +  'where id = :id';
    query.Prepare;
    query.ParamByName('ptotal').AsFloat := StrToFloat(ptotal.Caption);
    query.ParamByName('pagado').AsFloat := StrToFloat(editentrega.Text);
    query.ParamByName('debe').AsFloat := resto;
    query.ParamByName('id').AsInteger := idcabecera;

por cierto donde salen las caritas hay que poner dospuntospe vale?

¿Cuáles caritas? :rolleyes:

Para evitar que salgan caritas cuando en el código ponemos :p basta usar la etiqueta [noparse]:

[ delphi ]
[ noparse ]

...

[ /noparse ]
[ /delphi ]

// Saludos

maeyanes 16-08-2006 18:59:38

Vaya, hasta ahora me lo dicen (lo de [ noparse ] :p). Por cierto, no sería mejor que dentro de las etiquetas code, delphi, sql. etc., no se haga la sustitución de "smileis" de forma predeterminada?


Saludos...

taru 16-08-2006 18:59:48

Otra cosa mas que se aprende hoy. Gracias por avisar roman.:D

Lepe 16-08-2006 19:03:08

Cita:

Empezado por maeyanes
Vaya, hasta ahora me lo dicen (lo de [ noparse ] :p). Por cierto, no sería mejor que dentro de las etiquetas code, delphi, sql. etc., no se haga la sustitución de "smileis" de forma predeterminada?


Saludos...

Pues no, que a mi me gusta meter emoticones :D :D

Saludos

lalomon 20-11-2006 22:50:40

e tenido algunos problemas con este codigo

estoy trabajando con MySql 4 y con delphy 7, las query las hago via
ODBC con adoquery, y mi update es asi:

Código SQL [-]
[ noparse ]

update stockproducto set precioProducto= :precioPa where codigoProducto= :codigoPa and codigobodega=1;

[ /noparse ]

el problema surge al asignar lo valores a los parametro, lo cual hago de la siguiente forma:

Código Delphi [-]
[ noparse]
adoquery3.prepared;
adoquery3.Parameters.ParamByName('precioPa').Value:=precioP;
[ /noparse ]


no se si es problema de la version de delphy o de la adoquery, pero no asigna los valores, ya que al visualizar la consulta con showmessage me sigue mostrando los params y no los valores :S

pd: si se fijan la sintaxis es diferente a la que ustedes proponen porque no esta funcion sql.prepare ni la
query.ParamByName('precioPa').AsFloat:= precio

bueno ojala puedan ayudarme

pd: solucion parche mientras tanto, guardo el float en la base de dato como un string y cuando lo saco lo paso a float :)


La franja horaria es GMT +2. Ahora son las 23:11:37.

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