You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MsAccess录入记录后需关闭重开表单才显示更新的问题求助

解决Access子表单不刷新的问题

问题场景

  • 主表单绑定TermAgreementTbl,子表单展示关联的PdUpToTbl数据
  • 通过弹窗表单录入新付款后,后端已成功更新PdUpToTbl,但关闭弹窗后子表单不显示新记录,必须重启主表单才能正常显示
  • 尝试直接执行Forms![MainForm]![Subform].Requery报错2118:必须先保存当前字段才能执行Requery操作;添加DoCmd.RunCommand acCmdSaveRecord后报错2046:命令或操作'SaveRecord'当前不可用

错误原因

  1. 第一个错误是因为主表单存在未保存的编辑字段,Access不允许在有脏数据时执行Requery操作
  2. 第二个错误是因为执行SaveRecord时,当前没有处于编辑状态的记录(比如弹窗关闭后,主表单焦点不在可编辑的记录上)

解决方案

步骤1:确保弹窗内的记录操作完全收尾

在弹窗的付款录入完成代码末尾,或者弹窗的关闭事件中,先关闭并释放用到的记录集,避免资源占用:

' 关闭并释放pdUpToRS记录集
If Not pdUpToRS Is Nothing Then
    If pdUpToRS.State = adStateOpen Then
        pdUpToRS.Close
    End If
    Set pdUpToRS = Nothing
End If
' 同理处理NewRecordSet(如果用到的话)
If Not NewRecordSet Is Nothing Then
    If NewRecordSet.State = adStateOpen Then
        NewRecordSet.Close
    End If
    Set NewRecordSet = Nothing
End If

步骤2:正确刷新子表单

不要直接刷新子表单控件,要引用子表单的Form对象执行Requery,同时先处理主表单的脏数据:

' 检查主表单是否有未保存记录,有则直接保存
If Forms![MainForm].Dirty = True Then
    Forms![MainForm].Dirty = False ' 此操作等价于保存当前记录
End If

' 刷新子表单的Form对象
Forms![MainForm]![Subform].Form.Requery

步骤3:可选:同步刷新主表单

如果主表单的数据也需要同步更新,可在刷新子表单前先刷新主表单:

Forms![MainForm].Requery

完整代码示例(弹窗关闭事件)

将以下代码放在弹窗表单的Close事件中:

Private Sub Form_Close()
    ' 释放记录集资源
    If Not pdUpToRS Is Nothing Then
        If pdUpToRS.State = adStateOpen Then
            pdUpToRS.Close
        End If
        Set pdUpToRS = Nothing
    End If
    If Not NewRecordSet Is Nothing Then
        If NewRecordSet.State = adStateOpen Then
            NewRecordSet.Close
        End If
        Set NewRecordSet = Nothing
    End If
    
    ' 保存主表单未提交的数据
    If Forms![MainForm].Dirty = True Then
        Forms![MainForm].Dirty = False
    End If
    
    ' 刷新子表单
    Forms![MainForm]![Subform].Form.Requery
End Sub

内容的提问来源于stack exchange,提问作者James Dean

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 04:48:28