MS Access连续表单Bookmark属性失效,报错3159:无效书签
连续表单添加记录后书签跳转失效(错误3159)
问题描述
我有一个设置了
.AllowAdditions=False的连续表单,通过按钮执行以下VBA代码添加新记录:Dim bkm As Variant Dim rs As DAO.Recordset Set rs = CurrentDb.OpenRecordset("tbl_Unit", , dbAppendOnly) With rs .AddNew .Fields("UnitID") = DMax("UnitID", "tbl_Unit") + 1 .Fields("ObjektID") = 0 .Fields("UnitTypID") = 0 .Update bkm = .Bookmark End With Me.Requery Me.Recordset.Bookmark = bkm End Sub记录已成功添加,但使用Bookmark方法跳转到新记录时无法生效,触发运行时错误3159: Not a valid bookmark,错误出在
Me.Recordset.Bookmark = bkm行。为何会出现该错误?
原因
书签是单个Recordset对象独有的标识,你这里的核心问题:
- 你从直接打开表的独立Recordset(
rs)中获取了书签bkm - 表单的
Me.Recordset是另一个完全独立的Recordset实例,哪怕数据源都是tbl_Unit,两个Recordset的书签也完全不通用
另外,你用dbAppendOnly模式打开的记录集仅支持添加新记录,无法浏览现有数据,这种模式下的书签本身就不具备跨实例复用的价值。
解决办法
办法1:重新定位表单记录集的新记录
先保存新生成的UnitID,表单重新查询后,用这个ID定位新记录并设置书签:
Dim newUnitID As Long Dim rs As DAO.Recordset Dim cloneRs As DAO.Recordset ' 先计算新ID,避免重复调用DMax newUnitID = DMax("UnitID", "tbl_Unit") + 1 ' 添加新记录 Set rs = CurrentDb.OpenRecordset("tbl_Unit", , dbAppendOnly) With rs .AddNew .Fields("UnitID") = newUnitID .Fields("ObjektID") = 0 .Fields("UnitTypID") = 0 .Update .Close End With Me.Requery ' 用RecordsetClone定位新记录,设置表单书签 Set cloneRs = Me.RecordsetClone cloneRs.FindFirst "UnitID = " & newUnitID If Not cloneRs.NoMatch Then Me.Bookmark = cloneRs.Bookmark End If cloneRs.Close ' 清理对象 Set rs = Nothing Set cloneRs = Nothing
办法2:直接用表单的RecordsetClone操作
跳过单独打开表的步骤,直接操作表单的记录集克隆(不影响原表单显示状态):
Dim newUnitID As Long Dim cloneRs As DAO.Recordset newUnitID = DMax("UnitID", "tbl_Unit") + 1 ' 用表单克隆记录集添加新记录 Set cloneRs = Me.RecordsetClone cloneRs.AddNew cloneRs.Fields("UnitID") = newUnitID cloneRs.Fields("ObjektID") = 0 cloneRs.Fields("UnitTypID") = 0 cloneRs.Update Me.Requery ' 定位新记录并设置书签 cloneRs.FindFirst "UnitID = " & newUnitID If Not cloneRs.NoMatch Then Me.Bookmark = cloneRs.Bookmark End If cloneRs.Close Set cloneRs = Nothing
内容的提问来源于stack exchange,提问作者rohrl77
相关产品推荐
相关产品推荐

