sql >> Database >  >> RDS >> Mysql

Meerdere tabellen automatisch aanvullen met DBEdit

Ik hoop dat ik heb begrepen waar je om vraagt, gezien de structuren van de tabellen in je screenshot.

De onderstaande code laat zien hoe u een DBLookUPComboBox instelt om een ​​stad weer te geven die voor een bepaalde persoon in een personentabel moet worden geselecteerd. Ik heb TClientDataSets zo gebruikt dat het op zichzelf staat, zodat de hele instelling in code wordt gedaan in plaats van door eigenschapsinstellingen in de Object Inspector.

Uiteraard zijn de DBGrid en dbNavigator verbonden met de dsPerson databron.

Code

  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;

Merk op dat u in plaats van (of naast) een DBLookUpComboBox te gebruiken, ook een opzoekveld in de cdsPerson-dataset zou kunnen definiëren, door de onderstaande code toe te voegen vóór de aanroep van cdsPerson.CreateDataSet. Als u dat doet, heeft de cdsPerson een extra kolom Stadsnaam. Dit wordt weergegeven in de DBGrid - u moet mogelijk naar rechts scrollen om het te zien - en als u in een van de cellen CityName klikt, ziet u dat het een in-place vervolgkeuzelijst activeert waaruit een stad kan worden geselecteerd, zoals zo

Wanneer u een andere Stadsnaam selecteert, wordt de Stads-ID in het Persoonsrecord automatisch bijgewerkt.

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

Als ik je opmerking goed heb begrepen, probeer dan dit:

  • voeg een tweede DBGrid en DBNavigator en een DBEdit toe aan het formulier.

  • stel al hun databronnen in op dsCity en stel het DataField van DBEdit in op CityName.

U kunt dan een nieuwe stad aan de tabel Stad toevoegen en de Stads-ID (in het raster) en Stadsnaam (in het raster of DBEdit) specificeren. Merk op dat zodra u het opslaat met de tweede DBNavigator, u vervolgens in de cel Stadsnaam van het Persoonsraster kunt klikken en dat de nieuwe Stadsnaam in de vervolgkeuzelijst zal staan. Als u deze bewerking wilt uitvoeren op het huidige record van de Person-tabel, kunt u daaraan toevoegen door een AfterPost-gebeurtenishandler toe te voegen aan de City-tabel en er als volgt code aan toe te voegen:

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



  1. Haal het voorlaatste record voor elke gebruiker op uit de database

  2. Docker kan applicatie niet verbinden met MySQL

  3. Hoe voeg ik als parameter een datum in mysql in?

  4. MySQL-update van de ene tabel naar de andere waarbij de voorwaarde niet werkt?