Ir al contenido


Foto

Conexion con BB.DD sqlite


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

#41 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

Escrito 19 marzo 2016 - 03:01

Pues Fernando parece que a pesar de no reconocer VARCHAR ni INTEGER la cosa funciona. Mi demo tiene la tabla declarada con esos tipos. :|

 

dooper, lo que ves dentro del archivo es justamente la información binaria del archivo. Es lógico que te parezca raro lo que contiene puesto que así resulta ser el formato de como guarda SQLite internamente sus estructuras (tablas, vistas, etc) y el contenido de éstas. No tienes que preocuparte de eso.

Lo que debe preocuparte es que al momento de consultar o abrir la tabla obtengas realmente todo lo que hayas insertado.

 

Por ejemplo, en la base de datos que va incluída con mi demo se aprecia esto:

 

 

SQLite format 3 @                                                                    -ñ¹
   £ £                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     [    tablepersonaspersonasCREATE TABLE "personas" ("nombre" VARCHAR(30), "edad" INTEGER)
   ˜ ïâÔ®˜                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    -CodeTyphon work!)Lazarus rules!%DelphiAccessdelphius marcelo %LabeledEdit1

 

Pero si se compila el programa y se procede a leer la tabla verás los siguientes registros:

 

Labelededit1 - 0

marcelo - 32

delphius - 32

DelphiAccess - 8

Lazarus rules! - 11

CodeTyphon work! - 11

 

Sobre el error SQL Logic error o missing database si no recuerdo mal de mis pruebas, se da cuando uno no indica el schema. Como consejo cuando digas que te salta, o te da error por favor comentanos el texto exacto del error. Eso ayuda mucho a determinar la causa del error y una mejor resolución. Puedes copiarlo y pegarlo con las teclas de acceso rápido antes de presionar ENTER sobre el cuadro de diálogo ;)

 

Saludos,


  • 0

#42 dooper

dooper

    Advanced Member

  • Miembros
  • PipPipPip
  • 298 mensajes

Escrito 19 marzo 2016 - 04:41

Pues ya me queda más claro que el fichero no inserta solamente los campos, sino la estructura de la tabla y contenido interno.

 

Como digo, el error que me "saltaba" era "SQL ERROR: SQL LOGIC. ERROR OR MISSING DATABASE. Aceptar o Continuar...."

 

Procedí como digo a cambiar nombre VARCHAR(30) como indica enecumene a (nombre TEXT), idem lo mismo con edad y voilá funcionaba y ese error me dejo de salir.

 

Ahora he vuelto a cambiarlo, porque así lo tienes en la "demo" y ya sin explicación alguna FUNCIONA!!! cuando antes no funcionaba?. No tengo explicación a esto Delphius, como digo he cambiado la declaración del tipo de campo simplemente. El schema siguen estando en todos los casos.

 

Ahora a continuar, veré tu demo a fondo Delphius, y complementaré con el codigo de enecumene que voy entendiendo. Me queda hacer una consulta a la tabla y volcar los datos del fichero "main.db" al DBGRID, pero enecumene no hace mención al

DATASOURCE por ninguna parte.

 

Una sola cuestión, como se reemplazar el INSERT por el codigo adjunto? que habría que eliminar para usarlo?

 

Desearía seguir viendo la claridad, pero estoy convencido que volverán las sombras...

 

Saludos y mil gracias! No me cansaré de darlas! 


  • 0

#43 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

Escrito 19 marzo 2016 - 06:08

Pues ya me queda más claro que el fichero no inserta solamente los campos, sino la estructura de la tabla y contenido interno.

 

Como digo, el error que me "saltaba" era "SQL ERROR: SQL LOGIC. ERROR OR MISSING DATABASE. Aceptar o Continuar...."

 

Procedí como digo a cambiar nombre VARCHAR(30) como indica enecumene a (nombre TEXT), idem lo mismo con edad y voilá funcionaba y ese error me dejo de salir.

 

Ahora he vuelto a cambiarlo, porque así lo tienes en la "demo" y ya sin explicación alguna FUNCIONA!!! cuando antes no funcionaba?. No tengo explicación a esto Delphius, como digo he cambiado la declaración del tipo de campo simplemente. El schema siguen estando en todos los casos.

 

Ahora a continuar, veré tu demo a fondo Delphius, y complementaré con el codigo de enecumene que voy entendiendo. Me queda hacer una consulta a la tabla y volcar los datos del fichero "main.db" al DBGRID, pero enecumene no hace mención al

DATASOURCE por ninguna parte.

 

Una sola cuestión, como se reemplazar el INSERT por el codigo adjunto? que habría que eliminar para usarlo?

 

Desearía seguir viendo la claridad, pero estoy convencido que volverán las sombras...

 

Saludos y mil gracias! No me cansaré de darlas! 

 

No estoy a tu lado dooper asi que no te sabría decir porque el cambio de tipo antes no te resultó y después si, si estabas manteniendo el schema. Quizá el archivo estaba ya corrupto después de varios cambios, idas y vueltas, y tras algún borrado se arregló. Pero sólo estoy suponiendo.

 

Enecumene no habló de DataSource en ningún momento puesto que su ejemplo sólo se limitó a comentar como se carga dinámicamente y en ejecución la biblioteca de SQLite y en como proceder a insertar. El DataSource sólo tiene sentido cuando va a plantearse el uso de controles data-ware como DBGrid, DBEdit, DBNavigator, entre otros.

Uno puede prescindir de un TDataSource, no es obligación usarlos. El TDataSource lo único que hace es hacer de "puente" entre los controles data-ware y los DataSets (Querys, Tables, StoreProc, etc). Claro esta, que el no usarlos implica un costo más para el programador ya que ahora es su responsabilidad en traer los datos y encargarse de leer y recorrer el conjunto para mostrarlos en un StringGrid tradicional por ejemplo. Algo como esto:


delphi
  1. zquery1.First; // me voy al primer registro
  2. i := 0;
  3. while not zquery1.EOF do // mientras no haya llegado al último registro...
  4. begin
  5. i := i + 1;
  6. stringGrid1.RowCount := i; // incremento las filas del grid
  7. stringGrid1.Cells[1, i] := zquery1.FieldByName('Nombre').AsString; // a la fila i-esima le paso el dato
  8. zquery1.Next; // me voy al siguiente registro
  9. end;

Y cosas análogas a esas para hacer el paso inverso: desde los controles no-data-ware hacia el/los DataSets que necesite.

 

Hay dos corrientes en el mundo de Delphi y Lazarus: los que usan mucho data-ware y los que prefieren evitarlos. Motivos de pros y contras para cada una los hay.  Por el lado del NO uno de sus razones es que un error de configuración y/o de mal control de las operaciones que se van a realizar puede provocar que un control data-ware envíe la orden de realizar una inserción o de entrar en modo edición ¡O un borrado! cuando no estaba previsto eso. Es muy fácil disponer de controles data-ware, unos datasource, vincularlos con los datasets y con prácticamente nada de código tener un ABM. Es muy bueno eso. Nos ahorra mucho trabajo duro, es rápido, intuitivo.

Pero ahora multiplica un ABM diseñado para una tabla sobre un diseño de un sistema que maneja una base de datos de 50 tablas, con 25 formularios del tipo ABM... y ¡trata de no meter la pata como dejarte abierta una tabla o un DataSource vinculado a dos forms!

En cierto modo el concepto de data-ware escapa a ciertos conceptos de la POO y de algunas Buenas Prácticas, y es aquí donde los más extremistas del "grupo NO" y puristas del POO ponen más fuerza. Cuando una aplicación se concibe bajo el patrón Layers (Capas en español) y empieza a concebir capas como Aplicación, Presentación y Dominio como que el enfoque data-ware les resulta más una "incomodidad" y prefieren tener absoluto control de cuando y como leer y escribir en y desde sus DataSets ¡Por sus propios medios! ¡Y hasta se plantea la posibilidad de definir o usar un framework de persistencia!

 

Pero no sigo más porque esto es ya un tema más "avanzado" y te voy a hacer lios.

 

Tu continúa practicando. Ya verás que las cosas se te van a ir dando paso a paso. Y naturalmente llegará el momento en que te plantearás el debate de si usar o no data-ware... Sobre todo si te enamoras del purismo OO. Como algunos (yo me incluyo) ;)

 

Saludos,


  • 1

#44 dooper

dooper

    Advanced Member

  • Miembros
  • PipPipPip
  • 298 mensajes

Escrito 20 marzo 2016 - 07:47

Tu "demo" delphius, como siempre impresionante...tanto en comentarios como en setencias de codigo para analizar. Decir también que muchas de las sentencias
se escapan a mis conocimientos de momento, aunque haya algunas y modulos completos que ya puedo comprender su finalidad desde de estos
días batallando con los inicios a las bb.dd en delphius/Lazarus.
 
He intentado adaptar el ejemplo de la "demo" para poder mostrar en la DBGrid el contenido que guarda mi bb.dd (personas). 
 
He creado un DATASOURCE. dataset =Ztable1.
 
el DBGrid1.Datasource= Datamodule1.DATASOURCE
 
En el procedimiento que quiero vuelque los datos al DGBRid1 y comprobar que ha grabado correctamente los datos:

php
  1. DataModule1.ZReadOnlyQuery1.Close; //Por si acaso
  2. DataModule1.ZReadOnlyQuery1.SQL.Text := SELECT * FROM "main"."personas"
  3. DataModule1.ZReadOnlyQuery1.ExecSQL;
  4.  
  5. DataModule1.ZTable1.Open; //Luego abrimos la conexion
  6. DataModule1.ZTable1.first;
  7.  
  8. //Cerramos la tabla
  9. DataModule1.ZTable1.close;

pero el DBGRid va cargando filas (tantas como registros hay en tabla "personas") pero no visualiza sus campos. En este caso no se si habría que cambiar ZReadOnlyQuery1 por ZQuery1. he probado de ambas formas y tampoco.
 
Se que iré mal encaminado,o interprentando mal las sentencias de tu "demo"...
 
Un saludo

  • 0

#45 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

Escrito 20 marzo 2016 - 08:18

Si vinculaste el TDataSource con el TZTable y el TDBGrid con el TDataSource basta con hacer .Open sobre el TZTable para que te muestre sus registros en el TDBGrid (si es que además el TDataSource está habilitado).

En tu código veo que quieres hacer una consulta con el TZReadOnlyQuery y estás abriendo y cerrando el TZTable. Si abres y cierras en el TDBGrid no verás nada. Para que en el TDBGrid se vea todo se debe mantener abierto el DataSet con que se lo vinculó.

 

En el código está sobrando el TZReadOnlyQuery. Aunque puedes usarlo si quieres para mostrar dicha consulta. Te paso la serie de pasos y errores por corregir:

1. La consulta es un string por tanto debes encomillarla:


delphi
  1. TZReadOnlyQuery1.SQL.Text := 'SELECT ...';

2. Cuando la instrucción SQL es un SELECT se emplea el .Open y no .ExecSQL.

3. Debes vincular el TDataSource con el TZReadOnlyQuery.

4. Y obviamente mantener abierto el TZReadOnlyQuery durante el tiempo que necesites o consideres necesario para mostrar los datos. Ni bien apliques un .Close se cerrará y por tanto el TDBGrid no mostrará nada.

 

Fíjate que en mi demo intencionalmente mantengo cerrado mi Query y el Table y sólo los abro cuando es necesario. Del mismo modo para mostrar los datos en el DBGrid uso uno u el otro.

Si, es algo básico pero esto lo hice para demostrarte que es mejor dirigir el diseño de un sistema basado en "el tiempo de vida" de nuestras operaciones. Mantener lo mínimo e indispensable abierto y en ejecución es una práctica que te aportará mucho control. Para algo profesional habrá situaciones en las que uno deberá tener varios TDataSets abiertos, y hasta mostrando información en algún control como DBGrid, u otro.

Es mi objetivo que vayas entendiendo como es que se uno se conecta, se inserta, se muestra. Cada cosa por separado. Luego ya puedes practicar y unir dos o más conceptos.

 

Saludos,


  • 0

#46 dooper

dooper

    Advanced Member

  • Miembros
  • PipPipPip
  • 298 mensajes

Escrito 20 marzo 2016 - 09:02

Efectivamente de tu "demo" no me desvío, porque no quisiera "rizar el rizo" más de cuenta. Procedo como indicas...

 

1) Inserto un DATASOURCE en dataset -> Ztable1 (si le indico ZReadOnlyQuery1 no saca ninguna fila en la DBGRid, si indico ZTable1 saca filas vacias)

 

2) DbGrid1.dataSource -> Datamodule1.DataSource

 

3) Inserto codigo.


php
  1. Datamodule1.ZTable1.Open;
  2. Datamodule1.ZTable1.First;
  3. Datamodule1.ZTable1.Close;


php
  1. Si vinculaste el TDataSource con el TZTable y el TDBGrid con el TDataSource basta con hacer .Open sobre el TZTable para que te muestre sus registros en el TDBGrid (si es que además el TDataSource está habilitado).

Pues carga los registros pero DBGRid no actualiza visualizandolos... He eliminado el SELECT ya que indicas no sería necesario cierto?

 

 

saludos.


  • 0

#47 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 20 marzo 2016 - 10:19

Cabe aclarar que ZQueryReadOnly en este caso no está para devolver registros, sólo está para crear, ZTable es la única encargada de traer los registros, por eso en mi demo que te dejé asigno el tableName a ZTable luego de crear la tabla y antes de abrirla, como ya te comentaron anteriormente el DataSource ya se encarga de enlazar los datasets a los distintos DB-Aware (DBEdit, DBGrids, etc).

 

Saludos.


  • 0

#48 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

Escrito 20 marzo 2016 - 10:49

Efectivamente de tu "demo" no me desvío, porque no quisiera "rizar el rizo" más de cuenta. Procedo como indicas...

 

1) Inserto un DATASOURCE en dataset -> Ztable1 (si le indico ZReadOnlyQuery1 no saca ninguna fila en la DBGRid, si indico ZTable1 saca filas vacias)

 

2) DbGrid1.dataSource -> Datamodule1.DataSource

 

3) Inserto codigo.


php
  1. Datamodule1.ZTable1.Open;
  2. Datamodule1.ZTable1.First;
  3. Datamodule1.ZTable1.Close;


php
  1. Si vinculaste el TDataSource con el TZTable y el TDBGrid con el TDataSource basta con hacer .Open sobre el TZTable para que te muestre sus registros en el TDBGrid (si es que además el TDataSource está habilitado).

Pues carga los registros pero DBGRid no actualiza visualizandolos... He eliminado el SELECT ya que indicas no sería necesario cierto?

 

 

saludos.

 

Si haces .Open, .First, .Close en ese mismo orden, una instrucción seguida de otra, no hará nada. Le estás diciendo: Abre, Vete al primer registro, y Cierra.

Para insertar registros deberás hacer: .Open, .Insert, luego pasarle los datos, y por último para confirmar .Post.

 

Si hay un GBGrid vinculado al TZTable mediante el TDataSource, mientras esté abierto el TZTable deberá mostrar ese registro insertado. En el preciso momento en que hagas .Close el DBGrid dejará de mostrar los registros.

 

Al ReadOnly no lo he usado. Pensé que por el nombre es un tipo de query especializado y diseñado sólo para hacer SELECTs.

 

Como te he dicho: Si deseas hacer una operación de inserción, modificación, o eliminación tienes dos formas: por TZTable o por TZQuery. Elije una de ellas pero no ambas en el mismo proceso y a la vez. En mi demo ofrezco ambos usos para que te familizarices con ambos componentes. Pero fíjate que cuando uso Query no hago nada con el Table. Es más dejo al Table cerrado. Y si la operación es con el Table, el Query esta cerrado.

 

Juega con mi debo, inserta, muestra, cierra el grid, tantas veces como quieras.

Ahora prueba con Insertar, muestra y vuelve a Insertar. ¿Que pasó? Recibes un aviso de que hay una transacción en uso. Descarta esa, se cierra el Grid, y procede a insertar este nuevo registro. ¿Porque? Porque cuando se abrió la transacción para el proceso de Muestra en el DBGrid se la mantuvo abierta. Como estamos reaprovechando los datasets, a esta transacción destinada a la muestra la cancelamos y por consiguiente al dataset abierto lo cerramos. Como hemos cerrado el dataset para volver a usarlo en la inserción el DBGrid se cierra y se desvincula. Y entonces ahora si insertamos.

Cuando vuelvas a ejecutar el proceso de muestra se vuelve a asociar el DataSource al DataSet (Query o Table según elijas) y mientras no lo cierres o ejecutes otra inserción se mantendrá visible.

 

¿Vas entendiendo como es que funciona?

 

Saludos,


  • 0

#49 dooper

dooper

    Advanced Member

  • Miembros
  • PipPipPip
  • 298 mensajes

Escrito 20 marzo 2016 - 11:59

Pues en eso me baso, en crear el Datasource->DataSet = Ztable1 y en DBGrid.datasource = Datamodule1.DatSource.

 

Dices...."Para insertar registros deberás hacer: .Open, .Insert, luego pasarle los datos, y por último para confirmar .Post." pero en este

caso es un "muestra" .

 

Indicas..."Si hay un GBGrid vinculado al TZTable mediante el TDataSource, mientras esté abierto el TZTable deberá mostrar ese registro insertado".  no se porque hay veces que me "muestra" filas vacias, incrementándose cada vez que añado una "persona" nueva. 

 

En tu ejemplo, así lo indicas, lo que no veo es como "recorrer" la tabla, ya que te posicionas en el primer registros con Ztable1.First.

 

Como comenta enecumene, debo tirar de Ztable1 vinculado al Datasource, ya que de lo contrario no "muestra" ninguna fila aunque sea vacía...

 

La tabla "personas" tiene información insertada....pero en este  caso por más que cambio código, no hay solución...

 

Un saludo


  • 0

#50 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 20 marzo 2016 - 12:20

Una preguntonta, ¿activas ZTable1?, digo, ZTable1.Active := True, o en su defecto ZTable1.Open como lo indica Delphius.

 

1) En la Propiedad Connection de ZTable1 debe ser ZConnection1.

2) En la Propiedad Tablename de ZTable1 debe ir main.personas, si lo haces por código debes pasarle comillas y si es en diseño no va las comillas, y si aparece en el dropdown selecciona la tabla.

3) En la propiedad Active de ZTable1 coloca en true si es en diseño, por código es ZTable1.Active := true ó ZTable1.Open.

4) En el DataSource la propiedad Dataset debe ir ZTable1.

5) En el DBGrid la propiedad DataSource debe ir el nombre del DataSource o DataSource1 en su defecto.

6) Si aún así no aparecen los registros, intenta configurar las columnas del DBGrid y vuelve a intentarlo.

 


  • 0

#51 dooper

dooper

    Advanced Member

  • Miembros
  • PipPipPip
  • 298 mensajes

Escrito 20 marzo 2016 - 01:23


php
  1. Una preguntonta, ¿activas ZTable1?, digo, ZTable1.Active := True, o en su defecto ZTable1.Open como lo indica Delphius.

En modo diseño, si hago "click" sobre la casilla que está inicialmente a FALSE. me "salta" el ya famoso error "SQL ERROR. SLQ LOGIC ERROR OR MISSING DATABASE." volviendo a quedar por defecto en FALSE una vez que cierro el mensaje. No lo activo

por ninguna parte en codigo.


php
  1. 1) En la Propiedad Connection de ZTable1 debe ser ZConnection1.

Si, así esta.


php
  1. 2) En la Propiedad Tablename de ZTable1 debe ir main.personas, si lo haces por código debes pasarle comillas y
  2. si es en diseño no va las comillas, y si aparece en el dropdown selecciona la tabla.

Correcto así lo tengo, ya que el código de insertar que me implementaste enecumene está encima del código que quiero para mostrar el DBGRID. Lo que ya no se es si tengo que abrirlo con la misma sentencia que hago para insertar.


php
  1. 3) En la propiedad Active de ZTable1 coloca en true si es en diseño, por código es ZTable1.Active := true ó ZTable1.Open.

Si Ztable1.Active= TRUE, en diseño, me salta el mismo error "SQL ERROR. SQL LOGIC ERROR OR MISSING DATABASE". Volviendo a FALSE al cerrar el mensaje.

 

En el codigo Ztable1.Open está, pero no realizo la operación por código ZTable1.Active:= true, debo hacerlo, sería antes del .OPEN.?


php
  1. 4) En el DataSource la propiedad Dataset debe ir ZTable1.

Así lo tengo configurado, ya que aparecen 2 (Ztable1 y ZReadOnlyQuery1) si eligo este último, no sale ninguna fila vacía.


php
  1. 5) En el DBGrid la propiedad DataSource debe ir el nombre del DataSource o DataSource1 en su defecto.

Me sale en el dropdown por defecto. Datamodule1.datasource.


php
  1. 6) Si aún así no aparecen los registros, intenta configurar las columnas del DBGrid y vuelve a intentarlo.

Darle otro ancho distinto? o eliminarlas y volver crearlas?

 

No quisiera morir en el intento, pero todos estos fallos unos de Lazarus, la mayoría por mí, me crean más confusión que aprendizaje, ya que cambie lo que cambie y sea lo correcto o no, me termina dando errores y fallando lo que inicialmente me funcionaba bien al principio. Si no fuera por ustedes, creo que me hubiera "bajado" del auto que Lazarus está loco y yo empezando a estarlo" 8o|

 

Continuo en la brecha, pero no pensaba que "tocar" SQLITE siendo la más básica de las BB.DD fuera a darme tanto dolores de cabeza.

 

La conclusión que ahora mismo se me viene a la cabeza, es:  "lo que me falta todavía por aprender aún siendo sencillo lo estoy aprendiendo!!!!"

 

Gracias enecumene!


  • 0

#52 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 20 marzo 2016 - 01:36

ZTable1.Active y .Open es lo mismo mi estimado :)


  • 0

#53 dooper

dooper

    Advanced Member

  • Miembros
  • PipPipPip
  • 298 mensajes

Escrito 20 marzo 2016 - 01:45

ZTable1.Active y .Open es lo mismo mi estimado :)

 

Tomo nota, luego sí efectivamente Ztable1.Open si está puesto.


  • 0

#54 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

Escrito 20 marzo 2016 - 03:18

Pues en eso me baso, en crear el Datasource->DataSet = Ztable1 y en DBGrid.datasource = Datamodule1.DatSource.

 

Dices...."Para insertar registros deberás hacer: .Open, .Insert, luego pasarle los datos, y por último para confirmar .Post." pero en este

caso es un "muestra" .

 

Indicas..."Si hay un GBGrid vinculado al TZTable mediante el TDataSource, mientras esté abierto el TZTable deberá mostrar ese registro insertado".  no se porque hay veces que me "muestra" filas vacias, incrementándose cada vez que añado una "persona" nueva. 

 

En tu ejemplo, así lo indicas, lo que no veo es como "recorrer" la tabla, ya que te posicionas en el primer registros con Ztable1.First.

 

Como comenta enecumene, debo tirar de Ztable1 vinculado al Datasource, ya que de lo contrario no "muestra" ninguna fila aunque sea vacía...

 

La tabla "personas" tiene información insertada....pero en este  caso por más que cambio código, no hay solución...

 

Un saludo

 

Vamos por partes. Para una operación de inserción por código (como estamos haciendo) no hace falta configurar un TDataSource vinculando a un Table o Query según cual componente estés utilizando.

Es posible, ya que no he hecho prueba, que justamente como estás insertando desde el TZTable y el TDBGrid está vinculado a éste por medio del TDataSource, notes ese efecto de que aparece una fila en blanco en el DBGrid y luego como haces Post y lo cierras, desaparezca.

 

En ningún momento me pongo a recorrer la tabla en mi demo. El código implementado para mostrar los datos de la tabla en el TDBGrid en resumen lo único que hace es:

1. Establecer en la propiedad DataSet del TDataSource el TZTable o TZQuery según cual botón hayas pulsado

2. Abrir el DataSet elegido

 

Dejo que el propio componente DBGrid haga el trabajo.

 

Luego, es que yo te comenté que si uno pretende no tener ni usar TDataSource, para mostrar los datos debe hacer el trabajo por su propia cuenta y ahí si uno debe implementar un algoritmo que recorra los registros del primero al último y los vaya colocando en un TStringGrid, un Memo, o el componente que uno elija. Lo buena de esta forma "manual" de hacer el trabajo, es que después de extraer los datos con cerrar el DataSet no se "pierde" nada. Quedará almacenado en el/los componente/s que uno haya dispuesto.

 

Al DataSource lo puedes vincular y desvincular por código cuando quieras. Es lo que yo hago cuando paso del botón Insertar al botón Mostrar. Cuando necesito lo vuelvo a "conectar" sino queda desvinculado.

 

Para insertar es una cosa, y para mostrar es otra Dooper. No es el mismo código.

Para mostrar el contenido de una tabla basta con invocar a un .Open, y obviamente debe estar vinculado el componente db-ware con el TDataSource y éste con el TZTable (o un Query con una consulta SELECT). Para insertar debes ponerlo en modo inserción con Insert (o Append, para hacerlo sobre el final) y una vez pasado los datos confirmar. Cuando ya hayas insertado si puedes volver a re-abrir (cerrar y abrir) el Table y proceder a mostrar los cambios.

 

Para poder ayudarte dooper no veo otra forma que nos hagas llegar tu proyecto. No logro entender donde estás cometiendo el error. Sin ver los árboles y el bosque vamos a seguir en este mismo círculo vicioso.

 

Saludos,


  • 0

#55 dooper

dooper

    Advanced Member

  • Miembros
  • PipPipPip
  • 298 mensajes

Escrito 21 marzo 2016 - 09:20

como puedo subirte o subiros fichero comprimido?

 

Un saludo


  • 0

#56 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 21 marzo 2016 - 09:28

Google Drive, One Drive, Mega, DropBox.


  • 0

#57 dooper

dooper

    Advanced Member

  • Miembros
  • PipPipPip
  • 298 mensajes

Escrito 21 marzo 2016 - 11:43

Dejo acá la dirección http://www.mediafire...ycvb/PRUEBA.zip

 

Un saludo


  • 0

#58 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

Escrito 23 marzo 2016 - 07:02

Ya he descargado tu prueba. A partir de mañana dispongo de más tiempo asi que puedo darle unas miradas.

 

Saludos,


  • 0

#59 dooper

dooper

    Advanced Member

  • Miembros
  • PipPipPip
  • 298 mensajes

Escrito 23 marzo 2016 - 10:03

Tranquilo Delphius, me he desmotivo quizás más de lo que suele hacerlo, tras quedar "atasco" sin marcha atrás ni adelante. Confío en vosotros, no lo dudo.

 

Aunque no he dejado de "retorcer" código, pruebas varias, etc.. y como buenas lecciones que me das, estoy haciendo pruebas con ZQuery1 y dejar de lado el componente "ZTable1", usando "SELECT...." e "INSERT...." pero la BB.DD "personafarma" ni la crea en disco aún sentenciando "CREATE TABLE IF NOT EXISTS "main".personas" ("nombre" VARCHAR(10), "edad" INTEGER)'; 

 

En espera de vuestra estimable ayuda, Delphius,

 

Saludos


  • 0

#60 dooper

dooper

    Advanced Member

  • Miembros
  • PipPipPip
  • 298 mensajes

Escrito 25 marzo 2016 - 01:25

Pues en ello sigo y leyendo multitud de opciones en cuanto a los componentes Zeos y forma de enlazar con un DBGRid.

He "trasteado" lo impensable con el código, cosa que en parte no me agrada, ya que uno llega al punto de no saber nada, ni porque está tal o cual sentencia.

 

1) He usado querys y he prescindido de la Ttable1 (como bien me dijeron Delphius y enecumene se pueden usar ambas) para insertar, y consultar.

 

2) La razón por la cual no me creaba la BB.DD personalframa era porque en ZQuery debía indicarle la ruta del .DLL y carpeta del proyecto, igualmente que lo tiene indicado el ZConnection.

 

3) He quitado del datamodule1 donde estaban los componentes (TZconnection, TZQuery, TZTable y Datasource), éstos dos últimos, uno por no usarlo como digo anteriormente y el otro Datasource lo he pasado al formulario donde está el DBGrid a cargar. Decir que con esto, ya no me "salta" por lo aires cuando pasa por la sentencia. Datamodule1.ZQuery1.Open, antes del 'SELECT....'

 

4) La BB.DD personalFarma se crea con los dos campos de la tabla (nombre y edad) e inserta tantas veces como pulse el botón "personas".

 

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


php
  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;

pero el resultado es DBGrid totalmente vacío. El Dataset está ahora enlazado al datamodule1.Zquery1, etc...

 

un saludo

Archivos adjuntos


  • 0




IP.Board spam blocked by CleanTalk.