Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   MySQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=21)
-   -   Problemas al guardar Float en Mysql (https://www.clubdelphi.com/foros/showthread.php?t=89571)

ZiriusB 15-12-2015 02:33:51

Problemas al guardar Float en Mysql
 
Buenas noches, estoy realizando una aplicación para llevar el control de los clientes en un gimnasio y al tratar de guardar los valores del monto en Mysql me salta el error "Column doesn't match value count at row 1", después de darle vueltas y vueltas vi que era porque estaba guardando en 3 campos diferentes valores decimales (9,8), (20,4), (52,5) por poner un ejemplo, y la sentencia Mysql me lo tomaba como 6 valores (9) (8) (20), (4), etc y todo por la COMA DECIMAL que hace que mysql los tome como dos valores distintos.

De esta forma me da el error: "Column doesn't match value count at row 1"
Código Delphi [-]
  
 begin
      with ADO1 do
         SQL.Clear;
      try
         ADO1.SQL.Add('INSERT INTO factura (cantfactu,subtfactu,ivafactu,totalfactu,horafactu');
         ADO1.SQL.Add(',idclientef,idpagof,iduserF)VALUES(');
         ADO1.SQL.Add(Quotedstr(combocant.Text));
         ADO1.SQL.Add(',');
         ADO1.SQL.Add((Floattostr(cant)));
         ADO1.SQL.Add(',');
         ADO1.SQL.Add((Floattostr(iva)));
         ADO1.SQL.Add(',');
         ADO1.SQL.Add((Floattostr(total)));
         ADO1.SQL.Add(',');
         ADO1.SQL.Add((FormatDateTime('yyyy/mm/dd',(Mfechahora))));
         ADO1.SQL.Add(',');
         ADO1.SQL.Add(QuotedStr(form2.edtcedula.Text));
         ADO1.SQL.Add(',');
         ADO1.SQL.Add(QuotedStr(tpago));
         ADO1.SQL.Add(',');
         ADO1.SQL.Add(QuotedStr('1'));
         ADO1.SQL.Add(');');
         ADO1.ExecSQL;
      finally
         ShowMessage('Añadido Correctamente a la Base de Datos!');
      end;



Intente guardar los valores como string pero los redondea como valores enteros:
Código Delphi [-]
   begin
      with ADO1 do
         SQL.Clear;
      try
         ADO1.SQL.Add('INSERT INTO factura (cantfactu,subtfactu,ivafactu,totalfactu,horafactu');
         ADO1.SQL.Add(',idclientef,idpagof,iduserF)VALUES(');
         ADO1.SQL.Add(Quotedstr(combocant.Text));
         ADO1.SQL.Add(',''');
         ADO1.SQL.Add((Floattostr(cant)));
         ADO1.SQL.Add(''',''');
         ADO1.SQL.Add((Floattostr(iva)));
         ADO1.SQL.Add(''',''');
         ADO1.SQL.Add((Floattostr(total)));
         ADO1.SQL.Add(''',');
         ADO1.SQL.Add((FormatDateTime('yyyy/mm/dd',(Mfechahora))));
         ADO1.SQL.Add(',');
         ADO1.SQL.Add(QuotedStr(form2.edtcedula.Text));
         ADO1.SQL.Add(',');
         ADO1.SQL.Add(QuotedStr(tpago));
         ADO1.SQL.Add(',');
         ADO1.SQL.Add(QuotedStr('1'));
         ADO1.SQL.Add(');');
         ADO1.ExecSQL;
      finally
         ShowMessage('Añadido Correctamente a la Base de Datos!');
      end;
   end;

Agradecería su orientación...

Casimiro Notevi 15-12-2015 02:47:56

Si los campos son float, no puedes guardar string en ellos.
Usa parámetros en lugar de componer la sql.
Código Delphi [-]
ado.close;
ado.sql.text="insert into ....... values :v1, :v2, v3, ..."
ado.param[1].asString = ......
ado.param[2].asFloat = ....
etc.
etc.
ado.execsql;

ZiriusB 15-12-2015 03:10:50

No he trabajado con parámetros hasta el momento, he visto varios ejemplos pero me saltan errores:

Código Delphi [-]
ADO1.close;
ADO1.sql.text:='INSERT INTO factura (cantfactu,subtfactu,ivafactu,totalfactu,horafactu,idclientef,idpagof,iduserF)'+
'VALUES (:cantfactu,:subtfactu,:ivafactu,:totalfactu,:horafactu,:idclientef,:idpagof,:iduserF)';
ADO1.parambyname('cantfactu').asString := combocant.Text;

Pero me salta un error, ADOQUERY no reconoce parambyname como su miembro...

he hecho algo mal?

Gracias.

ecfisa 15-12-2015 03:56:59

Hola ZiriusB.

La sintáxis para el componente TADOQuery es:
Código Delphi [-]
                                                 
   ADO1.Parameters.ParamByName('CANTFACTU).Value := combocant.Text;

Saludos :)

ZiriusB 15-12-2015 04:16:23

Ya lo había averiguado jejejeje de todas formas muchas gracias, ahora me lanza un error al que no consigo darle vueltas u.u

First chance exception at $752D2C1A. Exception class EOleException with message 'Argumentos incorrectos, fuera del intervalo permitido o en conflicto con otros'. Process ProGym.exe (6964)

Código Delphi [-]
      with ADO1 do
         SQL.Clear;
      try
ADO1.close;
ADO1.sql.text:='INSERT INTO factura (cantfactu,subtfactu,ivafactu,'+
               'totalfactu,horafactu,'+
               'idclientef,idpagof,iduserf)'+
               'VALUES (:cantfactu,:subtfactu,:ivafactu,:totalfactu,'+
               ':horafactu,:idclientef,'+
               ':idpagof,:iduserF)';
ADO1.Parameters.ParamByName('cantfactu').Value := combocant.Text;
ADO1.Parameters.ParamByName('subtfactu').Value := cant;
ADO1.Parameters.ParamByName('ivafactu').Value := iva;
ADO1.Parameters.ParamByName('totalfactu').Value := total;
ADO1.Parameters.ParamByName('horafactu').Value := ((FormatDateTime('yyyy/mm/dd',(Mfechahora))));
ADO1.Parameters.ParamByName('idclientef').Value := (form2.edtcedula.Text);
ADO1.Parameters.ParamByName('idpagof').Value := tpago;
ADO1.Parameters.ParamByName('iduserF').Value := ('1');
ADO1.execsql;
      finally
         ShowMessage('Añadido Correctamente a la Base de Datos!');
      end;
   end;

Casimiro Notevi 15-12-2015 11:03:41

Código Delphi [-]
ADO1.Parameters.ParamByName('horafactu').Value := ((FormatDateTime('yyyy/mm/dd',(Mfechahora))));
Seguramente es esa línea, si el campo horafactu es un datetime, le etás pasando una cadena de texto.
Código Delphi [-]
ADO1.Parameters.ParamByName('horafactu').Value := Mfechahora;

ZiriusB 15-12-2015 14:57:10

Ya lo habia intentado pero me seguia dando el error...

A la final todo se redujo a que el campo es "Datetime" en mysql y en el codigo le estaba dando un formato "Date", en SQL nunca me dio ese problema.

Código Delphi [-]
ADO1.Parameters.ParamByName('horafactu').Value := (FormatDateTime('yyyy/mm/dd',(Mfechahora)));

Código Delphi [-]
ADO1.Parameters.ParamByName('horafactu').Value := (FormatDateTime('yyyy/mm/dd :hh:mm:ss',(Mfechahora)));

De todas formas me ayudo mucho trabajar con parametros, nunca lo habia hecho...

Muchas gracias.

Casimiro Notevi 15-12-2015 16:01:34

No, con formatdatetime estás creando un string. Por eso te dije que asignaras el valor directamente.
Código Delphi [-]
ADO1.Parameters.ParamByName('horafactu').Value := Mfechahora;

ZiriusB 15-12-2015 17:20:22

Pues si lo coloco asi me genera error,

en delphi tengo una variable "Mfechahora" donde almaceno la fecha actual (Now),

Si lo guardo asi no me genera error y guarda la fecha y hora exacta en BD:
Código Delphi [-]
ADO1.Parameters.ParamByName('horafactu').Value := (FormatDateTime('yyyy/mm/dd :hh:mm:ss',(Mfechahora)));

Si lo guardo asi me genera error:
Código Delphi [-]
ADO1.Parameters.ParamByName('horafactu').Value := Mfechahora;

First chance exception at $7598B760. Exception class EOleException with message 'Argumentos incorrectos, fuera del intervalo permitido o en conflicto con otros'. Process ProGym.exe (2988)

Casimiro Notevi 15-12-2015 17:26:37

¿Estás seguro que el campo de la base de datos es del tipo datetime?

ZiriusB 15-12-2015 17:32:44

Completamente...

Código SQL [-]
CREATE TABLE `factura` (
  `idfactura` INT(11) NOT NULL AUTO_INCREMENT,
  `cantfactu` INT(11) UNSIGNED NOT NULL,
  `subtfactu` FLOAT UNSIGNED NOT NULL,
  `Ivafactu` FLOAT UNSIGNED NOT NULL,
  `totalfactu` FLOAT UNSIGNED NOT NULL,
  `horafactu` DATETIME NOT NULL,
  PRIMARY KEY (`idfactura`),


Yo pensaba que el FormatDateTime era para establecer un formato determinado a una fecha... es por eso que hasta ahora siempre lo he usado cuando quiero guardar fechas.

Casimiro Notevi 15-12-2015 17:38:40

¿Y Mfechahora de qué tipo es?

ZiriusB 15-12-2015 17:48:03

var
Mfechahora:tdatetime; /// Variable para fecha

begin
Mfechahora:=now;
end;

Casimiro Notevi 15-12-2015 18:19:07

En mysql, ¿los campos fecha cómo se almacenan? ¿Acaso se guardan así: 10/10/2015 ?
Lo "normal" es que sea un número, ejemplo: 38216.365874124444

ZiriusB 15-12-2015 18:29:20

Asi: "2015-12-15 09:03:03"

Es por eso que uso el Formatdatetime, para darle el formato que acepta mysql de otro modo me daria un error al guardar ya que estaria tomando la fecha con valores incorrectos o fuera de rango... =(

ecfisa 15-12-2015 18:33:40

Hola ZiriusB.

No sé si el enlace tenga mas relación que mencionar el mismo mensaje de error, pero no perdes nada revisándolo: Error paso de fecha por parametro en ADO


Saludos :)

Casimiro Notevi 15-12-2015 18:50:06

Cita:

Empezado por ZiriusB (Mensaje 500551)
Asi: "2015-12-15 09:03:03"
Es por eso que uso el Formatdatetime, para darle el formato que acepta mysql de otro modo me daria un error al guardar ya que estaria tomando la fecha con valores incorrectos o fuera de rango... =(

No me puedo creer que mysql guarde las fechas de esa forma. Seguro que no puede ser.
Mejor lee lo que te indica ecfisa.

Bueno, lo ha eliminado pensando que ya no valía la pena, pero creo que lo mismo es válido.

ZiriusB 15-12-2015 19:15:50





Lei lo que coloco el compañero, hice lo que ahi dice pero me sigue arrojando el error de "Argumentos incorrectos, fuera del intervalo permitido o en conflicto con otros"

algo que estoy viendo ahora es que cuando me genera el error al darle CONTINUE y volver a darle clic al boton guardar en el formulario pues me guarda normal sin error yal ir a base de datos me guarda dos registros...





Edito: el servidor no permite insertar imagenes en el foro. u.u

Casimiro Notevi 15-12-2015 20:34:59

O sea, que el problema es otra cosa que no tiene nada que ver. Debes seguir tu código paso a paso con el depurador para encontrarlo.

Cita:

Empezado por ZiriusB (Mensaje 500554)
Edito: el servidor no permite insertar imagenes en el foro. u.u

No, lo que ocurre, como dice ahí, es que el sitio ese que has elegido para subir las imágenes, no permite que las enlaces desde otro sitio.

ecfisa 15-12-2015 20:52:18

Hola.
Cita:

Empezado por Casimiro Notevi (Mensaje 500553)
No me puedo creer que mysql guarde las fechas de esa forma. Seguro que no puede ser.
Mejor lee lo que te indica ecfisa.

Bueno, lo ha eliminado pensando que ya no valía la pena, pero creo que lo mismo es válido.

Lo borré por que pensé que ya se le había encontrado solución, pero dado que Casimiro lo considera una opción, restauro el mensaje con el enlace. :)


La franja horaria es GMT +2. Ahora son las 07:43:20.

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