Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Conexión con bases de datos (https://www.clubdelphi.com/foros/forumdisplay.php?f=2)
-   -   ClientDataSets y Firebird (https://www.clubdelphi.com/foros/showthread.php?t=69577)

Walterdf 26-08-2010 14:41:46

ClientDataSets y Firebird
 
Buenas a todos.

Tengo el siguiente problema. Antes les comento que uso D6 y FB1.5.

Es simple, tengo un programa que se utiliza para realizar pedidos de artículos. Utilizo una tabla cabecera y otra detalle. Para esto tengo dos clientdataset en donde hago los inserts y post a medida que se van agregando los registros del pedido.
Al finalizar el pedido, hago ApplyUpdates(-1) de cada uno de los CDS. Cierro los CDS con Close y luego los puedo consultar desde otro formulario.

El problema:
Utilizando FlameRobin (o cualquier otro dbmanager) para ver lo que pasa en las tablas, no veo los cambios despues del applyupdates en la base hasta que no cierro la aplicación.
Esto lo descubri ya que en un momento, por otro motivo, se colgo la aplicación y hubo que forzar el cierre y se perdieron pedidos.
Esta misma aplicacion la tenia funcionando con Paradox, con exactamente la misma lógica, luego migré a FB y me pasa esto.
Que estoy haciendo mal?

Muchas gracias desde ya.
Un abrazo.

Casimiro Notevi 26-08-2010 14:47:42

¿Haces commit después de hacer post?

Walterdf 26-08-2010 14:57:10

Hay algo que se me está escapaando...

Los inserts los hago sobre el ClientDataSet, cada uno con su Post.
Una vez que se agregan todos los articulos al pedido, confirmo todo haciendo ApplyUpdates. ¿No es el ApplyUpdates el que se encarga de commitear los datos a la base "físicamente" ???

Casimiro Notevi 26-08-2010 15:01:20

Se supone que sí.
¿Cómo estás tratando las transacciones?

Walterdf 26-08-2010 15:08:25

Veo que tengo grave un error de conceptos.
Tengo entendido que los ClientDataSet se encargan del manejo de las transacciones.
Yo simplemente hago todas las operaciones sobre los CDS, pense que el applyUpdates se encargaba de mandar los cambios.

Casimiro Notevi 26-08-2010 15:11:45

Aquí te dejo el enlace a un pdf que habla sobre TClientDataSet, está extraido del blog delphiallimite, lo estoy "adecentando" en cuanto a presentación, pero puedes descargarlo tal y como está ahora mismo.
Por si te sirve de ayuda con tu problema. Mis conocimientos sobre los tclientdataset son muy básicos.

Walterdf 26-08-2010 15:36:05

Ese es justamente uno de los documentos que leí antes de utilizar ClientDataSets, estaba en DelphiAlLimite, si mal no recuerdo.
Sigo la misma arquitectura y tengo este problema. Es muy raro. Algo debo estar haciendo mal o es un bug con los componentes.
Hay menciona que una versión de las IBX tienen problemas, como hago para fijarme que versión de IBX tengo?

Caro 26-08-2010 16:08:22

Hola

Cita:

Empezado por Walterdf (Mensaje 374632)
.............
Una vez que se agregan todos los articulos al pedido, confirmo todo haciendo ApplyUpdates. ¿No es el ApplyUpdates el que se encarga de commitear los datos a la base "físicamente" ???

Si, una ves que haces el ApplyUpdates guarda fisicamente en la BD.

Cita:

Empezado por Walterdf (Mensaje 374639)
Hay menciona que una versión de las IBX tienen problemas, como hago para fijarme que versión de IBX tengo?

No hice pruebas con las IBX, como dice en el documento puede que sea la versión de IBX que tengas el problema. Con delphi 7 viene la versión 7, para ver que versión tienes puedes ingresar a Component->Install Packages y buscas "Interbase Data Access" al ver su bpl puedes ver la versión que tienes.

Saluditos

Walterdf 26-08-2010 16:37:16

Gracias a todos por las respuestas
Tengo la version 6 de las IBX.
No detecto el problema.
Voy a tener que dejar de lado los clientdataset y realizar las operaciones directo sobre la base, un problemon... Los CDS eran una buena herramienta ya que la aplicación la diseñé en 3 capas. De hecho, cambié de Paradox a Firebird con cambios mínimos, solo en la capa de datos. Ahora esto me complica la existencia.
Si alguien tiene alguna pista mas...

Mil gracias.

Casimiro Notevi 26-08-2010 16:44:51

No tenemos datos para llegar a ninguna conclusión.
Sólo por preguntar: ¿la base de datos tiene activa la opción -mode en readwrite?, es que con windows es necesario porque en caso contrario mantiene en caché todos los cambios prácticamente hasta que se cierra el programa (y la base de datos).

ContraVeneno 26-08-2010 16:52:59

pues yo tenía la misma idea, la misma duda y el mismo problema.

para solucionarlo, despues de applyupdates, tengo que hacer un commit en la base de datos utilizando un TIBTransaction

Código Delphi [-]
  if (cdsModelos.ChangeCount > 0) then begin
   If cdsModelos.ApplyUpdates(0) = 0 then begin
    FireBirdTransaction.Commit;
   end;
  end;

Walterdf 26-08-2010 16:59:27

Casimiro Notevi:
En el componente IBDataBase no tiene esa propiedad.

ContraVeneno:
Es exactamente lo que acabo de probar. Esa es la única forma de que los cambios tengan efecto en la base despues del ApplyUpdates.
Creo que si hay que hacer eso si o si, el clientdataset carece de sentido.

ContraVeneno 26-08-2010 17:03:41

hombre, tanto como carecer de sentido no creo. Simplemente tener que hacer "a mano" las instrucciones para guardar una relación maestro detalle es mucho relajo, cuando sabes que el clientdataset lo maneja "automático".

El control de errores también es bastante sencillo manejarlo desde el clientdataset.

En fin, me parece más sencillo agregar un "commit", que tener que manejar las instrucciones "a mano".


Walterdf 26-08-2010 17:11:02

Es verdad, me expresé mal. Ahora, sabiendo que de esa manera van los datos a la base, obviamente no voy a cambiar toda la aplicación, pero si me da cierta desconfianza, ya que el componente no hace lo que en teoría debería.

Si alguien mas tiene alguna sugerencia, bienevenido sea.

Gracias a todos.

Un abrazo.

Caro 26-08-2010 17:13:04

Hola

Cita:

Empezado por Walterdf (Mensaje 374654)
................ Creo que si hay que hacer eso si o si, el clientdataset carece de sentido.

Yo no estoy de acuerdo con esa parte, el ClientDataSet te permite manejar datos en memoria y todo lo que puedes hacer con ello, yo lo he utilizado con DBExpress/Firebird y no he tenido ningún problema. Puede ser que sean los componentes (IBX), como dice el documento, el ClientDataSet no funciona correctamente con versiones anteriores a la 7.04, prueba de actualizar a esa versión.

Saluditos

ContraVeneno 26-08-2010 17:24:32

Y bueno, estoy seguro que ha de ser alguna configuración que está faltando, tal vez la que comenta Casimiro. El ClientDataset sí maneja las transacciones. Al menos conmigo sí lo hace cuando trabajo con SQL Server.

Cuando empeze a utilizar Firebird, pues esperaba que hiciera lo mismo, pero me toco agregar el commit. Seguro me falta alguna configuración por conocer. Un false a true, algo así.

Walterdf 26-08-2010 17:54:28

Es muy probable. Estuve investigando pero nada aún.

Dejemos abierta esta vía para quien tenga alguna idea al respecto.

Gracias a todos.

Al González 26-08-2010 22:04:19

Cita:

Empezado por Walterdf (Mensaje 374660)
...el componente no hace lo que en teoría debería...

Tienes una teoría muy personal de lo que "debería" hacer el método TClientDataSet.ApplyUpdates. ;)

Te aconsejo leer este hilo: http://www.clubdelphi.com/foros/showthread.php?t=57459. Es probable que tengas abierta ya una transacción al momento de llamar a ApplyUpdates, transacción de base de datos que espera ser confirmada.

ApplyUpdates es para enviar al servidor los cambios que están en memoria, no necesariamente para también confirmarlos a nivel de base de datos. El que también cometa (confirme) la transacción, depende de si ya está abierta una y no es precisamente algo de lo que deba ocuparse el componente TClientDataSet, sino su proveedor (el código de esto lo puedes ver en el hilo referido).

Espero se despejen tus dudas.

Saludos.

Al González. :)

Galahad 27-08-2010 16:18:27

Perdonad que interrumpa este hilo,,, estoy muy interesado en este tema , en particular en esta parte del mensaje..
Cita:

Los CDS eran una buena herramienta ya que la aplicación la diseñé en 3 capas. De hecho, cambié de Paradox a Firebird con cambios mínimos, solo en la capa de datos.
¿ Podrías explicarme como has efectuado ese cámbio simplemente utilizando los clientdataset ?

diegofhernando 27-08-2010 20:41:31

Hola, es probable que sea tal cual como te dicen los compañeros, yo te recomiendo que cambies de IBX a Zeos, son una excelente y gratuita opcion para conectar con Firebird y muchas otras bases de datos, aunque la verdad no estoy seguro de que zeos te funcione con D6, supongo que si.

PD: Modelar tu aplicacion en capas es una excelente idea y como pudiste notar los clientdataset ayudan mucho para lograrlo, no desistas y prueba las Zeos.

Salu2:cool:


La franja horaria es GMT +2. Ahora son las 20:31:58.

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