Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Conexión con bases de datos (https://www.clubdelphi.com/foros/forumdisplay.php?f=2)
-   -   Lookup al pulsar sobre una columna en TDBGrid (https://www.clubdelphi.com/foros/showthread.php?t=60933)

noob 20-10-2008 01:25:00

Lookup al pulsar sobre una columna en TDBGrid
 
Hola, tengo una aplicación con varias tablas que las muestro en un componente TDBGrid.

Os pongo un ejemplo de tres tablas para que veáis que es lo que quiero hacer.

Tengo una tabla que se llama Alumno con los campos Identificador y Nombre, otra tabla llamada Profesor con los campos Codigo y Asignatura y luego tengo una clase Aula con los campos Numero, Alumno, Profesor, Capacidad.

Tenemos estos datos:

Código:

Alumno:

+-+-------+
|1|Pedro  |
|2|Victor |
|3|Marcos |
+-+-------+

Profesor:

+-+-----------+
|1|J. Antonio |
|2|Carlos    |
|3|Eva        |
+-+-----------+

y la tabla Aula la relleno sólo con alumnos y profesores existentes:

+-+-+-+--+
|1|1|3|30|
|2|2|3|21|     
+-+-+-+--+

Lo que yo quiero es no tener que escribir los datos referentes a los campos Alumno y Profesor de la tabla Aula sino que al pulsar sobre esos campos me salga automáticamente la tabla correspondiente para que yo coja ese registro y me traiga el código para insertarlo en esa columna, creo que esto se llama Lookup.

¿Es esto posible? Muchas gracias.

Palmiro 20-10-2008 03:25:28

hola...

revisa este link, a ver si te sirve...

noob 20-10-2008 14:12:41

No lo consigo :confused:, ¿me podéis echar un cable con un código de ejemplo?

He hecho esto:

Código Delphi [-]
(DBGrid1.Columns[1] as TColumn).Field.FieldKind := fklookup;
(DBGrid1.Columns[1] as TColumn).Field.KeyFields := 'Codigo';
(DBGrid1.Columns[1] as TColumn).Field.DataSet := AlumnoDataset;
(DBGrid1.Columns[1] as TColumn).Field.LookupKeyFields := 'Alumno';
(DBGrid1.Columns[1] as TColumn).Field.LookupResultField := 'Alumno';
¿Voy bien?

Donde el dataset del datasource de DBGrid1 esta tirando de la tabla aula.

Muchas gracias.

EDITO: He hecho esto:

Código Delphi [-]
procedure TForm1.Button1Click(Sender: TObject);
var
  ListaAlumnos: TStringList;
  i: integer;
begin
  ListaAlumnos := TStringList.Create;
  try
    AlumnosDataset.Active := true;
    AlumnosDataset.First;
    AlumnosDataset.DisableControls;
    while not AlumnosDataset.EOF do
      begin
        ListaAlumnos.Add(AlumnosDataset.FieldByName('Identificador').AsString);
        AlumnosDataset.Next;
      end;
  finally
    AlumnosDataset.Active := false;
    for i := 0 to DBGrid1.Columns.Count - 1 do
      begin
        if AlumnosDataset.FieldName = 'Alumno' then
          begin
            DBGrid1.Columns[i].PickList := ListaAlumnos;
            Break;
          end;
      end; 
    AlumnosDataset.EnableControls;
    ListaAlumnos.Free;
  end;

Así me sale un desplegable al pulsar en la columna Alumno de la tabla Aula en vez de abrírseme la tabla Alumno con todos los registros. ¿Sabéis cómo hacerlo del otro modo?

Palmiro 21-10-2008 02:41:59

man la verdad que no entiendo muy bien lo que haces...
seguiste al pie de la letra lo que dice el link?
yo lo segui tal cual esta y sale perfecto aunque nunca llegue a utilizarlo...

Mañana te paso algun ejemplo de codigo... ahora no tengo el delphi a mano y ademas tengo un poco de sueño...

noob 21-10-2008 03:09:04

Vale, gracias por preocuparte, espero tu ejemplo de código.

Saludos.

Palmiro 21-10-2008 19:51:51

primero que nada agrega a tu form un componente DBLookupComboBox

en el ListSource---> aqui enlasa el query que queres que se vea al desplegarlo...
en DataSource---> aqui enlasa el query en cual vas a referenciar con el ListSource....
para este ejemplo tengamos en cuenta que estas por decir de que provincia o estado es una persona.....
ListSource-----qryProvincia
DataSource----qryPersona

En listField: pone pcia.nombre;nombre.pais
KeyField: pone id_pcia
DataField : pone el nombre de la clave provincia en la tabla persona, por ej. pna.id_pcia

Visible:= False;

Luego tenes que copiar este codigo en el evente DBGrid1DrawColumnCell
de la grilla
Código Delphi [-]
procedure TForm1.DBGrid1DrawColumnCell  (Sender: TObject;    const Rect: TRect;    DataCol: Integer;    Column: TColumn;    State: TGridDrawState);begin  if (gdFocused in State) then  begin    if (Column.Field.FieldName =  'provincia') then    with DBLookupComboBox1 do     begin      Left := Rect.Left + DBGrid1.Left + 2;      Top := Rect.Top + DBGrid1.Top + 2;      Width := Rect.Right - Rect.Left;      Width := Rect.Right - Rect.Left;      Height := Rect.Bottom - Rect.Top;      Visible := True;    end;  endend;
Código Delphi [-]
procedure TForm1.DBGrid1ColExit(Sender: TObject); begin if DBGrid1.SelectedField.FieldName = 'provincia' then DBLookupComboBox1.Visible := False end;
proba con eso..... espero haberme expresado bien... es muy probable que tengas que hacer unos cambios.... pero la idea es esa.Lo hice a ojo sin probarlo... no te sale.... hago un código de ejemplode verdad y te lo adjunto....Contanos despues como te fue, asi le sirve de ayuda el ejemplo otro que se encuentre con el mismo problema....

noob 21-10-2008 20:19:10

Gracias, me sirvió.

Saludos.


La franja horaria es GMT +2. Ahora son las 13:13:17.

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