Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Bases de datos > MySQL
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 15-12-2015
ZiriusB ZiriusB is offline
Miembro
 
Registrado: oct 2010
Posts: 86
Poder: 14
ZiriusB Va por buen camino
Unhappy 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...
__________________
"Ningun precio es alto por el privilegio de ser uno mismo..."
Responder Con Cita
  #2  
Antiguo 15-12-2015
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.040
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
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;
Responder Con Cita
  #3  
Antiguo 15-12-2015
ZiriusB ZiriusB is offline
Miembro
 
Registrado: oct 2010
Posts: 86
Poder: 14
ZiriusB Va por buen camino
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.
__________________
"Ningun precio es alto por el privilegio de ser uno mismo..."
Responder Con Cita
  #4  
Antiguo 15-12-2015
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola ZiriusB.

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

Saludos
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #5  
Antiguo 15-12-2015
ZiriusB ZiriusB is offline
Miembro
 
Registrado: oct 2010
Posts: 86
Poder: 14
ZiriusB Va por buen camino
Exclamation

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;
__________________
"Ningun precio es alto por el privilegio de ser uno mismo..."
Responder Con Cita
  #6  
Antiguo 15-12-2015
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.040
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
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;
Responder Con Cita
  #7  
Antiguo 15-12-2015
ZiriusB ZiriusB is offline
Miembro
 
Registrado: oct 2010
Posts: 86
Poder: 14
ZiriusB Va por buen camino
Thumbs up

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.
__________________
"Ningun precio es alto por el privilegio de ser uno mismo..."
Responder Con Cita
  #8  
Antiguo 15-12-2015
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.040
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
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;
Responder Con Cita
  #9  
Antiguo 15-12-2015
ZiriusB ZiriusB is offline
Miembro
 
Registrado: oct 2010
Posts: 86
Poder: 14
ZiriusB Va por buen camino
Question

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)
__________________
"Ningun precio es alto por el privilegio de ser uno mismo..."
Responder Con Cita
  #10  
Antiguo 15-12-2015
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.040
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
¿Estás seguro que el campo de la base de datos es del tipo datetime?
Responder Con Cita
  #11  
Antiguo 15-12-2015
ZiriusB ZiriusB is offline
Miembro
 
Registrado: oct 2010
Posts: 86
Poder: 14
ZiriusB Va por buen camino
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.
__________________
"Ningun precio es alto por el privilegio de ser uno mismo..."
Responder Con Cita
  #12  
Antiguo 15-12-2015
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.040
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
¿Y Mfechahora de qué tipo es?
Responder Con Cita
  #13  
Antiguo 15-12-2015
ZiriusB ZiriusB is offline
Miembro
 
Registrado: oct 2010
Posts: 86
Poder: 14
ZiriusB Va por buen camino
var
Mfechahora:tdatetime; /// Variable para fecha

begin
Mfechahora:=now;
end;
__________________
"Ningun precio es alto por el privilegio de ser uno mismo..."
Responder Con Cita
  #14  
Antiguo 15-12-2015
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.040
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
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
Responder Con Cita
  #15  
Antiguo 15-12-2015
ZiriusB ZiriusB is offline
Miembro
 
Registrado: oct 2010
Posts: 86
Poder: 14
ZiriusB Va por buen camino
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... =(
__________________
"Ningun precio es alto por el privilegio de ser uno mismo..."
Responder Con Cita
  #16  
Antiguo 15-12-2015
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
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
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....

Última edición por ecfisa fecha: 15-12-2015 a las 18:37:17.
Responder Con Cita
  #17  
Antiguo 15-12-2015
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.040
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Cita:
Empezado por ZiriusB Ver Mensaje
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.
Responder Con Cita
  #18  
Antiguo 15-12-2015
ZiriusB ZiriusB is offline
Miembro
 
Registrado: oct 2010
Posts: 86
Poder: 14
ZiriusB Va por buen camino




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
__________________
"Ningun precio es alto por el privilegio de ser uno mismo..."

Última edición por ZiriusB fecha: 15-12-2015 a las 19:35:46.
Responder Con Cita
  #19  
Antiguo 15-12-2015
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.040
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
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 Ver Mensaje
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.
Responder Con Cita
  #20  
Antiguo 15-12-2015
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola.
Cita:
Empezado por Casimiro Notevi Ver Mensaje
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.
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
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
guardar precios. numeric o float? Patricio Firebird e Interbase 5 07-10-2008 16:21:17
guardar text como un float mjjj Varios 17 20-12-2007 11:44:17
Problemas con los float tato Varios 2 03-04-2006 11:57:38
problemas con float y redondeos wonder boy Firebird e Interbase 17 27-12-2005 20:59:06
Problemas con float.... ilichhernandez Varios 2 20-12-2005 16:19:20


La franja horaria es GMT +2. Ahora son las 18:04: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
Copyright 1996-2007 Club Delphi