PDA

Ver la Versión Completa : Dos comboBox combinados


ciudad54
10-02-2016, 06:16:21
Hola,

La situacion es la siguiente:
No se como tener dos combobox combinados para que al seleccionar un dato en el primero, solo me aparezcan los correspondientes en el segundo. Ejemplo

Combobox1 - Items:
1
2
3

al seleccionar el valor 1, en el combobox2 debe solamente aparecer :
1.1
1.2
1.3

Esto quiero hacerlo con una base de datos de médicos y especialidades, donde selecciono la especialidad y solo me aparecen los médicos de esa especialidad.

Gracias, espero puedan entender la idea.

AgustinOrtu
10-02-2016, 07:27:27
Busca informacion sobre maestro-detalle

Podes usar controles data-aware (los que empiezan con TDB...) o bien usar los "comunes" e implementar todo

ecfisa
10-02-2016, 07:32:23
Hola ciudad54.

Usando dos TComboBox podrías hacer:

// ComboBox1 = especialidad | ComboBox2 = medico

procedure TForm1.FormCreate(Sender: TObject);
begin
qyEspec.Close;
qyEspec.SQL.Text := 'SELECT ID, ESPEC FROM ESPECIALIDAD';
qyEspec.Open;
while not qyEspec.Eof do
begin
ComboBox1.AddItem(qyEspec.FieldByName('ESPEC').AsString,
TObject(qyEspec.FieldByName('ID').AsInteger));
qyEspec.Next;
end;
end;

procedure TForm1.ComboBox1Change(Sender: TObject);
var
cb: TComboBox;
begin
cb := TComboBox(Sender);
if cb.ItemIndex <> -1 then
begin
qyMedic.Close;
qyMedic.SQL.Text := 'SELECT NOMBRE FROM MEDICO WHERE ESPEC_ID = :ID';
qyMedic.ParamByName('ID').AsInteger := Integer(cb.Items.Objects[cb.ItemIndex]);
qyMedic.Open;
ComboBox2.Clear;
while not qyMedic.Eof do
begin
ComboBox2.Items.Add(qyMedic.FieldByName('NOMBRE').AsString);
qyMedic.Next;
end;
end;
end;


Pero resulta mucho mas simple usar dos TDBLoocupComboBox:

procedure TForm1.FormCreate(Sender: TObject);
begin
qyEspec.Close;
qyEspec.SQL.Text := 'SELECT ID, ESPEC FROM ESPECIALIDAD';
qyEspec.Open;

qyMedic.DataSource := dsEspec; // TDataSource asociado al dataset especialidad

DBLookupComboBox1.KeyField := 'ID';
DBLookupComboBox1.ListField := 'ESPEC';
DBLookupComboBox1.ListSource := dsEspec;

DBLookupComboBox2.KeyField := 'ID';
DBLookupComboBox2.ListField := 'NOMBRE';
DBLookupComboBox2.ListSource := dsMedic; // TDataSource asociado al dataset medico
end;

procedure TForm1.DBLookupComboBox1CloseUp(Sender: TObject);
begin
qyMedic.Close;
qyMedic.SQL.Text := 'SELECT ID, NOMBRE FROM MEDICO WHERE ESPEC_ID = :ID';
qyMedic.Open;
end;


Saludos :)

ciudad54
15-02-2016, 14:15:20
Excelente, me funciono perfecto!
Mil gracias!