MsAccess录入记录后需关闭重开表单才显示更新的问题求助
解决Access子表单不刷新的问题
问题场景
- 主表单绑定
TermAgreementTbl,子表单展示关联的PdUpToTbl数据 - 通过弹窗表单录入新付款后,后端已成功更新
PdUpToTbl,但关闭弹窗后子表单不显示新记录,必须重启主表单才能正常显示 - 尝试直接执行
Forms![MainForm]![Subform].Requery报错2118:必须先保存当前字段才能执行Requery操作;添加DoCmd.RunCommand acCmdSaveRecord后报错2046:命令或操作'SaveRecord'当前不可用
错误原因
- 第一个错误是因为主表单存在未保存的编辑字段,Access不允许在有脏数据时执行Requery操作
- 第二个错误是因为执行
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
相关产品推荐
相关产品推荐

