![]() |
![]() |
| Paypal | FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
|||||||
| Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Buscar | Temas de Hoy | Marcar Foros Como Leídos |
|
|
Herramientas | Buscar en Tema | Desplegado |
|
#4
|
||||
|
||||
|
Cita:
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:
---------------------- 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:
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:
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 |
| Herramientas | Buscar en Tema |
| Desplegado | |
|
|
|