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

时间:2018-01-24 13:39:45

标签: ms-access

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

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

我为Polygons创建了一个表格,其中包含Coordinates的子表单。我已经建立了具有参照完整性的父子关系。

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

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

2 个答案:

答案 0 :(得分:0)

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

首先,您需要确保在PolygonID字段上将父表单和子表单链接在一起。这可以使用SubForm向导完成,

enter image description here

或通过子窗体对象上的属性。

enter image description here

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

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

enter image description here

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

enter image description here

更新

通常,您首先创建父记录,然后添加子记录。但在这种情况下,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

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

答案 1 :(得分:0)

如果在表之间建立参照完整性,则设置子窗体控件的MasterLinkFields和ChildLinkFields以保存PolygonID,子窗体记录的外键将自动填充。