【问题标题】:Binding a foreign key when adding a new value to the master-detail table Delphi向主从表 Delphi 添加新值时绑定外键
【发布时间】:2020-03-29 17:12:57
【问题描述】:

主从链接有 2 个表。向明细表添加新值时,不绑定从主表中选择的外键。

M-D 连接本身是在表单上执行的,分别使用两个 Dblookupcombobox 和 DataSource、ADOQuery。 enter image description here

使用 [ + ] 按钮,可以添加组合框中不存在的新值。但是问题从第二个 [ + ] (又名细节)开始,当创建一个新行时,您需要它来绑定上一个 LookUpComboBox(Master)的外键。第二个按钮的按钮代码[+]:

begin
Form4.ADOQuery1.SQL.Clear;
Form4.ADOQuery1.SQL.Add('Select City from City WHERE   City='+#39+Form5.DBEdit1.Text+#39); //checking for duplicates
Form4.ADOQuery1.Open;
if Form4.ADOQuery1.IsEmpty then
  begin
  Form4.Query_city.FieldByName('City').AsString := Form5.DBEdit1.Text; //The PROBLEM is  SOMEWHERE HERE! It Adds a new value without binding the foreign key
  Form4.Query_city.Open;
  Form4.Query_city.Post;
  MessageBox(Handle, 'New data entered','Adding a new value',MB_ICONINFORMATION);
  end
 else
  begin
  Form4.Query_spec.Cancel;
  Form4.ADOQuery1.Cancel;
  MessageBox(Handle,PChar(''+Form5.DBEdit1.text+' already on the list!'),'Error',MB_ICONWARNING);
  end;
 end;

新值被写入 DBEdit1。它与表有相应的绑定。 那么如何使用对应的外键插入字段呢?

【问题讨论】:

  • 恐怕您的if Form4.AdoQuery1... 块中的代码完全错误 - 在 Query_city 的 City 字段打开之前,您无法正确设置它,然后您可能需要进行插入。给自己找一个 Master-Detail 教程 - 应该解释正确的步骤和它们的顺序。

标签: sql database delphi delphi-7


【解决方案1】:

由于您的方式,您使这变得不必要地困难 代码是结构化的。试试这样的:

打开 ADOQuery1,选择其全部内容,例如

procedure TForm4.OpenCitiesTable;
begin
  ADOQuery1.SQL.Clear;
  ADOQuery1.SQL.Add('Select City from City');
  ADOQuery1.Open;
end;

并在用户执行任何导致想要添加新城市的操作时将其保持打开状态。

然后,当用户想要添加城市时,调用此过程,例如供应城市 来自 Form5.DBEdit1.Text 的值。

procedure TForm4.AddCity(ACity : String);
begin
  ACity := Trim(ACity);  // remove any leading or trailing blanks
  //  Do any formatting checks on ACity here, re.g convert it to Proper case

  //  check for adding a duplicate
  if ADOQuery1.Locate('City', ACity, []) then begin
    ShowMessageFmt('%s is already in the City table', [ACity]);
    Exit;
  end;

  try
    ADOQuery1.Insert;
    ADOQuery1.FieldByName('City').AsString := ACity;
  finally
    ADOQuery1.Post;
    //  at this point you might want to refresh the contents of whatever source
    //  you are populating Form5.DBEdit1.Text from
  end;
end;

我假设您可以自己调整与 TForm4.Query_spec 相关的代码;

顺便说一句,您可能需要考虑使用 TDBLookUpComboBox 而不是 DBEdit1。

【讨论】:

  • 感谢您的回答。我意识到我正在重新发明轮子,因为我最近才开始为 Delphi 工作。你能告诉我如何最好地使用“插入”吗?
  • 理论上,M-D 通信是有效的,因为我可以通过选择特定国家来滚动浏览特定城市的列表。这就是为什么我创建了一个单独的表单来添加新城市。尝试运行“Form4.Query_City.Insert;”时它在“城市”表中添加了一个新条目,甚至为其分配了一个新的主键,但不添加国家/地区的外键。理论上,我正在考虑做这样的事情: Insert into Cities (City,Country_id //foreign key) VALUES (from Form5.DBEdit1.Text, Form4.DBLookupcombobox_country);
  • 好吧,Insert 很简单 - 请参阅 docwiki.embarcadero.com/Libraries/Rio/en/… - 您只需调用它,设置所需的任何字段值,然后在数据集上调用 .Post。在对 Sql 查询结果执行 Insert 时,您需要确保新记录的字段值满足 WHERE 子句中的条件。顺便提一句。当您在另一个表中编辑或插入记录时,在一个表中输入一条新记录是一种不好的做法,无论它们是否是主详细信息。做一个,然后做另一个。
  • 谢谢。我使用了这样的东西: Form4.Query_City.FieldByName('City').AsString := Form5.DBEdit1.Text; Form4.Query_city.fieldbyname('Country_ID').AsInteger:= Form4.Query_Country.FieldByName('id_countrytable').asInteger;
猜你喜欢
  • 2022-08-22
  • 1970-01-01
  • 1970-01-01
  • 2013-11-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-12
  • 2019-01-11
相关资源
最近更新 更多