sql >> Databasteknik >  >> RDS >> Mysql

Hur man autokompletterar flera tabeller med DBEdit

Jag hoppas att jag har förstått vad du frågar efter, med tanke på strukturerna för tabellerna som visas i din skärmdump.

Koden nedan visar hur man ställer in en DBLookUPComboBox för att visa en stad att välja för en given person i en persontabell. Jag har använt TClientDataSets så att det är fristående abd så att hela inställningen görs i kod snarare än med egenskapsinställningar i Object Inspector.

Uppenbarligen är DBGrid och dbNavigator anslutna till dsPerson-datakällan.

Kod

  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;

Observera att istället för (eller lika bra som) att använda en DBLookUpComboBox, kan du också definiera ett uppslagsfält i cdsPerson-datauppsättningen, genom att lägga till koden nedan före anropet till cdsPerson.CreateDataSet. Om du gör det kommer cdsPerson att ha en extra, Stadsnamn, kolumn. Detta kommer att visas i DBGrid - du kan behöva rulla det åt höger för att se det - och om du klickar i en av CityName-cellerna ser du att det aktiverar en på plats, rullgardinslista från vilken en stad kan väljas, som så

När du väljer ett annat Stadsnamn uppdateras Stads-ID i personposten automatiskt.

  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';

Om jag har förstått din kommentar rätt, prova detta:

  • lägg till en andra DBGrid och DBNavigator och en DBEdit till formuläret.

  • ställ in alla deras datakällor till dsCity och ställ in DBEdits datafält till CityName.

Du kan sedan lägga till en ny stad i tabellen Stad och ange dess Stads-ID (i rutnätet) och Stadsnamn (i rutnätet eller DBEdit). Lägg märke till att så fort du sparar det med den andra DBNavigatorn kan du klicka i cellen Stadsnamn i rutnätet Person och det nya Stadsnamnet kommer att finnas i rullgardinsmenyn. Om du vill göra detta, redigera den aktuella posten i persontabellen, kan du till det genom att lägga till en AfterPost-händelsehanterare i stadstabellen och lägga till kod till den så här:

procedure TForm1.cdsCityAfterPost(DataSet : TDataSet);
begin
  cdsPerson.Edit;
  try
    cdsPerson.FieldByName('CityId').AsInteger := DataSet.FieldByName('CityId').AsInteger;
  finally
    cdsPerson.Post;
  end;
end;



  1. Laravel-modell med POINT/POLYGON etc. med DB::råuttryck

  2. SQLiteException:Tabell finns redan

  3. MySQL-fråga - Sammanfoga data baserat på två faktorer och anpassa sedan hur data sorteras baserat på värden

  4. Spara felet i MySQL-databasen