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)
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)