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)

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 18:43:25.

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