在子窗体中输入数据时,MS Access 会自动在主窗体中填写 id

Posted

技术标签:

【中文标题】在子窗体中输入数据时,MS Access 会自动在主窗体中填写 id【英文标题】:MS Access automatically fill id in main form when data is entered in subform 【发布时间】:2018-01-24 13:39:44 【问题描述】:

在 MS Access 中,我建立了一个不寻常的关系。我正在显示一系列多边形中点的坐标。除了 id 之外,多边形不需要任何参考数据,但它们每个都可以有任意数量的坐标。所以我有两个表:坐标和多边形。坐标有字段:coordinateID、x、y、order、PolygonID。 Polygons 仅具有自动编号的 PolygonID 字段。

Polygons                      Coordinates
--------                      -----------
PolygonID(primary key)--------PolygonID(foreign key)
                              coordinateID(primary key)
                              x
                              y
                              order

我为多边形创建了一个表单,并为坐标创建了一个子表单。我已经建立了具有参照完整性的父子关系。

问题是,Access 通常希望父表包含自动编号字段以外的一些数据,因此它在创建下一条记录之前等待数据输入。我可以键入序列中的下一个数字,Access 会创建记录,但如果我跳过该步骤并仅在子表单中输入数据,则不会在父表中创建记录,最终会得到孤立的条目。

当我开始在子表中输入数据时,有没有办法强制 Access 创建父记录?

【问题讨论】:

【参考方案1】:

这里有几个可能的问题...

首先,您需要确保在PolygonID 字段中链接父表单和子表单。这可以通过子表单向导来完成,

或通过子表单对象的属性。

要验证的第二件事是,在您尝试在子表单中添加记录之前,您已经在父表单中实际创建了一条新记录

为了说明这一点,您可以将Description 字段添加到Polygons 表。请注意,当您开始编辑描述时,自动编号字段会递增为一个数字。

现在,如果您输入 x 的坐标值,PolygonID 会自动填充。

更新

通常您会先创建父记录,然后添加子记录。但在这种情况下,OP 希望从子表单上的新记录自动创建父记录父记录实际存在之前。

可以在子窗体中使用一些 VBA 代码来完成此操作,但首先您需要向父窗体的表中添加至少一个附加字段。然后,以下代码会在子表单中的 Form_Dirty 事件上触发,该事件会在您开始添加新的子表单记录时立即发生。它检查父表单上的空 ID,如果找到,则假定这是父表单上的新记录。从那里,它会更改父表单上的字段值。这将创建新的父记录并通过父/子链接将PolygonID 推回子表单。

Private Sub Form_Dirty(Cancel As Integer)
    With Me.Parent
        If IsNull(!PolygonID) Then
            ' Change any field to create the parent record
            .Description = "Test"
            ' Save changes on the parent form.
            .Dirty = False
        End If
    End With
End Sub

同样,这不是父/子表单的典型使用场景,但它确实演示了一种从子表单创建相关父记录的方法。

【讨论】:

我不认为我已经完全清楚了。我的人际关系设置正确。存在参照完整性,如果我手动填写父表单上的记录,那么一切都正确链接。问题是我希望 Access 在创建第一个子表单记录时自动在父表单中创建记录。这样我就不必在父表单中手动输入数据,而且对数据完整性更有好处,因为我自己不会有在父表单上输入错误数字的风险。 @NathanJessee - 请参阅我的答案中的更新以了解执行此操作的方法。 太棒了!我知道这是一个不寻常的场景,但它完全按照我的需要工作。【参考方案2】:

如果在设置子表单控件的MasterLinkFields和ChildLinkFields的表之间建立参照完整性来保存PolygonID,子表单记录的外键将被自动填写。

【讨论】:

问题通常是您有一个包含多个字段的父表和一个包含多个字段的子表单。当按下新记录按钮时,Access 会等到在主窗体中输入数据以创建新记录并分配新的自动编号主键。在大多数情况下,这是有道理的。我的问题是我的父表单只有一个没有其他字段的主键,并且该字段是自动分配的,但是由于没有数据可供我输入,它不会创建新记录;它在等我输入数据。 我可以重新输入应该存在的 id,Access 会创建记录,但这很容易出错,因为我可能输入了错误的内容。从语义上讲,唯一要输入的数据在子表单中,因此在填写第一个子表单记录时,我需要访问以创建主表单记录。 嗯。只有自动编号字段的表单对我来说没有意义。

以上是关于在子窗体中输入数据时,MS Access 会自动在主窗体中填写 id的主要内容,如果未能解决你的问题,请参考以下文章

在按钮单击 MS Access 2013 VBA 在子窗体中创建新记录

鼠标滚动 1 个主窗体和 2 个子窗体 MS ACCESS

MS Access 验证规则未在子表单中触发

MS Access = 引用子表单中的控件

MS Access 2010 宏生成器:父窗体上控件的 SetProperty

复制 MS Access 主表单记录,同时将父子链接保留在子表单中