Delphi - Ayuda con maestro-detalle

 
Vista:

Ayuda con maestro-detalle

Publicado por frasko (25 intervenciones) el 16/09/2006 17:40:22
Hola a todos! Me gustaría que me ayudarais a poner una solución a mi problema. Para empezar, deciros que uso MySQL 4.1 con componentes ZEOS. Mi intención es establecer una relación maestro-detalle entre dos tablas. Tengo dos dbgrids que lleno con las siguientesconsultas:
select * from facultades y select * from estudios.
También tengo relacionado con ellos dos dblookupcombobox. Lo que tengo que hacer es que si quiero añadir un estudio en el dbgrid, solo me deje escoger claves de facultades que ya existan. O sea, que aparezca un combobox con por ejemplo: f000, f001, f002, tengo que controlar la integridad referencial. Me han dicho que con otros componentes eso sale automático al establecer la relacion maestro-detalle entre las dos tablas pero a mi no me sale. Se os ocurriría alguna solucion??

Muchisimas gracias de antemano!

Un saludo,
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:Ayuda con maestro-detalle

Publicado por BigLuis (713 intervenciones) el 16/09/2006 18:04:27
Aqui hay varios temas. Si utilizas el tipo de tablas MyISAM, la integridad referencial la tienes que controlar tu ya que este tipo de tabla no la soporta asi como tampoco transacciones. Para tu tranquilidad te digo que yo las utilizo muchisimo y sin problemas (luego te dire como). Si quieres un tipo de tablas de MySQL que soporta ambas caracteristicas usa el tipo InnoDB. Con InnoDB no te dejara grabar un registro en la tabla relacionada en el que no hayas puesto un valor en la foreingkey que no exista en la tabla principal. Te aconsejo que busques bibliografia en la red pues es un tema muy amplio, complicado y bonito.
Bien si utilizas tablas MyISAM tienes que crear un campo comun en la tabla principal y en la "esclava". En la principal puede ser autonumerico Id_facultades y en estudios Ref_facultades. En el evento beforepost de la tabla estudios escribes TablaEstudios.Fieldbyname('ref_facultades').asinteger:=TablaFacultades.ieldbyname('Id_facultades').asinteger. Y "voila" solucionado.
Para abrir las tablas seria
select * from facultades
y select * from estudios where ref_facultades=:Id_facultades.
En el diseño a la tabla estudios en la propiedad Datasource pones DataFacultades (si se llama asi el TDatasource asociado a la tabla facultades) y de esta forma al abrir y moverte pr la tabla facultades en la regilla de los estudios solo veras los registros asociados a cada facultad.
Suerte
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Ayuda con maestro-detalle

Publicado por frasko (25 intervenciones) el 16/09/2006 18:40:17
A ver, para empezar uso tablas InnoDB. Te cuento. Tengo 3 dbgrid que muestra el contenido de 3 tablas diferentes. Las dos primeras tienen un dblookupcombobox asociado. Lo he solucionado en plan chapuzero. Al escoger un campo del primer dbgrid me recorta el segundo dbgrid, funcionando como una relacion maestro-detalle, aunque no exista. Ante el evento oncloseup del dblookupcombobox cambio la consulta. Al final todo funciona como si fuera maestro-detalle. Pero lo que quiero es que si yo en la seunda tabla deseo insertar un registro me salga en la columna que corresponda a la clave externa, un desplegable que solo incluya las claves existentes de la primera tabla. A la hora de insertar lo he hecho como tu me has dicho :

TablaEstudios.Fieldbyname('ref_facultades').asinteger:=TablaFacultades.ieldbyname('Id_facultades').asinteger

Y otra cosa, si lo hago funcionar con una relacion maestro-detalle, luego los lookupcombobox no me funcionan si los dejo igual. Me da error. No se si me explicare,
muchas gracias por todo!!

Un saludo,
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar