PDA

Ver la Versión Completa : Problema con Maestro/Detalle


totote
26-09-2008, 14:00:16
Hola gente del foro, queria consultarles sobre un problema relacionado con realizar altas en una relación maestro detalle, que me surgio hace poco y no se como solucionarlo, paso a comentarles:
Tengo en una base de datos Firebird 2.0 las siguientes tablas

CREATE TABLE TABLA1 (
ID INTEGER NOT NULL,
NOMBRE VARCHAR(50)
);

CREATE TABLE TABLA2 (
ID INTEGER NOT NULL,
ID_TABLA1 INTEGER,
NOMBRE VARCHAR(50)
);
ALTER TABLE TABLA2 ADD CONSTRAINT FK_TABLA2 FOREIGN KEY (ID_TABLA1) REFERENCES TABLA1 (ID) ON DELETE CASCADE ON UPDATE CASCADE;

En el proyecto de Delphi (Delphi 2007) tengo un Formulario y un modulo de datos, en la reclación Maestro/Detalle utilizo componentes de DBExpress


http://www.clubdelphi.com/foros/cid:002201c91f11$0ef80490$4001a8c0@totote
Formulario:
http://img243.imageshack.us/img243/7739/formsw6.jpg

http://www.clubdelphi.com/foros/cid:002301c91f11$0ef80490$4001a8c0@totote


Maestro/Detalle

http://img136.imageshack.us/img136/5820/dmbq5.jpg

Las prompiedades de los componetes son:


Modulo de datos:


SQLDataSet1:
- CommandText: select * from TABLA1
- SQLConnection: Conexion
- Tiene los componentes de campo creados
- ID --> ProviderFlags --> pfInKey --> True
DataSource1:
DataSet: SQLDataSet1
SQLDataSet2:
- CommandText: select * from TABLA2 where ID_TABLA1 = :ID
- SQLConnection: Conexion
- DataSource: DataSource1
- Tiene los componetes de campo creados
- ID --> ProviderFlags --> pfInKey --> True
DataSetProvider1:
- DataSet: SQLDataSet1
- Exported: False
- UpdateMode: upWhereChanged
- poIncFieldProps: True
- poCascadeDeletes: True
- poCascadeUpdates: True
- poAutoRefresh: True
- poPropagateChanges: True
- poAllowCommandText: True
ClientDataSet1:
- ProviderName: DataSetProvider1
- Tiene los componentes de campo creados y aparece el campo SQLDataSet2
ClientDataSet2:
- DataSetField: ClientDataSet1SQLDataSet2
- Tiene los componentes de campo creados



Hasta ahí parece estar todo bien, si tengo datos me los muestra, si quiero editar o eliminar registros del maestro o del detalle me deja hacerlo sin problemas, el problema aparece cuando creo un nuevo registro del detalle, al hacer un post en el detalle me genera el siguiente error

http://img521.imageshack.us/img521/2366/errorps7.jpg

http://www.clubdelphi.com/foros/cid:002401c91f11$0ef80490$4001a8c0@totote

Pero los datos son correctos, por lo que estuve observando, el problema es que en la relación Maestro/Detalle Delphi "piensa" que el campo ID del detalle es la Foreign Key en vez de el campo ID_TABLA1, por lo que estuve averiguando este problesa surge cuando el campo foreign key no tiene el mismo nombre que el id del maestro, ¿Hay alguna forma de cambiar la relación entre estos campos y especificar que el campo ID_TABLA1 es el foreign key y no el campo ID?


Saludos y espero que me puedan ayudar

Para los que quieran ver el Proyecto se encuentra acá (http://www.argenprog.com.ar/archivos/Maestro-Detalle.rar)

Kipow
26-09-2008, 20:02:40
En el evento OnNewRecord del dataset detalle debes de asignarle la llave foranea (la del maestro).

PD. Que buena explicacion.

totote
26-09-2008, 20:36:41
Kipow gracias por responder, ya intente eso pero no resulto, sigue generando el mismo error, cabe destacar, que en algunos casos si hago unas modificaciones en las propiedades de los componentes funciona, pero esto no siempre es asi, no se xq algunas veces funciona y porque otras no.
Las propiedades son

ClientDataSet2 (ClientDataSet detalle):
- IndexFieldNames: ID_TABLA1
- MasterFields: ID
SQLDataSet1 (SQLDataSet detalle):
- Al parametro le cambio el nombre de ID a ID_TABLA1

Como dije esto funciona rara vez, porque sino me genera el error que no hay valor para el parametro "ID_TABLA1"

Saludos

maeyanes
26-09-2008, 21:10:35
Hola...

De lo que te comenta Kipow, también debes tener en cuenta que primero debes grabar el registro maestro.

Todo esto debes tenerlo dentro de una transacción, así si ocurre un error puedes revertir los cambios sin problema alguno...



Saludos...

totote
26-09-2008, 21:19:13
Hola maeyanes, si hago un ApllyUpdates en el maestro se hace también en los detalles, debido al tipo de conexión que tiene, y si intento hacer un ApplyUpdates en cl ClientDataSet detalle me genera otro error también por el tipo de conexión, igualmente si el registro ya existe en el maestro y quiero agregarle registros detalles para este me genera el error mencionado que da origen al problema.

Saludos