Ir al contenido


Foto

Editar datos del DBGrid?


  • Por favor identifícate para responder
32 respuestas en este tema

#21 dooper

dooper

    Advanced Member

  • Miembros
  • PipPipPip
  • 298 mensajes

Escrito 09 mayo 2016 - 10:14

Nada más se me ocurre crear de nuevo el ZQuery1, pero antes, verifica bien como tienes la consulta en el ZQuery1.

 

Algo mal estoy haciendo seguro! En el Datamodule1, tengo el ZQuery1 que puse en su día. Solo lo uso en la consulta de para mostrar los datos al DBGrid1 por código, mediante las sentencias.


php
  1. DataModule1.ZQuery1.SQL.Text:= 'SELECT * FROM "personas"';
  2. DataModule1.ZQuery1.Open;

Es más, he implementado el código de que al hacer dobleclick sobre la fila me cargue en Edit el dato y todo correcto, usando Datamodu1.ZQuery1.FieldByName('nombre').AsString.


php
  1. procedure TForm2.DBGrid1DblClick(Sender: TObject);
  2. begin
  3. form.edit1.text:=Datamodule1.ZQuery1.FieldByname('nombre').AsString;

Ahora con el código tanto tuyo Enecumene, como el de Egostar, me avisa de ese error!


  • 0

#22 dooper

dooper

    Advanced Member

  • Miembros
  • PipPipPip
  • 298 mensajes

Escrito 09 mayo 2016 - 12:12

Por fin otro tropiezo y volver a levantarse. El problema estaba que el codigo lo inserté en el procedimiento Oncreate del Form, cuando debería haberlo hecho en el otro del botón.

 

Pero como el uso de ZQuery´s, van en aumento, y dispongo de muchas lagunas todavía de sus usos, porque no los veo como "variables" como tales, el codigo queda:


php
  1. Datamodule1.ZQuery3.SQL.Text := 'SELECT * FROM "personas" WHERE nombre = '+ Datamodule1.ZQuery1.FieldByName('nombre').AsString;
  2. Datamodule1.ZQuery3.Open;
  3.  
  4. form.edit1.text:=Datamodule1.ZQuery1.FieldByname('nombre').AsString;
  5. // Con esto me vuelca la fila seleccionada del DBGrid, el campo "nombre" en el Edit1. Y como sabe que
  6. // fila seleccionada es para volcar el dato al edit?

pero sigo con dudas en estas sentencias como por ejemplo:

 

ZQuery3 (Editar) que datos contiene en ese instrucción? si luego no la uso para nada más, sino el uso más importante es el Zquery1 que le da los datos a los TEdit?

 

ZQuery1 lo uso por código con la sentencia en otro lugar para mostrar todos los registros

 

 ZQuery1.SQL.Text:='SELECT * FROM "personas" y ZQuery1.Open, entonces ZQuery1 que contiene igualmente?

 

En la sentencia uso "Datamodule1.ZQuery1.FieldByName('nombre').AsString", luego es necesario disponer de un ZQuery1 como yo tengo, para poder realizar la edición de los datos? 

 

Tengo muchas lagunas con respecto a los ZQuery, porque no me hago a la idea del uso como lo hacen las "variables" si es que se puede comparar como tal, si me resultaba más fácil de comprender cuando leo el componente Ztable por ejemplo.

 

Ahora solo me queda modificar los campos si alguno cambia y volver a grabar en la tabla mediante sentencia UPDATE (existe componente TZupdateSQL en Zeos), veré dicha sentencia como me así me expuso mi gran amigo Delphius.

 

Un saludo


  • 1

#23 dooper

dooper

    Advanced Member

  • Miembros
  • PipPipPip
  • 298 mensajes

Escrito 13 mayo 2016 - 12:16

Aprovechando este post, y después de todo una semana intentando usar correctamente la sentencia UPDATE  en SQLite, sin éxito, necesitaría alguna idea de mi mal uso. 

 

Conseguido el objetivo de editar el registro seleccionado (con componentes TEdit) en un Form. Me dispongo a modificar esos datos del Form y ser grabado de nuevo a la tabla. Como bien dijo mi amigo Delphius en no usar un campo "nombre" como primary key, he usado uno llamado "codigo".


php
  1. procedure TForm4.BitBtn1Click(Sender: TObject);
  2. begin
  3. Datamodule1.ZQuery4.SQL.Text:='UPDATE TABLE "personas" SET codigo=:codigo, nombre=:nombre, edad=:edad, sexo=:sexo WHERE codigo = '+ Datamodule1.ZQuery1.FieldByName('codigo').AsString;
  4. Datamodule1.ZQuery4.ParamByName('codigo').AsString:= form4.edit1.text;
  5. Datamodule1.ZQuery4.ParamByName('nombre').AsString:= form4.edit2.text;
  6. Datamodule1.ZQuery4.ParamByName('edad').AsInteger:= StrToInt(form4.edit1.text);
  7. Datamodule1.ZQuery4.ParamByName('sexo').AsString:= GetSexoSeleccionado;
  8. Try
  9. Showmessage(Datamodule1.ZQuery4.ParamByName('codigo').AsString); // muestra ok el 'codigo' seleccionado en DBGRid
  10.  DataModule1.ZQuery4.ExecSQL;
  11. except on E:Exception do
  12. begin
  13. ShowMessage('Codigo duplicado/no modificado: '+E.Message);
  14. end;
  15. end;

GetSexoSeleccionado, esta ubicado en mi Unit2, pero no la reconoce ni incluso indicándole esa unidad en uses.

 

Al grabar, me da el siempre y fatídico error "SQL Logic Error or missing Database".

 

Como modificar todos los datos, menos el código que es clave primaria? Pensé que era porque grabo el registro

nuevamente y al estar duplicado me salta el error, pero ese error de duplicidad es el "SQL Constraint failed" que no es este caso.

 

Un saludo

 

 

 

 


  • 0

#24 dooper

dooper

    Advanced Member

  • Miembros
  • PipPipPip
  • 298 mensajes

Escrito 15 mayo 2016 - 05:38

Continúo en un bucle sin salida. He conseguido eliminar el error fatídico "SQL Logic Error or missing Database", eliminando la sentencia 

 

Datamodule1.ZQuery4.ExecSQL, y cambiándola por Datamodule1.ZQuery4.ApplyUpdates. Pero aún así no actualiza los campos.

 

No se, si es correcto lo que he hecho, a efecto de implementación de código, pero es lo único que me permite! . Ni siquiera

se, si el código SQL y asignación de variables son los apropiadas, pero despues de mucho leer, así las he visto!

 

 

 

Actualizando este hilo, si elimino la palabra TABLE de "UPDATE TABLE "personas".....", tambien desaparece el fatídico error que indico, pero no actualiza ningun campo de la tabla.

 

Un saludo

 

 


  • 0

#25 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 15 mayo 2016 - 01:57

La sintaxis correcta de Update es ésta:


sql
  1. UPDATE personas SET nombre = dooper WHERE codigo = 1

¿Cómo tienes declarado código? ¿como número?, que sería lo correcto, si es así estás haciendo mal el casting porque pasas el código como texto, debiera de ser así:


delphi
  1. Datamodule1.ZQuery4.ParamByName('codigo').AsInteger:= StrToInt( form4.edit1.text);

Saludos.


  • 0

#26 dooper

dooper

    Advanced Member

  • Miembros
  • PipPipPip
  • 298 mensajes

Escrito 15 mayo 2016 - 02:03

codigo lo tengo declarado como VARCHAR. Lo declaro así, porque quiero usarlo como alfanumérico.

 

Decir que el codigo, no quiero modificarlo porque es clave primaria UNIQUE y NOT NULL, lo cual en la sentencia SQL del Update no lo indico como campo, para que no nos de opción de introducir uno distinto al que ya tiene.


delphi
  1. procedure TForm4.BitBtn1Click(Sender: TObject);
  2. begin
  3. Datamodule1.ZQuery4.Close;
  4. Datamodule1.ZQuery4.SQL.Text:='UPDATE "personas" SET nombre=:nombre, edad=:edad, sexo=:sexo WHERE codigo = '+ Datamodule1.ZQuery1.FieldByName('codigo').AsString;
  5.  
  6. Datamodule1.ZQuery4.ParamByName('nombre').AsString:=form4.edit1.text;
  7. Datamodule1.ZQuery4.ParamByName('edad').AsInteger:= StrToInt(form4.edit2.text);
  8. Datamodule1.ZQuery4.ParamByName('sexo').AsString:= GetSexoSeleccionado;
  9. Try
  10. DataModule1.ZQuery4.ExecSQL;
  11. except
  12. on E:Exception do // E:Excepcion
  13. begin
  14. ShowMessage('El Código está duplicado/no modificado!: '+E.Message); //E.ClassName
  15. end;
  16. end; //end-Try
  17. end;


  • 0

#27 dooper

dooper

    Advanced Member

  • Miembros
  • PipPipPip
  • 298 mensajes

Escrito 16 mayo 2016 - 10:44

Puede haber alguna propiedad o valor  (aún me acuerdo del DefaultDrawing) que haya que cambiarla que afecta para la grabación del registro? No consigo con estas sentencias arriba indicadas, grabar los campos a la tabla "personas". Si visualizo los ZQuery4 y sus campos, guardan los datos modificados correctamente y codigo igual en la sentencia Update. pero al ejecutar ExecSQL no actua, además sin darme ningun error!

 

He eliminado base de datos  en disco, y volver a ejecutar y nada.

 

 


  • 0

#28 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 16 mayo 2016 - 11:46

Intenta quitandole las comillas dobles de la consulta, sólo eso por el momento se me ocurre.
  • 0

#29 dooper

dooper

    Advanced Member

  • Miembros
  • PipPipPip
  • 298 mensajes

Escrito 16 mayo 2016 - 11:55

Que va, enecumene, ya probé eso mismo! No se como afrontar esta "simple" modificación de datos y grabación a la tabla.

La cuestión es que compila perfectamente, pero no hace nada. Edito la base de datos para ver que tiene y nada, yni un campo modificado!

 

Podría ser algo relacionado con la clave "codigo" primary key? la consulta SQL me visualiza el registro del dbgrid que quiero , modifico los campos Tedit y vuelvo a grabar, pero nada! Que odisea!

 

Un saludo


  • 0

#30 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 16 mayo 2016 - 12:42

No logro replicar tu problema, acabo de hacer algunas pruebas y he podido actualizar, pregunta #1, el campo codigo tiene datos? es alfanumerico como mencionas?, que valor tiene?.

De todos modos haz la siguiente prueba:
 


delphi
  1. Datamodule1.ZQuery4.SQL.Text:='UPDATE personas SET nombre=:nombre, edad=:edad, sexo=:sexo WHERE codigo = '+ QuotedStr(Datamodule1.ZQuery1.FieldByName('codigo').AsString);

Si es alfanumérico como mencionas entonces el valor de código debe ser tratado como cadena, eso quiere decir que en las consultas debe ir entre comillas simples, que en ningún momento se le está aplicando.

 

Nos comentas.


  • 0

#31 dooper

dooper

    Advanced Member

  • Miembros
  • PipPipPip
  • 298 mensajes

Escrito 16 mayo 2016 - 01:03

Ahora sí enecumene. Razón, QuotedStr.

 

La cuestión es que Datamodule1.ZQuery1.FieldByName('codigo').AsString, mostraba al imprimir en pantalla el codigo correctamente, luego no se estaba tratando como cadena? si por defecto este campo es "VARCHAR".

 

QuotedStr en realidad como funciona? en este caso, convierte un VARCHAR a cadena? si ya lo es de por sí!

 

Si el campo "codigo" hubiera sido un integer, no sería necesario usar Quotedstr?

 

Mil gracias enecumene. No salía de mi asombro. 

 

Un saludo


  • 0

#32 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 16 mayo 2016 - 01:13

QuotedStr lo que hace es agregar automáticamente comillas simples a una cadena, por ejemplo convierte JUAN en 'JUAN'


  • 0

#33 dooper

dooper

    Advanced Member

  • Miembros
  • PipPipPip
  • 298 mensajes

Escrito 16 mayo 2016 - 01:21

QuotedStr lo que hace es agregar automáticamente comillas simples a una cadena, por ejemplo convierte JUAN en 'JUAN'

 

Ahora si lo entiendo, luego lo estaba tratando como un numero, dicho código.

 

Mil gracias y no me cansaré de repetirlo!

 

Un saludo


  • 0




IP.Board spam blocked by CleanTalk.