FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
|
Herramientas | Buscar en Tema | Desplegado |
#1
|
|||
|
|||
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. |
#2
|
||||
|
||||
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 |
#3
|
|||
|
|||
#4
|
||||
|
||||
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 |
#5
|
|||
|
|||
Gracias por tu interés, Caral.
Cita:
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. |
#6
|
||||
|
||||
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. |
#7
|
|||
|
|||
Gracias por tus observaciones, Lepe.
Tengo en cuenta lo que me dices, veo que RecordCount coincide con los registros que el cds me muestra, inicialmente aquí no tengo problema. 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:
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. |
#8
|
|||
|
|||
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 |
#9
|
||||
|
||||
Cita:
__________________
La otra guía de estilo | Búsquedas avanzadas | Etiquetas para código | Colabora mediante Paypal |
|
|
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 |
|