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 16-01-2008
Josepo Josepo is offline
Miembro
 
Registrado: nov 2007
Ubicación: Barcelona
Posts: 14
Poder: 0
Josepo Va por buen camino
Duplica registro en ClientDataSet maestro-detalle

Hola a todos,

Mi entorno es Delphi 7, MySql y componentes Zeos. ZConnection->ZQuery->DataSetProvidor->ClientDataSet->DataSource.

Tengo una relación maestro-detalle, con componentes DBEdit muestro los campos del maestro y con un DBGrid los del detalle. Navego sobre los registros del maestro con un DBNavigator. Parece estar todo correcto, puesto que cuando avanzo por el dataSet del maestro se muestran los registros respectivos de detalle.

El problema es que si paso por un registro maestro que posee registros detalle se muestran correctamente en el grid, pero si avanzo y luego retrocedo, los registros del grid se duplican. Si vuelvo a avanzar y vuelvo a retroceder, ahora los registros del grid son triples, etc.

He creado botones para controlar manualmente, con ClientDataSet.Next; y ClientDataSet.Prior; y da el mismo problema, como si ClientDataSet del detalle no se limpiara para el nuevo registro del maestro.

Seguro que es una chorrada, pero de momento me tiene bloqueado toda la tarde...

Gracias por vuestro interés.
Responder Con Cita
  #2  
Antiguo 16-01-2008
Avatar de Caral
[Caral] Caral is offline
Miembro Premium
 
Registrado: ago 2006
Posts: 7.659
Poder: 26
Caral Va por buen camino
Hola
Para mi por lógica diria que el problema esta en como se enlaza con el dbgrid, si es por tabla no deberia, si es por query debe tener algo.
No se.
Saludos
Responder Con Cita
  #3  
Antiguo 17-01-2008
Josepo Josepo is offline
Miembro
 
Registrado: nov 2007
Ubicación: Barcelona
Posts: 14
Poder: 0
Josepo Va por buen camino
Hola Caral,

Todas las conexiones las he hecho en tiempo de diseño, la propiedad SQL del ZQuery del maestro símplemente es:

Código SQL [-]
SELECT * FROM maestro

y la del detalle

Código SQL [-]
SELECT * FROM detalle

sin más misterio. ¿puede que el problema lo de los componentes Zeos?
Responder Con Cita
  #4  
Antiguo 17-01-2008
Avatar de Caral
[Caral] Caral is offline
Miembro Premium
 
Registrado: ago 2006
Posts: 7.659
Poder: 26
Caral Va por buen camino
Hola
El asunto es:
Si tengo una sentencia sql maestro y una detalle, el detalle esta buscando en base a un campo en comun del maestro, si no se limpia la consulta el dbgrid mantiene la informacion que tenia antes, osea la duplica, triplica, etc..
Cada vez que cambie la consulta del maestro tiene que estar limpia la del detalle, simple, o se cierra la consulta detalle o se da un clear al dbgrid.
El dbgrid simplemente es un depositario de la consulta, este guardara lo que se le ponga, salvo que se le indique lo contrario.
Zeos no tiene nada que ver en esto.
Saludos
Responder Con Cita
  #5  
Antiguo 18-01-2008
Josepo Josepo is offline
Miembro
 
Registrado: nov 2007
Ubicación: Barcelona
Posts: 14
Poder: 0
Josepo Va por buen camino
Gracias por tu interés, Caral.

Cita:
Cada vez que cambie la consulta del maestro tiene que estar limpia la del detalle
Lo entiendo, de hecho cuando se avanza sobre los registros del maestro el detalle va actualizando, pero no sabía que se tuviera que "limpiar" el contenido anteriormente visualizado...

Finalmente he comprobado que el problema no lo tiene el dbGrid, sino el clientDataSet. He puesto un chivato que me indica los registros que tiene el cds detalle (cdsDetalle.RecordCount) y resulta que va creciendo, es decir, quien incrementa en registros es el cds, el dbGrid sólo los muestra (no es neceasario limpiarlo).

Lo he solucionado haciendo un cdsDetalle.Refresh; pero no estoy convencido, creo que el ordenarle que refresque el cds detalle cada vez que visite un nuevo registro del cds maestro es un atraso, ya que implícitamente lo debería hacer (es decir, lo normal es que lo refresque solo, puesto que no tiene sentido que me acumule "visitas anteriores").

Bueno, si alguien alguien tiene alguna idea más lo agradeceré y sino me conformaré con el refresh.

Un saludo.
Responder Con Cita
  #6  
Antiguo 18-01-2008
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 29
Lepe Va por buen camino
Dos detalles:
- Verifica que el RecordCount es fiable. En tablas paradox si muestra la cantidad de registros que tiene, pero ya en MySql y Zeos, es normal que no dé el valor correcto. Muy posiblemente cds.RecordCount llame a ZQuery.Recordcount y si éste último retorna un valor incorrecto (caso normal en cliente/servidor) estará engañandote.

- El problema de navegación, me parece que es por usar el ZQuery. No he usado los Zeos, pero casi todos las consultas tienen la propiedad "Unidirectional" en el inspector de objetos. Esa propiedad a True, hace que un Dataset sea navegable sólo en el avance de registros, pero no en el retroceso.

Muchas veces necesitamos recorrer un Query (para añadir los elementos a un Combobox) y no necesitamos la capacidad de retroceder en los registros, por eso ponemos Unidirectional a True y ahorramos algunos recursos creando un cursor unidireccional.

Revisa todos los componentes que usas mirando esta propiedad.

Otra causa de mostrar registros inválidos, será por romperse la relación Maestro-Detalle, pero me parece extraño que cambies las sqls en tiempo de ejecución y que no lo hayas controlado.

Saludos
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
Responder Con Cita
  #7  
Antiguo 21-01-2008
Josepo Josepo is offline
Miembro
 
Registrado: nov 2007
Ubicación: Barcelona
Posts: 14
Poder: 0
Josepo Va por buen camino
Gracias por tus observaciones, Lepe.

Cita:
Empezado por Lepe Ver Mensaje
Verifica que el RecordCount es fiable
Tengo en cuenta lo que me dices, veo que RecordCount coincide con los registros que el cds me muestra, inicialmente aquí no tengo problema.

Cita:
Empezado por Lepe Ver Mensaje
El problema de navegación, me parece que es por usar el ZQuery
Yo también lo creo así, porque en situación parecida había probado con DBExpress y esto de no refrescar registros no me había pasado. Tengo poca experiencia con Delphi, así que tampoco puedo asegurar nada.

Cita:
Empezado por Lepe Ver Mensaje
casi todos las consultas tienen la propiedad "Unidirectional" en el inspector de objetos
No he encontrado esa propiedad en el ZQuery, en relación a la bidireccionalidad hago servir DataSetProvidor... El caso es que funcionar en sentido inverso, sí funciona, el problema es que no borra los registros detalle expuestos con anterioridad para ese registro maestro.

En todo caso, creo que la solución pasa por hacer un refresh en el cds implicado y se soluciona el problema, pero sigo pensando que esto no cuadra, que es un malfuncionamiento o yo no acabo de hacer bien algo.

Gracias nuevamente por vuestras aportaciones.
Responder Con Cita
  #8  
Antiguo 07-05-2013
FREFREDDY FREFREDDY is offline
Registrado
NULL
 
Registrado: feb 2013
Posts: 3
Poder: 0
FREFREDDY Va por buen camino
HOLA CARAL.
HOLA AMIGO ME PODES AYUDAR A REALIZAR UNA FACTURA CON delphi xe3 conexión dbexpress

GRACIAS . ESTOY DISPUESTO A AYUDAR A TODOS AQUELLOS QUE QUIERAN APRENDER A REALIZAR UN ABM
Responder Con Cita
  #9  
Antiguo 07-05-2013
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.264
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Cita:
Empezado por FREFREDDY Ver Mensaje
HOLA CARAL.
HOLA AMIGO ME PODES AYUDAR A REALIZAR UNA FACTURA CON delphi xe3 conexión dbexpress
GRACIAS . ESTOY DISPUESTO A AYUDAR A TODOS AQUELLOS QUE QUIERAN APRENDER A REALIZAR UN ABM
Bienvenido a clubdelphi, ¿ya leiste nuestra guía de estilo?, gracias por tu colaboració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
Problema con relación maestro-detalle en ClientDataSet David Conexión con bases de datos 3 11-01-2008 12:02:59
Maestro Detalle con ClientDataSet sin Provider fufo_m Varios 0 12-10-2007 19:09:02
Duplica Registros Maestro Detalle Moparova Conexión con bases de datos 1 30-05-2007 12:01:33
maestro-detalle, clientdataset,xml jmlifi Varios 0 05-01-2006 13:14:29
ClientDataSet Maestro Detalle como los relaciono ASAPLTDA Conexión con bases de datos 1 30-01-2005 00:07:48


La franja horaria es GMT +2. Ahora son las 19:49:53.


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