sql >> Database teknologi >  >> RDS >> Mysql

Sådan autofuldføres flere tabeller med DBEdit

Jeg håber, jeg har forstået, hvad du beder om, givet strukturerne af tabellerne vist på dit skærmbillede.

Koden nedenfor viser, hvordan man opsætter en DBLookUPComboBox til at vise en by, der skal vælges for en given person i en persontabel. Jeg har brugt TClientDataSets, så det er selvstændigt abd, så hele opsætningen udføres i kode i stedet for egenskabsindstillinger i Object Inspector.

Det er klart, at DBGrid og dbNavigator er forbundet til dsPerson-datakilden.

Kode

  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;
 

Bemærk, at i stedet for (eller såvel som) at bruge en DBLookUpComboBox, kan du også definere et opslagsfelt i cdsPerson-datasættet ved at tilføje koden nedenfor før opkaldet til cdsPerson.CreateDataSet. Hvis du gør det, vil cdsPerson have en ekstra, Bynavn, kolonne. Dette vil blive vist i DBGrid - du skal muligvis rulle det til højre for at se det - og hvis du klikker i en af ​​CityName-cellerne, vil du se, at det aktiverer en på stedet, rullemenu, hvorfra en by kan blive valgt, sådan

Når du vælger et andet bynavn, opdateres by-id'et i personposten automatisk.

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

Hvis jeg har forstået din kommentar korrekt, så prøv dette:

  • tilføje en anden DBGrid og DBNavigator og en DBEdit til formularen.

  • sæt alle deres datakilder til dsCity og indstil DBEdit's DataField til Bynavn.

Du kan derefter tilføje en ny by til tabellen By og angive dens CityID (i gitteret) og CityName (i gitteret eller DBEdit). Bemærk, at så snart du gemmer det ved hjælp af den anden DBNavigator, kan du klikke i Bynavn-cellen i Person-gitteret, og det nye Bynavn vil være i rullelisten. Hvis du ønsker at gøre dette, skal du redigere den aktuelle post i Person-tabellen, kan du til det ved at tilføje en AfterPost-hændelseshandler på By-tabellen og tilføje kode til den på denne måde:

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


  1. Brug af XAMPP og Mysql Workbench sammen

  2. hvordan man søger efter nøjagtig streng i mysql

  3. PostgreSQL:Rediger EJER på alle tabeller samtidigt i PostgreSQL

  4. Denne SELECT-forespørgsel tager 180 sekunder at afslutte