开始得到运行时错误'3159';在Access 2007中突然不是有效的书签

时间:2010-01-22 20:55:41

标签: ms-access ms-access-2007

我是编程访问的新手。我转换了一个旧的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

编辑:我已经尝试过压缩和修复。

2 个答案:

答案 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)所以屏幕不闪烁,你没有看到重新查询和导航。但请确保添加错误处理程序,因为如果在关闭屏幕绘制时发生错误,您的用户可能会卡住而无法继续。