Spero di aver capito cosa chiedi, viste le strutture delle tabelle mostrate nel tuo screenshot.
Il codice seguente mostra come impostare un DBLookUPComboBox per visualizzare una città da selezionare per una determinata persona in una tabella persona. Ho usato TClientDataSets in modo che sia autonomo e in modo che l'intera configurazione venga eseguita nel codice anziché dalle impostazioni delle proprietà in Object Inspector.
Ovviamente, DBGrid e dbNavigator sono collegati all'origine dati dsPerson.
Codice
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;
Si noti che invece di (o oltre) utilizzare un DBLookUpComboBox, è anche possibile definire un campo di ricerca nel set di dati cdsPerson, aggiungendo il codice seguente prima della chiamata a cdsPerson.CreateDataSet. Se lo fai, cdsPerson avrà una colonna extra, CityName. Questo verrà visualizzato nel DBGrid - potrebbe essere necessario scorrerlo verso destra per vederlo - e se fai clic su una delle celle CityName, vedrai che attiva un elenco a discesa sul posto da cui una città può essere selezionato, così
Quando selezioni un nome di città diverso, il CityID nel record Persona viene aggiornato automaticamente.
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';
Se ho capito bene il tuo commento, prova questo:
-
aggiungi un secondo DBGrid e DBNavigator e un DBEdit al form.
-
imposta tutte le origini dati su dsCity e imposta DataField di DBEdit su CityName.
È quindi possibile aggiungere una nuova città alla tabella Città e specificarne CityID (nella griglia) e CityName (nella griglia o DBEdit). Nota che non appena lo salvi utilizzando il secondo DBNavigator, puoi quindi fare clic nella cella CityName della griglia Persona e il nuovo CityName sarà nell'elenco a discesa. Se desideri apportare questa modifica al record corrente della tabella Person, puoi farlo aggiungendo un gestore di eventi AfterPost sulla tabella City e aggiungendo il codice in questo modo:
procedure TForm1.cdsCityAfterPost(DataSet : TDataSet);
begin
cdsPerson.Edit;
try
cdsPerson.FieldByName('CityId').AsInteger := DataSet.FieldByName('CityId').AsInteger;
finally
cdsPerson.Post;
end;
end;