Как автозаполнить несколько таблиц с DBEdit - PullRequest
1 голос
/ 07 апреля 2020

У меня есть две таблицы (на самом деле 3). одна таблица собирает данные из полей двух других таблиц, используя раскрывающийся список. Данные добавляются в две другие таблицы с помощью «DBEdit». Проблема в том, что теперь мне нужно дважды вводить одни и те же данные: первый раз в «DBEdit», второй раз в «DBLOOKUPCOMBOBOX». Как добавить запись в DBEdit, чтобы она записывала данные в обе таблицы, а не только в DB_ALL

, введите описание изображения здесь

1 Ответ

2 голосов
/ 07 апреля 2020

Надеюсь, я понял, о чем вы просите, учитывая структуры таблиц, показанных на вашем скриншоте.

Приведенный ниже код показывает, как настроить DBLookUPComboBox для отображения города, выбранного для данного региона. человек в личном столе. Я использовал TClientDataSets так, чтобы он был автономным abd, чтобы вся настройка выполнялась в коде, а не с помощью настроек свойств в Инспекторе объектов.

Очевидно, что DBGrid и dbNavigator подключены к dsPerson источник данных.

Код

  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;

Обратите внимание, что вместо (или также) с использованием DBLookUpComboBox вы также можете определить поле поиска в наборе данных cdsPerson, добавив приведенный ниже код перед вызов cdsPerson.CreateDataSet. Если вы это сделаете, у cdsPerson будет дополнительный столбец CityName. Это отобразится в DBGrid - вам может понадобиться прокрутить его вправо, чтобы увидеть его - и если вы щелкнете по одной из ячеек CityName, вы увидите, что он активирует раскрывающийся список на месте, из которого город может быть выбранным, например,

Screenshot of grid with in-place CityName selector

Когда вы выбираете другое название города, CityID в записи Person автоматически обновляется.

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

Если я правильно понял ваш комментарий, попробуйте следующее:

  • добавьте в форму второй DBGrid и DBNavigator и DBEdit.

  • установите для всех их источников данных значение dsCity и для поля данных DBEdit значение CityName.

Затем можно добавить новый город в таблицу City и указать его CityID (в сетке) и CityName ( в сетке или DBEdit). Обратите внимание, что как только вы сохраните его с помощью второго DBNavigator, вы можете щелкнуть ячейку CityName сетки Person, и новое CityName появится в раскрывающемся списке. Если вы хотите сделать это изменение для текущей записи таблицы Person, вы можете сделать это, добавив обработчик события AfterPost в таблицу City и добавив в него код, подобный этому:

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