【问题标题】:Pop-up form that creates record that links 1:1 to main form创建记录的弹出式表单将 1:1 链接到主表单
【发布时间】:2016-02-06 18:36:40
【问题描述】:

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

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

主窗体(frmMain)有主键[ID]

来自 (frmWB) 的弹出窗口具有主键 [WBID](自动编号)和 [MainID](编号)。

数据录入人员会先输入主要信息(为了避免孤儿必须这样做),然后单击保存主要记录的按钮并打开弹出表单以添加详细信息。完成后,他们单击保存弹出记录的关闭按钮,关闭弹出窗口,然后返回主窗体(在后面保持打开状态)。导航已在弹出窗口中禁用,并设置为循环当前记录。

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

【问题讨论】:

  • 通常的做法是在弹出表单的BeforeInsert事件中设置外键。你试过吗?这假定弹出窗口是一个绑定表单。
  • 嗨 Andre,我将使用什么代码来设置外键?

标签: forms ms-access vba


【解决方案1】:

如果 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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 他在插入记录,而不是更新主键。独立表单之间的关系如何自动设置外键?
    • 他正在根据另一个表中的记录在一个表中添加一条新记录。这正是级联更新的作用。
    • 抱歉,没有。级联更新将主键中的更改传播到相关表。 - 从您链接的文章中:“如果您在定义关系时单击以选中级联更新相关字段复选框,则只要您更改主表中记录的主键, Microsoft Access 会自动将所有相关记录中的主键更新为新值。”
    • Microsoft 显然遗漏了一些信息,包括当您通过一对一连接强制两个表之间的引用完整性时,第二个表会为相同的主键创建一条新记录在第一个表中创建。
    • 这可能不是讨论这个问题的合适地方(抱歉 Amarok!),但你有参考吗?听起来很有趣,但我在 Access 2010 中创建了一个简单的示例:i.imgur.com/Y2UUu3B.png——在 tMaster 中创建记录并没有在 tChild 中创建记录。如果它有的话,我会感到惊讶——在我看来,1:1 的关系实际上是“1:(0..1)”,就像 1:n 是“1:(0..n)”一样。跨度>
    猜你喜欢
    • 2021-06-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-08
    • 1970-01-01
    • 2015-12-11
    相关资源
    最近更新 更多