Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Conexión con bases de datos
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Conexión con bases de datos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 26-08-2010
Walterdf Walterdf is offline
Miembro
 
Registrado: may 2003
Ubicación: Buenos Aires
Posts: 152
Poder: 21
Walterdf Va por buen camino
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.
Responder Con Cita
  #2  
Antiguo 26-08-2010
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.040
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
¿Haces commit después de hacer post?
Responder Con Cita
  #3  
Antiguo 26-08-2010
Walterdf Walterdf is offline
Miembro
 
Registrado: may 2003
Ubicación: Buenos Aires
Posts: 152
Poder: 21
Walterdf Va por buen camino
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" ???
Responder Con Cita
  #4  
Antiguo 26-08-2010
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.040
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Se supone que sí.
¿Cómo estás tratando las transacciones?
Responder Con Cita
  #5  
Antiguo 26-08-2010
Walterdf Walterdf is offline
Miembro
 
Registrado: may 2003
Ubicación: Buenos Aires
Posts: 152
Poder: 21
Walterdf Va por buen camino
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.
Responder Con Cita
  #6  
Antiguo 26-08-2010
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.040
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
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.
Responder Con Cita
  #7  
Antiguo 26-08-2010
Walterdf Walterdf is offline
Miembro
 
Registrado: may 2003
Ubicación: Buenos Aires
Posts: 152
Poder: 21
Walterdf Va por buen camino
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?
Responder Con Cita
  #8  
Antiguo 26-08-2010
Avatar de Caro
*Caro* Caro is offline
Moderadora
 
Registrado: jul 2004
Ubicación: Cochabamba, Bolivia
Posts: 2.544
Poder: 22
Caro Va por buen camino
Hola

Cita:
Empezado por Walterdf Ver Mensaje
.............
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 Ver Mensaje
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
__________________
Disfruten cada minuto de su vida a lado de sus seres queridos como si fuese el ultimo, uno nunca sabe lo que puede pasar.
Responder Con Cita
  #9  
Antiguo 26-08-2010
Walterdf Walterdf is offline
Miembro
 
Registrado: may 2003
Ubicación: Buenos Aires
Posts: 152
Poder: 21
Walterdf Va por buen camino
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.
Responder Con Cita
  #10  
Antiguo 26-08-2010
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.040
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
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).
Responder Con Cita
  #11  
Antiguo 26-08-2010
Avatar de ContraVeneno
ContraVeneno ContraVeneno is offline
Miembro
 
Registrado: may 2005
Ubicación: Torreón, México
Posts: 4.738
Poder: 23
ContraVeneno Va por buen camino
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;
__________________


Última edición por ContraVeneno fecha: 26-08-2010 a las 16:56:47.
Responder Con Cita
  #12  
Antiguo 26-08-2010
Walterdf Walterdf is offline
Miembro
 
Registrado: may 2003
Ubicación: Buenos Aires
Posts: 152
Poder: 21
Walterdf Va por buen camino
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.
Responder Con Cita
  #13  
Antiguo 26-08-2010
Avatar de ContraVeneno
ContraVeneno ContraVeneno is offline
Miembro
 
Registrado: may 2005
Ubicación: Torreón, México
Posts: 4.738
Poder: 23
ContraVeneno Va por buen camino
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".

__________________

Responder Con Cita
  #14  
Antiguo 26-08-2010
Walterdf Walterdf is offline
Miembro
 
Registrado: may 2003
Ubicación: Buenos Aires
Posts: 152
Poder: 21
Walterdf Va por buen camino
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.
Responder Con Cita
  #15  
Antiguo 26-08-2010
Avatar de Caro
*Caro* Caro is offline
Moderadora
 
Registrado: jul 2004
Ubicación: Cochabamba, Bolivia
Posts: 2.544
Poder: 22
Caro Va por buen camino
Hola

Cita:
Empezado por Walterdf Ver Mensaje
................ 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
__________________
Disfruten cada minuto de su vida a lado de sus seres queridos como si fuese el ultimo, uno nunca sabe lo que puede pasar.
Responder Con Cita
  #16  
Antiguo 26-08-2010
Avatar de ContraVeneno
ContraVeneno ContraVeneno is offline
Miembro
 
Registrado: may 2005
Ubicación: Torreón, México
Posts: 4.738
Poder: 23
ContraVeneno Va por buen camino
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í.
__________________

Responder Con Cita
  #17  
Antiguo 26-08-2010
Walterdf Walterdf is offline
Miembro
 
Registrado: may 2003
Ubicación: Buenos Aires
Posts: 152
Poder: 21
Walterdf Va por buen camino
Es muy probable. Estuve investigando pero nada aún.

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

Gracias a todos.
Responder Con Cita
  #18  
Antiguo 26-08-2010
Avatar de Al González
[Al González] Al González is offline
In .pas since 1991
 
Registrado: may 2003
Posts: 5.604
Poder: 29
Al González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en bruto
Cita:
Empezado por Walterdf Ver Mensaje
...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.
Responder Con Cita
  #19  
Antiguo 27-08-2010
Galahad Galahad is offline
Miembro
 
Registrado: abr 2007
Posts: 218
Poder: 18
Galahad Va por buen camino
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 ?
Responder Con Cita
  #20  
Antiguo 27-08-2010
Avatar de diegofhernando
diegofhernando diegofhernando is offline
Miembro
 
Registrado: may 2003
Ubicación: Locombia papá!
Posts: 267
Poder: 21
diegofhernando Va por buen camino
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
__________________
Diego. Colombia es pasión.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Capturar errores - ClientDataSets rochi Providers 3 22-11-2008 00:05:17
ClientDataSets con parámetros, no funciona la consulta rochi Providers 3 10-10-2008 20:47:24
ClientDataSets- Personalizar errores rochi Conexión con bases de datos 0 03-05-2008 06:47:52
Clientdatasets anidados con ADO Johnny Q Conexión con bases de datos 4 03-11-2005 02:53:25
Update en Varios ClientDataSets. (Sincronización) Listirrinin Varios 0 19-10-2004 10:49:02


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


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
Copyright 1996-2007 Club Delphi