我是编程访问的新手。我转换了一个旧的97访问数据库来访问2007年,它已经工作了一段时间。今天我进入它,并在设计视图中窥探并查看代码。我什么都没改变。刚看了。当我去运行代码时,我不断收到“Not a valid bookmark”错误。只是为了确保我打开了我转换的旧程序,并且所有代码都是相同的,给我的问题是
Me.Bookmark = pos
以下是整个例程。
提前致谢。
Private Sub ProductID_AfterUpdate()
Dim pos As Variant
Me![UnitPrice] = Me![ProductID].Column(2)
Me![ProductName] = Me![ProductID].Column(1)
Me![GLAcct] = Me![ProductID].Column(3)
DoCmd.DoMenuItem acFormBar, acRecordsMenu, acSaveRecord, , acMenuVer70
pos = Me.Bookmark
Me.Requery
Me.Bookmark = pos
End Sub
编辑:我已经尝试过压缩和修复。
答案 0 :(得分:1)
您需要更改此代码,因为它已经过时了很长时间。我不确定它为什么会起作用,因为书签在更新,保存和重新查询后会发生变化。我已经评论了requery行,因为它似乎没有用处,如果你想更新组合,请重新查询。如果您希望在操作后找到记录,请将唯一ID保存到变量中并找到它。不推荐使用DoMenuItem,您可以使用RunCommand,但在这种情况下,Me.Dirty = false将保存。
Private Sub ProductID_AfterUpdate()
Dim pos As Variant
Me![UnitPrice] = Me![ProductID].Column(2)
Me![ProductName] = Me![ProductID].Column(1)
Me![GLAcct] = Me![ProductID].Column(3)
Me.Dirty=False
'pos = Me.Bookmark
'Me.Requery
'Me.Bookmark = pos
End Sub
答案 1 :(得分:1)
要重新查询表单并返回到同一记录,请执行以下操作:
Dim lngPKValue As Long
With Me.RecordsetClone
lngPKValue = Me!ID
' Me.Dirty = False is unnecessary, as the Requery saves the data
Me.Requery
.FindFirst "[ID]=" & lngPKValue
If Not .NoMatch Then
Me.Bookmark = .Bookmark
End If
End With
现在,您将此代码置于其中。我没有在原始代码中看到为什么需要重新查询,因为已经对您已经在的记录进行了更新,所以通过重新查询并返回到您开始的记录,您并没有真正完成任何事情。 。但是在某些情况下你需要这样做(例如,在一个有序的记录集中,你编辑的值会改变这个特定记录在排序结果中的位置),以上是这样做的方法
如果有必要,你可能想要关闭表单的绘画(Me.Painting = False,Me.Painting = True,一旦你设置了书签)或应用程序(Application.Echo = False) / True)所以屏幕不闪烁,你没有看到重新查询和导航。但请确保添加错误处理程序,因为如果在关闭屏幕绘制时发生错误,您的用户可能会卡住而无法继续。