Cita:
|
Empezado por marial
Estoy bastante confundida, pues he preguntado varias veces en el foro y sigo sin saber como solucionar mi problema
|
Realmente debiste continuar entonces en aquellos hilos pero veo que en efecto estás muy confundida y como aquellos hilos están ya muy llenos voy a contestarte aquí.
Creo que desde el principio no has expuesto de forma clara el problema así que lo haré yo por tí y ya me dirás si le atiné o no.
En lugar de las nueve tablas que tienes vamos a simplificar a las tres que mencionas explícitamente y la principal:
provincias = (id,
otros campos)
empresas = (id,
otros campos)
departamentos = (id,
otros campos)
principal = (id, provincia_id, empresa_id, departamento_id,
otros campos)
Lo que tú quieres es que provincias, empresas y departamentos sean maestras de principal, es decir:
Cita:
|
Para cada selección de provincia, empresa y departamento deseas mostrar los registros de principal que correspondan a dicha selección.
|
El problema, como ya has visto, es que en Delphi sólo puedes tener un "MasterSource".
----------------------
Una posible solución sería esta:
Coloca las componentes adecuadas como sigue:
grdPrincipal -> dsPrincipal -> DataSetPrincipal -> tabla principal
cboProvincias -> dsProvincias -> DataSetProvincias -> tabla provincias
cboEmpresas -> dsEmpresas -> DataSetEmpresas -> tabla empresas
cboDeptos -> dsDeptos -> DataSetDeptos -> tabla departamentos
donde grdPrincipal es el DBGrid para mostrar los datos de la tabla principal, cboXXX son DBLookupComboBox, dsXXX son DataSource, DataSetXXX son las componentes DataSet que uses para conectarte a las tablas físicas (TTable, TAdoTable, etc). Los combos se enlazan a los datasource mediante la propiedad ListSource.
En lugar de usar MasterSource para DataSetPrincipal, usas su propiedad Filter poniendo Filtered := true.
Asocias a todos los combo un evento OnClick común y ahí estableces el filtro según la selección actual:
Código Delphi
[-]
DataSetPrincipal.Filter :=
'provincia_id = ' + cboProvincias.KeyValue + ' and ' +
'empresa_id = ' + cboEmpresas.KeyValue + ' and ' +
'departamento_id = ' + cboDeptos.KeyValue
En lugar de OnClick, también podrías usar el evento OnAfterScroll asociando uno común a todos los DataSet (excepto, claro, el principal) y poniendo el mismo código.
----------------------
Otra solución que podría no ser la más adecuada ya que tienes ocho tablas maestras y no sé cuántos registros en cada una pero que me ha funcionado bien para tablas "pequeñas", es la de juntar todos los maestros en uno, esto es, crear una tabla que registre
todas las combinaciones posibles de las llaves principales de los candidatos a maestro:
gran_maestro = (provincia_id, empresa_id, departamento_id)
Si, por decir algo, las tablas provincias, empresas y departamentos tienen 20, 15 y 30 registros respectivamente, estaríamos hablando de una tabla con 20*15*30=9000 registros.
Supongo que gran_maestro podría ser una vista en lugar de una tabla.
A las mismas componentes de la solución anterior agregarías:
dsGranMaestro -> DataSetGranMaestro -> tabla gran_maestro
y asignarías
DataSetPrincipal.MasterSource -> dsGranMaestro
enlazando los MasterField:
gran_maestro.provincia_id -> principal.provincia_id
gran_maestro.empresa_id -> principal.empresa_id
gran_maestro.departamento_id -> principal.departamento_id
Ahora, igualmente con un evento OnClick común a los combos (u OnAfterScroll común a los DataSet), en lugar del filtro usarías Locate para colocar gran_maestro en el registro adecuado:
Código Delphi
[-]
DataSetGranMaestro.Locate(
'provincia_id;empresa_id;departamento_id',
VarArrayOf([
cboProvincia.KeyValue,
cboEmpresa.KeyValue,
cboDepto.KeyValue
])
);
El registro debe existir ya que gran_maestro tiene todas las combinaciones posibles y, siendo maestro de la tabla principal automáticamente se filtrarán los registros adecuados.
---------------------------
Bueno, si no le he atinado o está muy descabellado esto ya veremos de pensar otra solución.
// Saludos