Mysql 如何使用DBEdit自动完成多个表

Mysql 如何使用DBEdit自动完成多个表,mysql,database,ms-access,delphi,Mysql,Database,Ms Access,Delphi,我有两张桌子(实际上是三张)。一个表使用下拉列表从另外两个表的字段收集数据。使用“DBEdit”将数据添加到其他两个表中。问题是,现在我必须输入相同的数据两次:第一次在“DBEdit”中输入,第二次在“DBLOOKUPCOMBOBOX”中输入。如何将记录添加到DBEdit,以便它将数据写入两个表,而不仅仅是DB_ALL 考虑到公司的结构,我希望我已经理解了您的要求 屏幕截图中显示的表格 下面的代码显示了如何设置DBLookUPComboBox以显示要访问的城市 在人员表中为给定人员选择。我使用了

我有两张桌子(实际上是三张)。一个表使用下拉列表从另外两个表的字段收集数据。使用“DBEdit”将数据添加到其他两个表中。问题是,现在我必须输入相同的数据两次:第一次在“DBEdit”中输入,第二次在“DBLOOKUPCOMBOBOX”中输入。如何将记录添加到DBEdit,以便它将数据写入两个表,而不仅仅是DB_ALL


考虑到公司的结构,我希望我已经理解了您的要求 屏幕截图中显示的表格

下面的代码显示了如何设置DBLookUPComboBox以显示要访问的城市 在人员表中为给定人员选择。我使用了TclientDataSet,因此 它是自包含的abd,因此整个设置都是在代码中完成的,而不是 而不是对象检查器中的特性设置

显然,DBGrid和dbNavigator连接到dsPerson数据源

代码

请注意,您也可以通过在调用cdsPerson.CreateDataSet之前添加以下代码,在cdsPerson数据集中定义查找字段,而不是(或者)使用DBLookUpComboBox。如果您这样做,cdsPerson将有一个额外的CityName列。这将显示在DBGrid中—您可能需要向右滚动才能看到它—如果您单击其中一个CityName单元格,您将看到它激活了一个就地下拉列表,从中可以选择一个城市,如下所示

选择其他城市名称时,人员记录中的城市ID将自动更新

  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

然后,可以将新城市添加到城市表中,并指定其CityID(在网格中)和CityName(在网格或DBEdit中)。请注意,使用第二个DBNavigator保存后,您可以单击Person网格的CityName单元格,新的CityName将出现在下拉列表中。如果要对Person表的当前记录进行此编辑,可以通过在City表上添加AfterPost事件处理程序来进行编辑,并向其添加如下代码:

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

谢谢你的回答和密码。但是我需要DBEdit的说明,首先将数据添加到“City”表中,然后保存数据,然后将自动选择的新城市添加到“ALL”表中。理论上,类似这样的代码:
如果Form1.Query\u city.Modified,那么Form1.Query\u All.FieldByName('city')。AsInteger:=Form1.Query\u city.Field(city\u ID)procedure TForm1.cdsCityAfterPost(DataSet : TDataSet);
begin
  cdsPerson.Edit;
  try
    cdsPerson.FieldByName('CityId').AsInteger := DataSet.FieldByName('CityId').AsInteger;
  finally
    cdsPerson.Post;
  end;
end;