向主从表Delphi添加新值时绑定外键

问题描述 投票:0回答:1

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

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

使用[+]按钮,添加了组合框中不存在的新值。但是问题始于第二个[+](又称详细信息),当创建新行时,您需要它来绑定前一个LookUpComboBox(主)的外键。第二个按钮的按钮代码[+]:

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。它具有对表的相应绑定。那么,我该如何插入具有相应外键的字段?

sql database delphi delphi-7
1个回答
0
投票

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

[打开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。

© www.soinside.com 2019 - 2024. All rights reserved.