sql >> Databáze >  >> RDS >> Mysql

Jak automaticky doplnit několik tabulek pomocí DBEdit

Doufám, že jsem pochopil, co požadujete, vzhledem ke strukturám tabulek zobrazených na vašem snímku obrazovky.

Níže uvedený kód ukazuje, jak nastavit DBLookUPComboBox k zobrazení města, které chcete vybrat pro danou osobu v tabulce osob. Použil jsem TClientDataSets tak, že je soběstačný a takže celé nastavení se provádí v kódu, nikoli pomocí nastavení vlastností v Inspektoru objektů.

Je zřejmé, že DBGrid a dbNavigator jsou připojeny ke zdroji dat dsPerson.

Kód

  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;

Všimněte si, že místo (nebo stejně jako) použití DBLookUpComboBox můžete také definovat vyhledávací pole v datové sadě cdsPerson přidáním kódu níže před voláním cdsPerson.CreateDataSet. Pokud tak učiníte, cdsPerson bude mít navíc sloupec CityName. To se zobrazí v DBGrid – možná budete muset posouvat doprava, abyste to viděli – a pokud kliknete do jedné z buněk CityName, uvidíte, že se aktivuje místní rozevírací seznam, ze kterého může město být vybrán, podobně

Když vyberete jiný název města, ID města v záznamu osoby se automaticky aktualizuje.

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

Pokud jsem správně pochopil váš komentář, zkuste toto:

  • přidejte do formuláře druhý DBGrid a DBNavigator a DBEdit.

  • nastavte všechny jejich datové zdroje na dsCity a nastavte DataField DBEdit na CityName.

Poté můžete přidat nové Město do tabulky Město a zadat jeho CityID (v mřížce) a CityName (v mřížce nebo DBEdit). Všimněte si, že jakmile jej uložíte pomocí druhého DBNavigatoru, můžete kliknout do buňky CityName v mřížce Person a nové CityName bude v rozevíracím seznamu. Pokud jste chtěli provést tuto úpravu aktuálního záznamu z tabulky Osoba, můžete to provést přidáním obsluhy události AfterPost do tabulky Město a přidat do ní kód takto:

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



  1. Vybrat duplikáty z jednoho řádku?

  2. MySQL - Jak odstranit z tabulky, když vnořený výběr používá tuto tabulku?

  3. Jednoduchý CRUD tutoriál o Play Framework a MySQL pomocí Ebean?

  4. Vysvětlení QUOTED_IDENTIFIER