2015-11-05 61 views
1

我有一个弹出窗体,它使用MS Access数据库中主窗体上的按钮打开。弹出窗体创建一个新的记录(在单独的表格中),需要链接到主窗体中的当前记录。我该如何正确设置它?弹出窗体创建记录,将1:1链接到主窗体

两种形式(frmMain,frmWB)基于2个独立的表(tblMain和tblWB)。记录具有1:1的关系(每个主记录只能有一个WB1记录)。

主要形式(frmMain)具有主键[ID]

从(frmWB)弹出具有主键[WBID](自动编号)和[MainID](数)。

数据录入人员将首先进入主信息(这将有需要避免孤儿),然后点击一个按钮,保存主记录,并打开弹出窗体中添加详细信息。完成后,他们点击关闭按钮,保存弹出记录,关闭弹出窗口,然后返回到主窗体(后者保持打开状态)。导航已在弹出窗口中被禁用,并且它被设置为循环当前记录。

我已经尝试使用两个表的主ID进行链接,但在弹出窗口中添加新记录时,似乎并没有可靠地链接正确的ID号。我尝试过使用子窗体,但是如果主窗体上的导航或“新记录”按钮在子窗体中输入数据时意外击中,就会出现问题 - 这会在tblWB中创建具有错误ID号的记录。

+0

通常的方法是在弹出窗体的'BeforeInsert'事件中设置外键。你尝试过吗?这假设弹出窗口是一个绑定窗体。 – Andre

+0

嗨安德烈,我会用什么代码来设置外键? – Amarok

回答

-1

与Andre的评论相反,通常的方法是在两个表之间创建关系,强制引用完整性并使用级联更新。

虽然this article特定于Office 2003,但所有版本的Access的概念都是相同的。如果你这样做,弹出窗口会自动创建一个链接到主窗体记录的新记录。

+0

他插入记录,不更新主键。关系如何自动设置独立表单之间的外键? – Andre

+0

他正在另一个表中添加一条新记录。这正是级联更新所要做的。 –

+0

对不起,但没有。级联更新将主键中的**更改**传播给相关表。 - 从您链接的文章中:“如果您在定义关系时单击以选中Cascade更新相关字段复选框,那么无论您何时*更改主表中记录的主键*,Microsoft Access都会自动更新所有相关记录中新值的主键。“ – Andre

0

如果frmWB开启模式,使frmMain的当前记录不能被改变,而弹出是开放的,你有这样的frmWB的BeforeInsert事件过程中:

Private Sub Form_BeforeInsert(Cancel As Integer) 
    Me!MainID = Forms!frmMain!ID 
End Sub 

这种自动分配将tblMain ID添加到新创建的tblWB记录中。

MainID应该是frmWB上的一个不可见文本框,绑定到表字段MainID。在调试时,您可以使其可见,但它应该被锁定。

如果frmWB不是模态的,我会使用OpenArgs将ID从frmMain传递到frmWB。然后用Form_BeforeInsert代替Forms!frmMain!ID