Club Delphi  
    Paypal   FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Conexión con bases de datos
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Conexión con bases de datos

 
 
Herramientas Buscar en Tema Desplegado
  #4  
Antiguo 21-05-2004
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
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
Responder Con Cita
 



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro


La franja horaria es GMT +2. Ahora son las 12:45:34.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi