Ir al contenido


Foto

Conexion con BB.DD sqlite


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

#61 Agustin Ortu

Agustin Ortu

    Advanced Member

  • Moderadores
  • PipPipPip
  • 831 mensajes
  • LocationArgentina

Escrito 25 marzo 2016 - 03:02

5) La Sentencia para leer y volcar al DBgrid es la siguiente y es la misma que veo en otras partes:


delphi
  1. Datamodule1.ZQuery1.Close;
  2.  
  3. cadena_SQL:= 'SELECT * FROM personas';
  4.  
  5. Datamodule1.ZQuery1.SQL.Text:=cadena_SQL;
  6.  
  7. Datamodule1.Zquery1.Open; // = Datamodule1.ZQuery1.active:=true;


Revisa el DataSource del DBGrid: Ademas de estar asignado, debe estar apuntando a Datamodule1.Zquery1 en su propiedad DataSet


  • 0

#62 dooper

dooper

    Advanced Member

  • Miembros
  • PipPipPip
  • 298 mensajes

Escrito 25 marzo 2016 - 04:12

Asi está mi DbGrid Agustin....

 

http://www.mediafire...n777dc4ik6g.jpg

 

 

Ya las pocas ideas se me escapan...

 

 

 

Un saludo


  • 0

#63 Agustin Ortu

Agustin Ortu

    Advanced Member

  • Moderadores
  • PipPipPip
  • 831 mensajes
  • LocationArgentina

Escrito 25 marzo 2016 - 04:43

Que son esas columnas que te aparecen en tiempo de diseño? Hasta donde yo estoy enterado no hace falta crearlas en tiempo de diseño

 

Eliminalas a ver que pasa

 

Me he ido perdiendo cosas del hilo, veo que ahora usas ' SELECT * FROM Personas '. Que paso con lo del esquema? No te hace falta eso? Estas seguro de que la tabla tiene informacion? Como lo verificaste?


  • 0

#64 dooper

dooper

    Advanced Member

  • Miembros
  • PipPipPip
  • 298 mensajes

Escrito 25 marzo 2016 - 05:28

:|  :(  hasta donde leí, esas columnas son las del DBGrids, he creado tantas columnas como "campos" de la tabla. Si las elimino no saldrán el titulo de cada una ellas en el dgbrid, digo yo!.

 

Todo los cambios han sido provocadas por la falta de volcado de datos al DBGrid, como aparece en el post. En realidad daría igual ya que si algo funciona, es indiferente usar select, que otras sentencias equivalentes. Lo importantes es saber porque no funcionan en ambos casos.

 

Lo del esquema a que te refieres?

 

La BB.DD la crea ya que lo hace en la carpeta proyecto, edito el fichero y aparecen los campos registrados con los datos que introduzco en código, otra cosa que ya no se, es si están correctamente grabado.

 

 

------

 

Al quitar las columnas del DbGrid sigue sin aparecer el contenido, ahora aparece una tabla más pequeña con dos campos (nombre y edad) pero efectivamente se pueden eliminar, pero en absoluto se resuelve el problema, ya que sigue sin volcar datos.

 

 

saludos.


  • 0

#65 Agustin Ortu

Agustin Ortu

    Advanced Member

  • Moderadores
  • PipPipPip
  • 831 mensajes
  • LocationArgentina

Escrito 25 marzo 2016 - 05:41

La tabla se llama "Personas" o "Main"."Personas"?

 

Las columnas del DBGrid no es necesario a priori que esten definidas en tiempo de diseño; el DBGrid solo se encarga de crearlas cuando se conecta con el DataSource

 

Es util en los casos en los que queres definir propiedades o eventos o poder referenciarlas desde codigo (similar a los campos persistentes de los DataSet)

 

Pero por el momento me parece mejor que primero hagas funcionar el programa con lo minimo y necesario


Editado por Agustin Ortu, 25 marzo 2016 - 05:44 .

  • 0

#66 dooper

dooper

    Advanced Member

  • Miembros
  • PipPipPip
  • 298 mensajes

Escrito 26 marzo 2016 - 04:43

la tabla se llama "Personas", al final eliminé el schema "main" en todas las referencias donde estaba puesto, funcionándome perfectamente.

 

No se si el fichero graba bien los datos fisicamente, si hay alguna propiedad que está mal indicada, si faltan sentencias o las

que están son incorrectas, no lo se, pero no consigo cargar lo que grabo en el DBGrid y he probado como me comentais...

 

Desde luego el programa tiene lo mínimo y necesario para hacerlo funcionar

 

la tabla personas y su contenido, a Delphius que hizo igualmente la prueba tambien le aparecía la tabla así;


php
  1. SQLite format 3 @ -ñ¹
  2. ¥ ¥ YtablepersonaspersonasCREATE TABLE personas ("nombre" VARCHAR(10), "edad" INTEGER)
  3.  
  4. t òäÖȺ¬ž‚t
  5. Juancito JuancitoJuancitoJuancitoJuancitoJuancitoJuancitoJuancitoJuancitoJuancito


  • 0

#67 Agustin Ortu

Agustin Ortu

    Advanced Member

  • Moderadores
  • PipPipPip
  • 831 mensajes
  • LocationArgentina

Escrito 26 marzo 2016 - 08:42

No quedan muchas alternativas

Evalúa la propiedad RecordCount luego de ejecutar el Open del SELECT

La otra única posibilidad es que tengas algo mal en el ZConnection, o que un Dataset no esté conectado al ZConnection
  • 0

#68 Agustin Ortu

Agustin Ortu

    Advanced Member

  • Moderadores
  • PipPipPip
  • 831 mensajes
  • LocationArgentina

Escrito 26 marzo 2016 - 12:23

Me niego a creer que no te funcione

 

No tengo CodeTyphon instalado, en este momento tengo Lazarus version 1.6 y FPC 3 y me baje los componentes ZEOS desde su pagina oficial, la version mas reciente (ZEOSDBO-7.1.4-stable)

 

Voy a hacer las pruebas y luego posteo el proyecto


  • 0

#69 Agustin Ortu

Agustin Ortu

    Advanced Member

  • Moderadores
  • PipPipPip
  • 831 mensajes
  • LocationArgentina

Escrito 26 marzo 2016 - 01:25

Ok he creado un repo en GitHub con el proyecto. Descargalo y estudia el codigo

 

Nota: En el repo esta incluida la biblioteca SQLite3 de 64 bits

 

Es extrermadamente sencillo, no se me ocurre una forma mas simple de crear una aplicacion de base de datos

 

Simplemente conecte los componentes de la misma manera que siempre ZConnection -> ZQuery -> DataSource -> DBGrid

 

Luego hay un solo evento en toda la aplicacion (OnCreate del form principal), la cual se encarga de asignar el archivo donde se encuentra la base de datos SQLite

 

Despues se ejecuta la sentencia "si no existe la tabla de personas, creala"

 

Y por ultimo se indica en el ZQuery que se ejecute un SELECT contra la tabla de personas

 

A partir de ese momento ya es posible ver los datos en el DBGrid, insertar, modificar, borrar

 

Al cerrar y volver a abrir el programa los cambios quedaron guardados

 

 

Este es todo el codigo del programa:


delphi
  1. procedure TForm1.FormCreate(Sender: TObject);
  2. var
  3. RutaExe, RutaBD: string;
  4. begin
  5. // asignar dinamicamente el archivo con la BD SQlite
  6. RutaExe := ParamStr(0);
  7.  
  8. // le ponemos de nombre igual que el ejecutable, pero extension sdb3
  9. RutaBD := ChangeFileExt(RutaExe, 'sdb3');
  10.  
  11. // asignar al ZConnection
  12. ZConnection1.Database := RutaBD;
  13.  
  14. // conectar con la BD
  15. ZConnection1.Connected := True;
  16.  
  17. // el componente ZConnection es capaz de ejecutar sentencias SQL sin necesidad de crear
  18. // componentes Query, Table, etc
  19. // crear la tabla Personas si no existe, notar que NO use esquema (main en el ejemplo anterior)
  20. ZConnection1.ExecuteDirect('CREATE TABLE IF NOT EXISTS Personas ("Nombre" VARCHAR(30), "Edad" INTEGER);');
  21.  
  22. // abrir tabla de personas
  23. ZQuery1.SQL.Text := 'SELECT * FROM Personas';
  24. ZQuery1.Open;
  25. end;

El resto es conectar algunos componentes en tiempo de diseño

 

Un saludo


Editado por Agustin Ortu, 26 marzo 2016 - 01:28 .

  • 0

#70 dooper

dooper

    Advanced Member

  • Miembros
  • PipPipPip
  • 298 mensajes

Escrito 27 marzo 2016 - 01:20

Hola Agustin, voy a ver el código que explicas, porque veo que hay sentencias nuevas para mí, y tomaré nota de todas ellas, aparte de su

gran explicación en cada una de ellas según leo.

 

Hice lo que me indicaste, eliminar las columnas del DbGrid, puse el DataSource en el form donde está el DbGrid y he cambiado a usarlo

por sentencias ZQuery.  Me "salta" por los aire indicándome "SQL ERROR...."

 

La BB.DD la crea, pero la tabla "personas" con tantas pruebas, en algunos casos inserta datos y en otros no.

 

He revisado los componentes, y están configurados como se indican, incluso los eliminé y volví a crearlos nuevamente.

 

Seguiré luchando...aunque como el fallo venga de "cosas" internas de conexión entre componentes etc... dificil lo veo.

 

--------------------
 
Me da un error al ejecutar del tipo:
 
TestZeosSqlite.lpr(10,10) Fatal: "No puede encontrar zcomponentutilizado por TestZeos SQLitedel Inspector de Proyecto.

  • 0

#71 Agustin Ortu

Agustin Ortu

    Advanced Member

  • Moderadores
  • PipPipPip
  • 831 mensajes
  • LocationArgentina

Escrito 27 marzo 2016 - 02:15

Realmente no salgo de mi asombro

 

He, literalmente, borrado el proyecto entero de mi pc y lo he descargado enterito de nuevo de GitHub y puedo abir, compilar y ejecutar sin ningun problema

 

No sera problema de instalacion de los componentes? Bien sea Lazarus o bien sea Delphi, este tipo de configuracion de los programas es absolutamente trivial y me niego a creer que estes haciendo algo mal


  • 0

#72 dooper

dooper

    Advanced Member

  • Miembros
  • PipPipPip
  • 298 mensajes

Escrito 27 marzo 2016 - 05:04

Pues como ves Agustin, ya no se que estaré haciendo mal. Adjunto el proyecto, para que si puedes ejecutes el mismo y ver si obtienes el mismo resultado que yo, carga "personas" en tabla, pero visualiza filas "vacias" el dgGrid. A ver si ocurre eso, o es así personalmente.

 

http://www.mediafire...xz5/PRUEBA2.rar

 

y encuanto a tu proyecto, volveré a descargarlo y ejecutarlo nuevamente, pero por lo pronto, veo que seguiré con ese fallo de compilación...

 

Un saludo


  • 0

#73 Agustin Ortu

Agustin Ortu

    Advanced Member

  • Moderadores
  • PipPipPip
  • 831 mensajes
  • LocationArgentina

Escrito 28 marzo 2016 - 12:20

Ok, no te enojes pero..
 
Prueba a poner la propiedad OwnerDraw del DBGrid a True
 
:cheesy:
 
Aplicando las tecnicas de depuracion de la vieja escuela (esto eso, imprimiendo mensajes) fue facil detectarlo:
 


delphi
  1. ShowMessageFmt('%d', [Datamodule1.Zquery1.RecordCount]); // imprime la cantidad de registros que devuelve el query

Basicamente estaba todo bien conectado, el DataSet tenia registros, asi que no habia forma de que el grid no muestre datos. Hasta que se me ocurrio revisar las propiedades y vi OwnerDraw a False

 

La propiedad OwnerDraw le indica al DBGrid si debe pintarse/dibujarse el solo, o si vamos a hacerlo nosotros (alterando fuemtes, colores, tamaños, formato, etc) celda por celda

 

Si lo ponemos a True, el DBGrid se pinta solo (llamemosle display por defecto)

 

Si lo ponemos a False, el pintado es mediante código en eventos OnDraw, OnDrawCell, etc

 

Saludos!


  • 0

#74 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 28 marzo 2016 - 01:03

:|


  • 0

#75 dooper

dooper

    Advanced Member

  • Miembros
  • PipPipPip
  • 298 mensajes

Escrito 28 marzo 2016 - 03:31

8o|  8o|  y no me cansaría de dar martillazos....

 

:( DefaultDrawing:= TRUE; veo que me queda mucho por aprender, pero desde luego esta propiedad no se me va a olvidar...

 

Siento mucho, que hayáis perdido tanto tiempo en responder y ayudarme con "demos" para luego ver que el problema venía de ahí. Desde luego no está de más, ya de en estos días dándole vueltas al asunto, he podido aprender mucho como principiante en esto de las BB.DD en cuanto Sqlite, y desde luego se me ha quitado algo el miedo a usarlas y aprovechar el potencial que tienen.

 

Esto es el comienzo para seguir sin prisa pero sin pausa...

 

 

Gracias Agustin por "dar en el clavo" con el asunto, ya pensé en volver a instalar CT por si los componentes Zeos están corruptos...

 

Referenciando y viniendo a colación, no pude hacer pruebas de mensajes,  como indicas Agustín_Ortu, porque no daba con la sentencia y finalmente he aplicado esta que en el día de ayer pude hacerla funcionar correctamente:


php
  1. Form2.DBGrid1.Datasource.Dataset.RecordCount)+' '+ 'registros'

 ya que no me funcionaba, porque no referenciaba donde estaba el DBGrid1 (en este caso en el Form2), al estar trabajando en un form1, luego ya deduzco, que cuando necesitemos usar un "componente" (dbgrid, tstring, etc...) y estemos trabajando con otro distinto al que está, debemos indicarle el formulario que lo ubica. Tomo nota del mismo modo de la instrucción que hace lo mismo y has indicado.

 

Espero ir avanzando si "atascos"...pero no será así...por lo tanto gracias por la ayuda y la que necesite más adelante. Es un lujo pertenecer y contar con gente como vosotros en este foro :ap:

 

Saludos.


  • 0

#76 Agustin Ortu

Agustin Ortu

    Advanced Member

  • Moderadores
  • PipPipPip
  • 831 mensajes
  • LocationArgentina

Escrito 28 marzo 2016 - 04:40

Felicitaciones :)

 

Hubiera sido mucho peor si reinstalabas todo, recreabas la aplicacion, y te quedabas con la duda

 

Todos hemos pasado por cosas como esa (y peores :))

 

Por ejemplo a mi siempre se me olvida poner en los bucles que recorro los DataSet el .Next !

 

La primera vez que el programa se quedaba parado sufri enormemente para encontrar el problema, y resulto ser una cosa muy pava!

 

 

Por otra parte, hay otro concepto que debes entender y que es mas importante que lo del DefaultDrawing


delphi
  1. Form2.DBGrid1.Datasource.Dataset.RecordCount)+' '+ 'registros'

Ese codigo es equivalente a este, que ademas es mucho mas sano


delphi
  1. DataModule.ZQuery1.RecordCount

Es muy, pero muy importante que entiendas que el DataSet que es referenciado por el DataSource que es referenciado por el DBGrid es la misma cosa (el mismo objeto)

 

En sintesis: No hace falta que uses a la Unit2 para conocer los datos que muestra el DBGrid. Con el DataModule es suficiente. 

 

Cuantas menos unidades es necesario que incluyas en los uses mejor.

 

Es preferible agregar en el uses un DataModule a un Form (no es una religion pero es una buena "regla" o consejo)

 


  • 0

#77 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

Escrito 28 marzo 2016 - 06:17

¡Me están jodiendo! ¿¡Todo era por esa simple propiedad!? Como diría Homero Simpson ¡Me voy a volver changos! :|

 

Dooper, no te sientas mal, porque pifias las tenemos todos. Es más algunos hasta coleccionamos y llevamos un registro de ellas  *-)  Yo he llegado a pegar sitck-notes en mi viejo monitor con frases como "Cuando usas interfaces no se usa Free" o "Cuando vayas a recorrer una matriz, asegurate de colocar bien los índices y el sentido de lectura".

 

Toma nota de lo que comenta Agustín.

 

Lo de RecordCount no se hasta que punto trabaja bien. Al menos en Delphi, existía un defecto que ocasionaba que no se contara bien la cantidad de registros. Y para forzar el conteo bien se debía moverse al final y volver al inicio:


delphi
  1. MiDataSet.Last;
  2. MiDataSet.First;

Aunque creo que también se conseguía con cerrarlo y volver a abrirlo.

Desconozco si Lazarus heredó el mismo comportamiento. Yo la verdad es que prefiero hacer un SELECT COUNT para obtener la cantidad, almacenar el valor en alguna variable y después hacer un SELECT para traer los registros en cuestión.

 

Saludos,


  • 1

#78 Agustin Ortu

Agustin Ortu

    Advanced Member

  • Moderadores
  • PipPipPip
  • 831 mensajes
  • LocationArgentina

Escrito 28 marzo 2016 - 07:24

Evidentemente que tenia que ser una pavada porque no era posible que FreePascal, Lazarus y Zeos fallen en algo tan básico !!

 

 

Nunca me ha pasado lo que comentas Marchelo

 

Habrá que ver si era culpa de TDataSet o de alguna implementacion en particular, o incluso algun motor. Ojo que hay componenes que por defecto no traen todos los datos, traen de a bloques, y a medida que vas llegando al limite, van pidiendo mas al motor (vamos, paginan los datos)


Editado por Agustin Ortu, 28 marzo 2016 - 07:25 .

  • 0

#79 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

Escrito 28 marzo 2016 - 08:16

Hasta donde llega mi memoria sucedía en los IBX. Tanto en D6, D7 y en Turbo/2006 estaba presente ese error.

Pero creo recordar que en CD alguien había comentado que esto también podía pasar en otros DataSet de otras suites.
Desconozco si lo de traer por bloques tiene algo que ver con eso la verdad. Puede que si, tiene sentido. Pero no aseguro nada.

Saludos,
  • 0

#80 dooper

dooper

    Advanced Member

  • Miembros
  • PipPipPip
  • 298 mensajes

Escrito 29 marzo 2016 - 12:50

Gracias chicos. Lo que si noto y hasta cierto punto para un principiante como yo le ocurre ,es que resulta dificil de comprender el concepto DBGRID=DATASOURCE=DATASET cuando en realidad algo diferente, y más cuando haces un "mix" de Zquery=ZTable con estos componentes...
 
Agustin indicas...

En sintesis: No hace falta que uses a la Unit2 para conocer los datos que muestra el DBGrid. Con el DataModule es suficiente.

Cuantas menos unidades es necesario que incluyas en los uses mejor.

Es preferible agregar en el uses un DataModule a un Form (no es una religion pero es una buena "regla" o consejo)


Esto quisiera que me lo dejaseis claro, es decir. Si quiero usar/referenciar un componente (el que sea) que está en otro Form, debo anteponer en el formulario al que estoy, el Form donde está el componente, o hay alguna forma más segura y limpia de hacerlo?
 
En mi caso como dispongo de Form1 y Form2 pero claro, el componente está en el Form2 y el codigo donde estoy programando es el Form1, luego desde ese Form1, tendré que referenciar el DBGRid y el Form2.
 
Es preferible agregar en el uses un Datamodule a un  Form? No entiendo esto Agustín...
 
Los registros efectivamente, los saca igual con el codigo que Agustin, comenta, lo que si noto es que al cambiar, "parpadea" para efectuar el cambio del contador de registro "(1,2,3,4,5,6.....) registros", cuando visualmente queda mejor cambiando solo
el nº secuencial, si dar ese leve pantallazo al cambiar...
 
Digo todo esto porque quiero no usar malos hábitos...
 
 
Un saludo
  • 0




IP.Board spam blocked by CleanTalk.