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. :)

AgustinOrtu 15-12-2015 22:59:48

Código Delphi [-]
Query.Parameters.ParamByName('ParamFecha').DateType := ftDate;
Query.Parameters.ParamByName('ParamFecha').DateType := ftDateTime;

Query.Parameters.ParamByName('ParamFecha').Value:= VariableFecha;

Proba con uno de esos, si te interesa almacenar tanto fecha como hora obviamente usarias ftDateTime, sino ftDate

ZiriusB 16-12-2015 00:09:17

Cita:

Empezado por Casimiro Notevi (Mensaje 500559)
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.


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.

Me refería a eso precisamente (el servidor de alojamiento de imágenes), use el depurador paso a paso y el error me lo arroja al leer la primera linea:

Código Delphi [-]
ADO1.sql.text:='INSERT INTO factura (cantfactu,subtfactu,ivafactu,totalfactu,horafactu,idclientef,idpagof,iduserf)'+



Cita:

Empezado por AgustinOrtu (Mensaje 500566)
Código Delphi [-]
Query.Parameters.ParamByName('ParamFecha').DateType := ftDate;
Query.Parameters.ParamByName('ParamFecha').DateType := ftDateTime;

Query.Parameters.ParamByName('ParamFecha').Value:= VariableFecha;

Proba con uno de esos, si te interesa almacenar tanto fecha como hora obviamente usarias ftDateTime, sino ftDate

Me sigue dando el mismo error amigo, lo que puedo ver después de tanto darle vueltas a esto es que es un error en todo el pedazo de código de el botón "guardar" (que solo tiene la query), es primera vez que trabajo con parámetros...

Código Delphi [-]
with ADOQuery1 do begin
 If active then close;
 SQL.Clear;
ADOQuery1.sql.add('INSERT INTO factura (cantfactu,subtfactu,ivafactu,totalfactu,horafactu,idclientef,idpagof,iduserf)');
ADOQuery1.sql.add('VALUES (:cantfactu,:subtfactu,:ivafactu,:totalfactu,:horafactu,:idclientef,:idpagof,:iduserF)');
with parameters do
begin
ADOQuery1.Parameters.ParamByName('cantfactu').Value := combocant.Text;
ADOQuery1.Parameters.ParamByName('subtfactu').Value := cant;
ADOQuery1.Parameters.ParamByName('ivafactu').Value := iva;
ADOQuery1.Parameters.ParamByName('totalfactu').Value := total;
ADOQuery1.Parameters.ParamByName('horafactu').Value := (FormatDateTime('yyyy/mm/dd',(Mfechahora)));
ADOQuery1.Parameters.ParamByName('idclientef').Value := form2.edtcedula.text;
ADOQuery1.Parameters.ParamByName('idpagof').Value := tpago;
ADOQuery1.Parameters.ParamByName('iduserF').Value := ('1');
end;
ADOQuery1.open;
end;
   end;

así esta ahora mismo y me sigue dando el mismo error.

AgustinOrtu 16-12-2015 02:31:23

Primero elimina los with de tu codigo porque

1. No es aconsejable
2. No lo estas "aprovechando"

Debido a 1), casi que prefiero no explicarte el porque no lo estas "aprovechando"

Si te da un error en Query.SQL.Add es porque el query no esta inicializado (no esta creado)

No se de donde sale ADOQuery1, voy a asumir que tenes el componente en el Form actual. Tambien voy a asumir que en ADOQuery1.Connection tenes asignada una TADOConnection

Código Delphi [-]
  // este codigo esta para probar que tengas todo "en orden", luego lo quitas
  // basicamente chequea que todos los objetos que intervienen estan correctamente creados

  if not Assigned(ADOQuery1) then
    raise Exception.Create('ADOQuery1 no esta correctamente inicializado');

  if not Assigned(ADOQuery1.Connection) then
    raise Exception.Create('ADOQuery1.Connection no esta correctamente inicializado');

  if not Assigned(ADOQuery1.SQL) then
    raise Exception.Create('ADOQuery1.SQL no esta correctamente inicializado');

  if not Assigned(form2) then
    raise Exception.Create('form2 esta correctamente inicializado');

  // hasta aca, luego lo quitas


  if ADOQuery1.Active then
    ADOQuery1.Close;

  ADOQuery1.SQL.Text :=
    ' INSERT INTO factura (cantfactu,subtfactu,ivafactu,totalfactu,horafactu,idclientef,idpagof,iduserf) ' +
    ' VALUES (:cantfactu, :subtfactu, :ivafactu, :totalfactu, :horafactu, :idclientef, :idpagof, :iduserF) ';

  ADOQuery1.Parameters.ParamByName('cantfactu').Value := combocant.Text;
  ADOQuery1.Parameters.ParamByName('subtfactu').Value := cant;
  ADOQuery1.Parameters.ParamByName('ivafactu').Value := iva;
  ADOQuery1.Parameters.ParamByName('totalfactu').Value := total;

  ADOQuery1.Parameters.ParamByName('horafactu').DataType := ftDateTime;
  ADOQuery1.Parameters.ParamByName('horafactu').Value := Mfechahora;

  ADOQuery1.Parameters.ParamByName('idclientef').Value := form2.edtcedula.Text;
  ADOQuery1.Parameters.ParamByName('idpagof').Value := tpago;
  ADOQuery1.Parameters.ParamByName('iduserF').Value := '1';
  ADOQuery1.Open;

ZiriusB 16-12-2015 03:29:14

Efectivamente tengo conectado todo como debe ser, el ADOQuery1 esta en el form en el que hago la consulta, esta conectado al ADOCOnection, coloque la consulta tal cual la pasaste y sigue generando el mismo error, lo hice con el depurador activo y paso por paso, se detiene y genera el error en esta linea:

Código Delphi [-]
  ADOQuery1.SQL.Text :=

AgustinOrtu 16-12-2015 03:30:31

Y cual es el error?

ZiriusB 16-12-2015 03:34:30

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

Si en ese error le doy "Continue" me aparece este error:

First chance exception at $77682C1A. Exception class EDatabaseError with message 'ADOQuery1: CommandText does not return a result set'. Process ProGym.exe (2352)

AgustinOrtu 16-12-2015 03:55:05

Código Delphi [-]
ADOQuery1.SQL.Text := 'blabla'

Esa linea no puede generarte nunca esa excepcion


Cita:

First chance exception at $77682C1A. Exception class EOleException with message 'Argumentos incorrectos, fuera del intervalo permitido o en conflicto con otros'. Process ProGym.exe (5904)
Esa excepcion se genera en un supuesto ADOQuery1.Open o ADOQuery1.ExecSQL y hay problemas de parametros (tipo, sin asignar)

Cita:

First chance exception at $77682C1A. Exception class EDatabaseError with message 'ADOQuery1: CommandText does not return a result set'. Process ProGym.exe (2352)
Esa excepcion se genera porque deberiamos usar ADOQuery1.ExecSQL, no ADOQuery1.Open (error mio, perdon)

Open se usa cuando se ejecutan sentencias SELECT, que devuelven un conjunto de filas y columnas como resultado (una tabla)

ExecSQL se usa para todas las demas sentencias: DELETE, UPDATE, INSERT, etc y devuelve un Integer, que es la cantidad de registros afectados

Cambia el Open por ExecSQL.. y de nuevo disculpas :o

ZiriusB 16-12-2015 04:05:13

Cita:

Empezado por AgustinOrtu (Mensaje 500575)
Código Delphi [-]
ADOQuery1.SQL.Text := 'blabla'

Esa linea no puede generarte nunca esa excepcion




Esa excepcion se genera en un supuesto ADOQuery1.Open o ADOQuery1.ExecSQL y hay problemas de parametros (tipo, sin asignar)



Esa excepcion se genera porque deberiamos usar ADOQuery1.ExecSQL, no ADOQuery1.Open (error mio, perdon)

Open se usa cuando se ejecutan sentencias SELECT, que devuelven un conjunto de filas y columnas como resultado (una tabla)

ExecSQL se usa para todas las demas sentencias: DELETE, UPDATE, INSERT, etc y devuelve un Integer, que es la cantidad de registros afectados

Cambia el Open por ExecSQL.. y de nuevo disculpas :o

Ya me parecía raro estar usando Open, pero bueno seguía al pie de la letra tus instrucciones jajajaja,

Código Delphi [-]
  ADOQuery1.Parameters.ParamByName('cantfactu').Value := combocant.Text;

Me genera el error y me marca el primer parámetro, si lo quito y lo quito de la consulta me genera error en el siguiente y así sucesivamente. Esto me esta dando muchos dolores de cabeza :S

Delphius 16-12-2015 04:33:31

Che, ¿porqué la insistencia en tomar los tipos como si fueran strings? Si en la tabla tienes campos integer, floats, etc. En tu código debes pasarles variables del mismo tipo, o la equivalente en delphi para dicho tipo.

Por otro lado cuando uno trabaja con ADO debe pasarle en .Value el valor correspondiente, pero más importante, previamente indicarle el tipo esperado:

Código Delphi [-]
ADOQuery1.Parameters.ParamByName(NombreParametro).DataType := ftInteger;
ADOQuery1.Parameters.ParamByName(NombreParametro).Value := 40; // o la variable integer en cuestión

Hace un tiempo que no uso Delphi asi que no estoy completamente seguro si así se llamaba la propiedad DataType. Consulta la ayuda por las dudas.

No creo, ni debiera, que sea problema que al SQL que le pasas al ADOQuery veo espacio entre la comilla de inicio y fin. Pero por las dudas, corrige eso.

MAL:
Código Delphi [-]
ADOQuery1.SQL := ' INSERT INTO ... ';

BIEN:
Código Delphi [-]
ADOQuery1.SQL := 'INSERT INTO ...';

Saludos,

AgustinOrtu 16-12-2015 04:45:51

Amigo Marcelo, No hay problemas con el whitespace, de hecho es una practica que uso porque alguna vez me paso de concatenar SQL y olvidarme un espacio y obviamente el resultado es que da error de sintaxis, siempre dejando un blanco de cada lado me ahorro esos quebraderos de cabeza

Yo creo que el problema esta en la conexion, me ha pasado mil veces

Cuando apenas empezaba en Delphi, hacia esto:

Código Delphi [-]
procedure Algo;
var
  qry: TADOQuery;
begin
  qry := TADOQuery.Create(NIL);  
  try
    { asignar sql }
    { asignar parametros }
    { ejecutar }
  finally
    qry.Free;
  end;
end;

Esto repartido por todos lados en donde necesitaba un query,

Y cual es el detalle? Falta asignar la conexion al TADOQuery; en particular, en ADO, da error al usar parametros

Entonces hoy hago siempre algo similar a esto:

Código Delphi [-]
function TAdoDataModule.CreateQuery(AOwner: TComponent): TADOQuery;
begin
  Result := TADOQuery.Create(AOwner);
  Result.Connection := FAdoConnection; // campo privado del TAdoDataModule, de tipo TADOConnection
end;

Listo nunca mas me olvido la conexion


----------------

Por otro lado revisa lo que te dice Marcelo, hay que respetar el tipo de los parametros en el query; como no nos diste esa informacion, yo asumi todo string

Si 'cantfactu' es un Integer, le estas pasando la propeidad Text de un ComboBox, es decir, un string! Estas mezclando peras con manzanas, literalmente

pd: Hoy parece que tengo las neuronas bastante apagadas :D

ZiriusB 16-12-2015 04:46:23

Código Delphi [-]
  ADOQuery1.SQL.Text :=
    'INSERT INTO factura (cantfactu,subtfactu,ivafactu,totalfactu,horafactu,idclientef,idpagof,iduserf)' +
    'VALUES (:cantfactu, :subtfactu, :ivafactu, :totalfactu, :horafactu, :idclientef, :idpagof, :iduserF)';
  ADOQuery1.Parameters.ParamByName('cantfactu').DataType := ftinteger;
  ADOQuery1.Parameters.ParamByName('cantfactu').Value := combocant.Text;

  ADOQuery1.Parameters.ParamByName('subtfactu').DataType := ftfloat;
  ADOQuery1.Parameters.ParamByName('subtfactu').Value := cant;

  ADOQuery1.Parameters.ParamByName('ivafactu').DataType := ftfloat;
  ADOQuery1.Parameters.ParamByName('ivafactu').Value := iva;

etc...

etc...

Sigue generando el mismo error, probé en otro form con otra tabla y otro ADO y me genera el mismo error, uso XE2 :S no se si tendra algo que ver con la versión.

Cambie el combobox por un tedit. y me genera el mismo error :/

Delphius 16-12-2015 04:54:03

Agustin, por algo decia que quiza no fuera un problema. Pero... a estas horas todo puede ser...

Y mejor no me hables de neuronas apagadas. Llevo 3 dias de mierda a causa de muy mal y poco dormir, el calor me esta haciendo mucho mal y encima anoche me di un susto enorme al comprobar que Lazarus no me iniciaba. Hace una hora, o un poquito más que termine la reistalacion y de paso actualizacion.
Ya me tope con el primer escollo: me quitaron el anchordocking y el sentimiento borderline volvio.

Saludos,

Delphius 16-12-2015 04:56:44

La burra al trigo! Al parametro cantfacu le defines un ftInteger pero en Value le sigues pasando un string.

Saludos,

AgustinOrtu 16-12-2015 04:56:46

Como hoy mismo me encontre diciendo, estos son los dias del año en que estamos todos locos, a mil por hora, cansados, y sobre todo este año, a la enesima potencia

-----------


Código Delphi [-]
  ADOQuery1.Parameters.ParamByName('cantfactu').DataType := ftinteger;
  ADOQuery1.Parameters.ParamByName('cantfactu').Value := combocant.Text;

Si traduzco eso a "humano", estas diciendo:

Preparate, te voy a dar un "Integer"
Toma, aca esta el "string"

ZiriusB 16-12-2015 05:07:02

Sigue generando el mismo error: "Argumentos incorrectos, fuera del intervalo permitido o en conflicto con otros'. Process ProGym.exe (5844)"

Código Delphi [-]
  ADOQuery1.SQL.Text :=
    'INSERT INTO factura (cantfactu,subtfactu,ivafactu,totalfactu,horafactu,idclientef,idpagof,iduserf )' +
    'VALUES (:cantfactu, :subtfactu, :ivafactu, :totalfactu, :horafactu, :idclientef, :idpagof, :iduserF )';
  ADOQuery1.Parameters.ParamByName('cantfactu').DataType := ftinteger;
  ADOQuery1.Parameters.ParamByName('cantfactu').Value := 1;

AgustinOrtu 16-12-2015 05:12:13

Pero le pusiste valores a todos los parametros?

ZiriusB 16-12-2015 05:25:37

Ya he intentado mil formas, solo cambie esa linea, las demás están igual, le asigne ese valor para probar, pero me sigue generando error:


Código Delphi [-]
  if ADOQuery1.Active then
    ADOQuery1.Close;

  ADOQuery1.SQL.Text :=
    ' INSERT INTO factura (cantfactu,subtfactu,ivafactu,totalfactu,horafactu,idclientef,idpagof,iduserf )' +
    ' VALUES (:cantfactu, :subtfactu, :ivafactu, :totalfactu, :horafactu, :idclientef, :idpagof, :iduserF )';
  ADOQuery1.Parameters.ParamByName('cantfactu').DataType := ftinteger;
  ADOQuery1.Parameters.ParamByName('cantfactu').Value := 1;

  ADOQuery1.Parameters.ParamByName('subtfactu').DataType := ftfloat;
  ADOQuery1.Parameters.ParamByName('subtfactu').Value := cant;

  ADOQuery1.Parameters.ParamByName('ivafactu').DataType := ftfloat;
  ADOQuery1.Parameters.ParamByName('ivafactu').Value := iva;

  ADOQuery1.Parameters.ParamByName('totalfactu').DataType := ftfloat;
  ADOQuery1.Parameters.ParamByName('totalfactu').Value := total;

  ADOQuery1.Parameters.ParamByName('horafactu').DataType := ftDateTime;
  ADOQuery1.Parameters.ParamByName('horafactu').Value := Mfechahora;

  ADOQuery1.Parameters.ParamByName('idclientef').DataType := ftstring;
  ADOQuery1.Parameters.ParamByName('idclientef').Value := form2.edtcedula.Text;

  ADOQuery1.Parameters.ParamByName('idpagof').DataType := ftinteger;
  ADOQuery1.Parameters.ParamByName('idpagof').Value := tpago;

  ADOQuery1.Parameters.ParamByName('iduserF').DataType := ftinteger;
  ADOQuery1.Parameters.ParamByName('iduserF').Value := 1;

  ADOQuery1.ExecSQL;
end;

Delphius 16-12-2015 05:38:15

Ummm. Noto que en el SQL indicas el mismo nombre tanto al nombrar los campos como a los parametros.
En teoria no debiera dar problemas pero es una buena practica llamar a los parametros diferente... por ejemplo si el campo es IDArticulo que el parametro para este sea pIDArticulo.

hace tiempo que no uso ADO, y se le conoce por ser un tanto rompe moldes y saca canas verdes. No me extrañaria que justo sea una casualidad de que el parser de MySQL mezclado con ADO lleve a un conflicto entre los nombres... uno de los errores da justo entender que no detecta los parametros.

Saludos

AgustinOrtu 16-12-2015 05:43:38

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`),

Código Delphi [-]
  ADOQuery1.SQL.Text :=
    ' INSERT INTO factura (cantfactu,subtfactu,ivafactu,totalfactu,horafactu,idclientef,idpagof,iduserf )' +
    ' VALUES (:cantfactu, :subtfactu, :ivafactu, :totalfactu, :horafactu, :idclientef, :idpagof, :iduserF)';


Los campos que estan en negrita no estan en la definicion de la tabla, a menos que lo hayas agregado despues

Delphius 16-12-2015 05:49:07

Cita:

Empezado por AgustinOrtu (Mensaje 500589)
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`),

Código Delphi [-]
  ADOQuery1.SQL.Text :=
    ' INSERT INTO factura (cantfactu,subtfactu,ivafactu,totalfactu,horafactu,idclientef,idpagof,iduserf )' +
    ' VALUES (:cantfactu, :subtfactu, :ivafactu, :totalfactu, :horafactu, :idclientef, :idpagof, :iduserF)';
Los campos que estan en negrita no estan en la definicion de la tabla, a menos que lo hayas agregado despues

Para andar con las neuronas apagadas tienes la vista bien despierta. Ni me di cuenta de eso.
Mejor nos vamos a dormir que si seguimos nos ponemos peor... a mi me falta poco para ser zombie.

Saludos


La franja horaria es GMT +2. Ahora son las 03:05:51.

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