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)
-   -   Duplica registro en ClientDataSet maestro-detalle (https://www.clubdelphi.com/foros/showthread.php?t=52299)

Josepo 16-01-2008 19:23:32

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.

Caral 16-01-2008 19:30:31

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

Josepo 17-01-2008 09:01:48

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?

Caral 17-01-2008 16:53:18

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

Josepo 18-01-2008 09:34:28

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.

Lepe 18-01-2008 14:17:06

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

Josepo 21-01-2008 10:13:53

Gracias por tus observaciones, Lepe.

Cita:

Empezado por Lepe (Mensaje 259132)
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 (Mensaje 259132)
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 (Mensaje 259132)
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.

FREFREDDY 07-05-2013 07:20:46

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

Casimiro Notevi 07-05-2013 10:59:09

Cita:

Empezado por FREFREDDY (Mensaje 459907)
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 :)


La franja horaria es GMT +2. Ahora son las 15:18:43.

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