Espero haber entendido lo que está pidiendo, dadas las estructuras de las tablas que se muestran en su captura de pantalla.
El siguiente código muestra cómo configurar un DBLookUPComboBox para mostrar una ciudad para seleccionar para una persona determinada en una tabla de personas. He usado TClientDataSets para que sea autónomo y para que toda la configuración se realice en código en lugar de mediante la configuración de propiedades en el Inspector de objetos.
Obviamente, DBGrid y dbNavigator están conectados a la fuente de datos dsPerson.
Código
TForm1 = class(TForm)
cdsCity: TClientDataSet;
cdsPerson: TClientDataSet;
dsPerson: TDataSource;
DBGrid1: TDBGrid;
DBLookupComboBox1: TDBLookupComboBox;
dsCity: TDataSource;
DBNavigator1: TDBNavigator;
procedure FormCreate(Sender: TObject);
end;
[...]
procedure TForm1.FormCreate(Sender: TObject);
var
Field : TField;
begin
Field := TIntegerField.Create(Self);
Field.FieldName := 'CityId';
Field.DataSet := cdsCity;
Field := TStringField.Create(Self);
Field.FieldName := 'City';
Field.Size := 40;
Field.DataSet := cdsCity;
cdsCity.CreateDataSet;
cdsCity.InsertRecord([3, 'Moscow']);
cdsCity.InsertRecord([4, 'Leningrad']);
Field := TIntegerField.Create(Self);
Field.FieldName := 'PersonId';
Field.DataSet := cdsPerson;
Field := TIntegerField.Create(Self);
Field.FieldName := 'CityID';
Field.DataSet := cdsPerson;
Field := TStringField.Create(Self);
Field.FieldName := 'Name';
Field.Size := 40;
Field.DataSet := cdsPerson;
cdsPerson.CreateDataSet;
cdsPerson.InsertRecord([1, 4, 'Ivan']);
cdsPerson.InsertRecord([2, 3, 'Kate']);
DBLookupComboBox1.DataField := 'CityID';
DBLookupComboBox1.DataSource := dsPerson;
DBLookupComboBox1.KeyField := 'CityID';
DBLookupComboBox1.ListField := 'City';
DBLookupComboBox1.ListSource := dsCity;
end;
Tenga en cuenta que en lugar de (o además de) usar un DBLookUpComboBox, también podría definir un campo de búsqueda en el conjunto de datos cdsPerson, agregando el código a continuación antes de la llamada a cdsPerson.CreateDataSet. Si lo hace, cdsPerson tendrá una columna adicional, CityName. Esto se mostrará en el DBGrid; es posible que deba desplazarse hacia la derecha para verlo, y si hace clic en una de las celdas de CityName, verá que activa una lista desplegable en el lugar desde la cual una ciudad puede ser seleccionado, así
Cuando selecciona un nombre de ciudad diferente, el ID de ciudad en el registro de persona se actualiza automáticamente.
Field := TStringField.Create(Self);
Field.FieldName := 'CityName';
Field.Size := 40;
Field.DataSet := cdsPerson;
Field.FieldKind := fklookUp;
Field.LookUpDataSet := cdsCity;
Field.LookUpKeyFields := 'CityID';
Field.LookupResultField := 'CityName';
Field.KeyFields := 'CityID';
Si he entendido bien tu comentario, prueba esto:
-
agregue un segundo DBGrid y DBNavigator y un DBEdit al formulario.
-
configure todas sus fuentes de datos en dsCity y configure el DataField de DBEdit en CityName.
A continuación, puede agregar una nueva ciudad a la tabla Ciudad y especificar su CityID (en la cuadrícula) y CityName (en la cuadrícula o DBEdit). Tenga en cuenta que tan pronto como lo guarde con el segundo DBNavigator, puede hacer clic en la celda CityName de la cuadrícula Person y el nuevo CityName estará en la lista desplegable. Si quisiera hacer esta edición en el registro actual de la tabla Person, podría agregar un controlador de eventos AfterPost en la tabla City y agregarle un código como este:
procedure TForm1.cdsCityAfterPost(DataSet : TDataSet);
begin
cdsPerson.Edit;
try
cdsPerson.FieldByName('CityId').AsInteger := DataSet.FieldByName('CityId').AsInteger;
finally
cdsPerson.Post;
end;
end;