MS Access子窗体输入数据时自动生成父表记录的方法
解决Access子窗体输入时自动创建父表记录的问题
我之前也碰到过这个一模一样的问题——Access默认非得让父表有非自动编号的字段输入才肯生成新记录,直接在子窗体输坐标就会变成孤儿记录,确实挺闹心的。不过用子窗体的BeforeInsert事件写点简单的VBA就能搞定,具体步骤如下:
核心思路
当用户在子窗体里开始输入新坐标的瞬间,自动在Polygons表生成一条新记录(因为它只有自动编号主键,不需要额外输入),然后把这条新记录的PolygonID关联到子窗体的当前新记录上,从根源避免孤儿记录。
具体实现步骤
- 打开主窗体的设计视图,选中子窗体控件,右键选择设计视图打开子窗体的设计界面。
- 在子窗体的属性窗口里切换到事件标签,找到BeforeInsert事件,点击旁边的
[...]按钮打开VBA编辑器。 - 在弹出的代码窗口里,输入以下VBA代码:
Private Sub Form_BeforeInsert(Cancel As Integer) ' 检查父窗体当前是否不是新记录(也就是没有正在编辑的父表新记录) If Not Me.Parent.NewRecord Then ' 给父表添加一条新记录 Me.Parent.Recordset.AddNew ' 直接保存,因为Polygons只有自动编号主键,不需要填其他字段 Me.Parent.Recordset.Update ' 刷新父窗体的记录集,确保获取到刚生成的PolygonID Me.Parent.Requery ' 移动到父表的最后一条记录(也就是刚创建的那条) Me.Parent.Recordset.MoveLast End If ' 将父窗体的PolygonID赋值给子窗体当前记录的外键字段 Me!PolygonID = Me.Parent!PolygonID End Sub
注意事项
- 确保父窗体的记录集是可更新的:如果父窗体是基于查询的,要保证查询没有包含不可更新的字段或连接类型(比如交叉表查询就不行,直接用
Polygons表作为数据源肯定没问题)。 - 你的参照完整性设置已经是带级联的,这个代码不会破坏它,反而会严格遵循关联规则。
- 测试的时候可以直接在子窗体的x/y字段输入值,你会发现父表自动生成了一条新记录,并且子记录的
PolygonID已经正确关联上了。
内容的提问来源于stack exchange,提问作者Nathan Jessee




