在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创建父记录?
答案 0 :(得分:0)
这里有几个可能的问题......
首先,您需要确保在PolygonID
字段上将父表单和子表单链接在一起。这可以使用SubForm向导完成,
或通过子窗体对象上的属性。
要验证的第二件事是,在您尝试在子表单中添加记录之前,您已在父表单中实际创建了新记录。
为了说明这一点,您可以在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
同样,这不是父/子表单的典型使用方案,但它确实展示了一种从子表单创建相关父记录的方法。
答案 1 :(得分:0)
如果在表之间建立参照完整性,则设置子窗体控件的MasterLinkFields和ChildLinkFields以保存PolygonID,子窗体记录的外键将自动填充。