Club Delphi  
    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

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 20-05-2004
marial marial is offline
Miembro
 
Registrado: may 2004
Posts: 26
Poder: 0
marial Va por buen camino
Con qué componente asocio un DBGrid?

Hola a todos!
Me gustaria saber si me pueden informar qué componente debo asociar a un DBGrid para poder visualizar las columnas del DBGrid sin que se me repitan los valores y poder hacer búsquedas en el DBGrid al seleccionar un valor en el otro componente.

El DBGrid muestra las columnas de una sola tabla en SQL Server.

Gracias por la ayuda.
Responder Con Cita
  #2  
Antiguo 20-05-2004
__cadetill __cadetill is offline
Miembro
 
Registrado: may 2003
Posts: 3.387
Poder: 25
__cadetill Va por buen camino
Cita:
Empezado por marial
Hola a todos!
Hola marial

Cita:
Empezado por marial
... sin que se me repitan los valores...
El DBGrid mostrará lo que contenga el Dataset (TTable, TQuery, TCientDataSet,.....) asociado. Si no quieres duplicados, has de modificar, por ejemplo, la consulta SQL que lanzas

Cita:
Empezado por marial
... poder hacer búsquedas en el DBGrid al seleccionar un valor en el otro componente.
las búsquedas no se hacen sobre el DBGrid, sino sobre el Dataset asociado
Esto es un error muy común (sobre todo en los principiantes). El DBGrid es un mero visualizador de los datos que contiene un Dataset, pero sobre él (el DBGrid) no podemos hacer ninguna acción directa sobre los datos, hemos de recurrir al Dataset
Responder Con Cita
  #3  
Antiguo 21-05-2004
marial marial is offline
Miembro
 
Registrado: may 2004
Posts: 26
Poder: 0
marial Va por buen camino
Unhappy DBGrid + .....?

Hola Cadetill.

Lo primero darte las gracias por responderme, y lo segundo es que quiero proponerte otra duda a ver si me puedes ayudar:

Estoy bastante confundida, pues he preguntado varias veces en el foro y sigo sin saber como solucionar mi problema. He probado todo lo que me habéis dicho y no me sale el resultado que yo deseo. Yo supongo que lo que quiero hacer es lo más básico del mundo, pero soy nueva en esto. He leido varios libros y sigo sin poder solucionar esto.

Lo que quiero hacer es una aplicacion, en la que pueda visualizar una tabla completa y poder hacer búsquedas a través de varios componentes desplegables. Con la opción de MasterSource no funciona (puesto que son varias las tablas Maestras), y con los "inner join" tampoco me ha funcionado. Ya no sé qué probar más, pues llevo 2 semanas con esto y no lo consigo.

Si me pudieras ayudar, te lo agradecería un montón. La base de datos es en SQL Server. El sistema operativo Windows XP. Delphi 7.

Muchas gracias.
Responder Con Cita
  #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
  #5  
Antiguo 22-05-2004
marial marial is offline
Miembro
 
Registrado: may 2004
Posts: 26
Poder: 0
marial Va por buen camino
Gracias por la ayuda.

Hola Roman.

Gracias por tu respuesta. Has entendido exactamente cual era mi problema. Y digo "era" porque ya lo he solucionado sola. Me he pasado 2 semanas preguntando en el foro y al parecer nadie me entendio. Tan mal me explique?

Solo espero que la proxima vez que tenga que consultar algo, lo haga de la manera correcta y que la gente me entienda. Ha sido fustrante que nadie, pero nadie me haya entendido.

De todas formas agradezco muchisimo que la gente me contestara, pues exponen sus conocimientos de manera gratuita, y eso para mi no tiene precio.

Asi que, gracias de nuevo, y lo que hare la proxima vez es mirar la guia de estilos e intentar seguirla al pie de la letra.

Nos vemos.
Responder Con Cita
Respuesta



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 00:49:03.


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