You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

MS Access子窗体输入数据时自动生成父表记录的方法

解决Access子窗体输入时自动创建父表记录的问题

我之前也碰到过这个一模一样的问题——Access默认非得让父表有非自动编号的字段输入才肯生成新记录,直接在子窗体输坐标就会变成孤儿记录,确实挺闹心的。不过用子窗体的BeforeInsert事件写点简单的VBA就能搞定,具体步骤如下:

核心思路

当用户在子窗体里开始输入新坐标的瞬间,自动在Polygons表生成一条新记录(因为它只有自动编号主键,不需要额外输入),然后把这条新记录的PolygonID关联到子窗体的当前新记录上,从根源避免孤儿记录。

具体实现步骤

  1. 打开主窗体的设计视图,选中子窗体控件,右键选择设计视图打开子窗体的设计界面。
  2. 在子窗体的属性窗口里切换到事件标签,找到BeforeInsert事件,点击旁边的[...]按钮打开VBA编辑器。
  3. 在弹出的代码窗口里,输入以下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

火山引擎 最新活动