Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   MySQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=21)
-   -   ¿Cómo insertar datos con Mysql? (https://www.clubdelphi.com/foros/showthread.php?t=80028)

daragor 29-08-2012 16:05:36

¿Cómo insertar datos con Mysql?
 
Hola gente! necesito ayuda con lo siguiente..
Tengo un TEdit donde se debe ingresar una fecha, es importante que el formato sea del tipo dd/mm/aaaa (Ej. 25/08/2012)
- Existe alguna funcion para formatear esto por si el usuario ingresa mal este formato?

Tengo errores a la hora de compilar, el codigo es asi
Código Delphi [-]
*Declaro la variable:
Var
  cfec: TDate;
Begin
*En el Click del boton Grabar, hago el insert, antes trato de formatear la fecha ingresada:
  cfec:= StrToDate(fec.Text);
  cfec:= FormatDateTime('yyyy-mm-dd',cfec);
  QGraba.SQL.Text:= 'INSERT INTO compras (fec,paga,mon,esta) VALUES('+cfec+','+0.00+','+total.Text+',"CARGADA")';

Sobre todo tengo error en esta parte:
cfec:= FormatDateTime('yyyy-mm-dd',cfec);

Ahora el problema sigue debido a mi inexperiencia, viendo la base de datos mysql graba las fecha con el formato yyyy-mm-dd, y al realizar un INSERT tomando el texto del TEdit como debe ir formateado?

>>Entonces como debo tomar un dato de fecha y como debo insertarlo mediante una instruccion correcta en MySQL<<

Muchas gracias espero se entienda!

Caral 29-08-2012 16:09:46

Hola

Código Delphi [-]
Var
  cfec: TDate;
begin
  cfec:= FormatDateTime('yyyy-mm-dd',cfec);
  QGraba.SQL.Text:= 'INSERT INTO compras (fec,paga,mon,esta) VALUES('+cfec+','+0.00+','+total.Text+',"CARGADA")';

Esto (cfec:= StrToDate(fec.Text);) no es correcto, cfec lo declaras tdate, no string.


Saludos

daragor 29-08-2012 16:25:06

Hola Caral la verdad no entiendo que modificacion hiciste en el codigo, la cuestion es que sigue todo igual.. error al compilar. cfec esta declarado como TDate, eso puse.

El Error:
unit2.pas(205,10) Error: Incompatible types: got "AnsiString" expected "TDate"
unit2.pas(208,73) Error: Operator is not overloaded: "Constant String" + "TDate"

Espero puedas ayudarme, gracias

Caral 29-08-2012 16:39:50

Hola
Código Delphi [-]
Var
  cfec: TDate;
Begin
*En el Click del boton Grabar, hago el insert, antes trato de formatear la fecha ingresada:
   QGraba.SQL.Text:= 'INSERT INTO compras (fec,paga,mon,esta) VALUES('+FormatDateTime('yyyy-mm-dd',cfec)+','+0.00+','+total.Text+',"CARGADA")';

Saludos

Casimiro Noteví 29-08-2012 16:45:50

Bienvenido a clubdelphi, ¿ya leiste nuestra guía de estilo?, gracias por tu colaboración :)

Procura poner títulos descriptivos: "problema con fecha" no es ningún título descriptivo, ¿se te quedó el reloj sin pilas?, ¿no sabes en qué día vives?...
Gracias nuevamente por tu colaboración.

daragor 29-08-2012 16:55:57

Hola Casimiro.. pido disculpa por no publicar bien, no sabia de la existencia de la guia de estilo. Quise editar el titulo del post pero no puedo.

daragor 29-08-2012 17:19:15

NO me funciona, invalid date format... alguna guia de como hacer esto?

Caral 29-08-2012 17:22:28

Hola
No se como queda guardada la fecha en MySql, revisa la tabla y pon el formato como se necesite, lo mas logico es:
'yyyy/mm/dd' o 'yyyy.mm.dd' o al reves 'dd/mm/yyyy'
revisalo.
Saludos

Casimiro Noteví 29-08-2012 17:26:14

Cita:

Empezado por daragor (Mensaje 441068)
Hola Casimiro.. pido disculpa por no publicar bien, no sabia de la existencia de la guia de estilo. Quise editar el titulo del post pero no puedo.

Bueno, es normal, si eres nuevo aquí :)
Sólo tenlo en cuenta para la próxima vez :)

Bienvenido.

Casimiro Noteví 29-08-2012 17:28:16

También puedes usar parámetros para introducir los datos.
Te ahorras todos estos problemas.

MartinS 29-08-2012 18:08:38

Hola: y asi como sugiere casimiro?

Código Delphi [-]
QGraba.SQL.Text:= 'INSERT INTO compras (fec,paga,mon,esta) VALUES(:Fecha,'+0.00+','+total.Text+',"CARGADA")';
QGraba.ParamByName('Fecha').AsDate := StrToDate(Fec.TExt);

Saludos

roman 29-08-2012 18:30:57

Tal como ya te han comentado, es mejor, y yo diría que imperativo, introducir los valores vía parámetros. El dataset siempre sabrá cuál es el formato adecuado de la fech para el gestor de datos en partícular. Nunca hay que confiar en el "conocimiento" que tengamos acerca de ómo se guarda un determinado valor.

Por otro lado, mencionas que es importante que el formato sea del tipo dd/mm/aaaa, pero, recuerda que el formato es independiente del valor. No puedes forzar al motor a guardar la fecha en un formato determinado a menos que la guardes como cadena de caracteres, con lo cual pierdes las ventajas de tener el campo DATE. El formato es algo que debe preocuparte sólo al mostrar los datos en tu aplicación.

// Saludos

daragor 29-08-2012 21:45:40

Muchachos me han ayudado mucho, y encaminado a una buena programacion, vengo de visual foxpro y debo ir adaptandome a estas sintaxis.
Ya estoy estudiando parametros y segun entiendo funcionan muy bien. Gracias! excelente comunidad...

roman 29-08-2012 21:54:41

¡Qué bueno que te haya servido! :)

Realmente, el uso de parámetros en consultas SQL (y no sólo para valores tipo DATE) proporciona código más limpio y legible. Yendo más allá, yo te recomendaría, de hecho, no hacer consultas SQL `al vuelo`, esto es, no asignar el texto de la consulta en código sino hacerlo en el inspector de objetos durante el diseño de la aplicación. En código sólo el reemplazo de los parámetros.

Así tienes un código más fácil de mantener.

// Saludos

daragor 29-08-2012 22:00:47

Compañero roman, entonces los textos, cadenas, de consultas SQL irian en la propiedad SQL de un TSQLQuery? de ser asi... como hago para indicar distintos tipos de consultas a un solo objeto TSQLQuery? no consigo buenas guias para aprender. Por cierto, estoy usando Lazarus..

Casimiro Noteví 29-08-2012 22:07:29

La mejor guía para aprender :)

roman 29-08-2012 22:20:59

Cita:

Empezado por daragor (Mensaje 441148)
como hago para indicar distintos tipos de consultas a un solo objeto TSQLQuery?

Es que, en mi opinión, eso es una mala práctica. Cada consulta debe verse como un objeto en sí: clientes, recibos, agregaCliente, agregaRecibo, etc. Todos representados por un Query localizado en un DataModule.

Es preferible gastar unos cuantos bytes más en recursos usando múltiples querys que tratar de economizar reusando un sólo query.

Así, por ejemplo, tu consulta de este hilo estaría representada por un query qryAgregaCompra con el siguiente texto en su propedad SQL:

Código SQL [-]
insert into compras (fec,paga,mon,esta) values(:fecha, :pago, :monto, :estatus)';

Al momento de agregar una compra simplemente suples los valores:

Código Delphi [-]
qryCompras.ParamByName('fecha').AsDate := Fecha;
qryCompras.ParamByName('pago').AsFloat := 0;
qryCompras.ParamByName('monto').AsString := Total.Text;
qryCompras.ParamByName('estatus').AsString := 'CARGADA';

qryCompras.ExecSQL;

quedándote, según yo, un código mucho más limpio.

// Saludos

daragor 29-08-2012 23:29:07

Casimiro, impresionante.. puede ser algo muy muy util para mi en cuanto a sintaxis. Muchas gracias.

Roman! estoy entendiendo lo que dices compañero, claramente.. y me parece excelente, soy un obsesivo con la limpieza y orden del codigo, asi q me viene 10 puntos. Si puediera me pagaria un curso de delphi, lazarus.. pero en mi cuidad no hay. Asi que gracias muchas por los consejos!
Ahora, lo importante... tu dices "un datamodule" .. donde está? minimamente me dirias como se usa? Ya que insertar muchos de esos objetos TSQLQuery en los forms me estropea un poco el diseño en tiempo de diseño.. por eso pense en reusar un query varias veces..

Pd: que buen hilo, podrian editar el titulo del post para futuras busquedas.

Casimiro Noteví 29-08-2012 23:36:11

Lee el libro que te he enlazado antes, es lo mejor de lo mejor, te lo puedo asegurar.


Cita:

Empezado por daragor (Mensaje 441177)
Pd: que buen hilo, podrian editar el titulo del post para futuras busquedas.

¿Y qué título le podemos poner?

daragor 29-08-2012 23:41:00

No soy nadie para decir un titulo pero te puedo sugerir compañero Casimiro.. algo asi como "Correcta insersion de datos en Mysql"

Si! voy a estar a full con ese libro, mil gracias!

daragor 30-08-2012 00:37:37

Amigos, una cosa mas.. este libro me sirve para encaminarme en la programacion con lazarus? entiendo que la base es pascal y "hereda" todo los referido a delphi tambien... NO se, uds. guienme, no hay guias asi para lazarus directamente, pero entiendo que es mas q nada un entorno

roman 30-08-2012 01:22:30

Cita:

Empezado por daragor (Mensaje 441177)
tu dices "un datamodule" .. donde está? minimamente me dirias como se usa? Ya que insertar muchos de esos objetos TSQLQuery en los forms me estropea un poco el diseño en tiempo de diseño.. por eso pense en reusar un query varias veces..

File|New|DataModule

No hay realmente ninguna ciencia en usarlos. Son como un Form pero sólo en diseño, en ejecución no se ven. Podría decirse que son una superficie donde colocar componentes no visuales como los datasets.

// Saludos

daragor 31-08-2012 23:52:22

Hola amigos, como hago para la sintaxis de este caso en insersion SQL. Aclaro que estoy usando un datamodule llamado DM y la instruccion sql del query es:

Código:

INSERT INTO articulos (nom,pc,pv,stk) VALUES (:NOM,:PC,:PV,:STK)
El codigo, A y M son variables del caso:
Código Delphi [-]
procedure TForm1.grabaClick(Sender: TObject);
begin
  case oper of
  'A': DM.QAlta_art.ParamByName('NOM').AsString:= Trim(nom.Text);
       DM.QAlta_art.ParamByName('PC').AsFloat:= StrToFloat(pc.Text);
       DM.QAlta_art.ParamByName('PV').AsFloat:= StrToFloat(pv.Text);
       DM.QAlta_art.ParamByName('STK').AsInteger:= StrToInt(stk.Text);
       DM.QAlta_art.ExecSQL;
  'M': ShowMessage('Codigo de Edicion de articulo.');
  end;
end

Me da el siguiente error al compilar:
unit1.pas(34,35) Hint: Parameter "Column" not used
unit1.pas(79,68) Error: Constant and CASE types do not match
unit1.pas(79,68) Error: Constant Expression expected
unit1.pas(79,68) Fatal: Syntax error, ":" expected but ";" found

Caral 01-09-2012 00:14:44

Hola
Código Delphi [-]
procedure TForm1.grabaClick(Sender: TObject);
begin
       DM.QAlta_art.text:= 'INSERT INTO articulos (nom,pc,pv,stk) VALUES (:NOM,:PC,:PV,:STK)';
       DM.QAlta_art.ParamByName('NOM').AsString:= Trim(nom.Text);
       DM.QAlta_art.ParamByName('PC').AsFloat:= StrToFloat(pc.Text);
       DM.QAlta_art.ParamByName('PV').AsFloat:= StrToFloat(pv.Text);
       DM.QAlta_art.ParamByName('STK').AsInteger:= StrToInt(stk.Text);
       DM.QAlta_art.ExecSQL;
       ShowMessage('Codigo de Edicion de articulo.');
end;
No me suena mucho que los nombres de los parametros sean iguales al de los campos.
Saludos

daragor 01-09-2012 00:27:54

ok, CARAL hola! lo del nombre de parametros no hay problema, si es mejor los cambio. Lo que pasa es q no me sirve este codigo xq yo en un boton Grabar tengo 2 opciones: Nuevo o Modificacion y las instruccion SQL del query a usar esta en un datamodule.. por eso pense en un CASE, pero no se quizas con un IF ELSE.. podria, Ya que mi problema es que no se como se ponen varias instrucciones en una sola opcion del CASE.

Caral 01-09-2012 00:34:02

Hola
Creo que seria mejor con if.
Saludos
PD: La sentencia sql la pondria por codigo, asi es mas manejable y se puede usar el query varias veces.

roman 01-09-2012 04:41:58

Cita:

Empezado por daragor (Mensaje 441418)
Hola amigos, como hago para la sintaxis de este caso en insersion SQL. Aclaro que estoy usando un datamodule llamado DM y la instruccion sql del query es:

Código:

INSERT INTO articulos (nom,pc,pv,stk) VALUES (:NOM,:PC,:PV,:STK)
El codigo, A y M son variables del caso:
Código Delphi [-]
procedure TForm1.grabaClick(Sender: TObject);
begin
  case oper of
  'A': DM.QAlta_art.ParamByName('NOM').AsString:= Trim(nom.Text);
       DM.QAlta_art.ParamByName('PC').AsFloat:= StrToFloat(pc.Text);
       DM.QAlta_art.ParamByName('PV').AsFloat:= StrToFloat(pv.Text);
       DM.QAlta_art.ParamByName('STK').AsInteger:= StrToInt(stk.Text);
       DM.QAlta_art.ExecSQL;
  'M': ShowMessage('Codigo de Edicion de articulo.');
  end;
end

Me da el siguiente error al compilar:
unit1.pas(34,35) Hint: Parameter "Column" not used
unit1.pas(79,68) Error: Constant and CASE types do not match
unit1.pas(79,68) Error: Constant Expression expected
unit1.pas(79,68) Fatal: Syntax error, ":" expected but ";" found

En realidad, hay algo que no nos muestras, porque no se sabe a qué se refiere eso de Column. Por otra parte, múltiples sentencias en un mismo caso de un case deben ir en un bloque begin-end.

No tengo claro que intentas hacer. ¿Porqué juntar en un mismo botón el código de inserción y el de modificado?

pd: el nombre de los parámetros es indistinto.

// Saludos

daragor 03-09-2012 23:33:14

Gracias roman, mi ignorancia con la sintaxis de pascal me juega malas pasadas. el begin y el end son los faltantes.

Lo del boton seria.. que tengo 3 botones: Nuevo - Modificar - Grabar, si el usuario presiona Nuevo, se activan los Tedit necesarios y el Boton Grabar, una vez llenado los datos, presiona Grabar y el programa reconoce q esta haciendo un Alta. Si presiona Modificar, lo mismo, pero el programa reconoce q es una modificacion de datos. Esta mal planteado roman?


La franja horaria es GMT +2. Ahora son las 04:06:15.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi