有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。它具有对表的相应绑定。那么,我该如何插入具有相应外键的字段?
由于您的方式,您使不必要的困难变得困难代码是结构化的。尝试这样的事情:
[打开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。