代码之家  ›  专栏  ›  技术社区  ›  pixeldev

开始出现运行时错误“3159”;在Access 2007中突然不是有效的书签

  •  0
  • pixeldev  · 技术社区  · 16 年前

    我对编程访问很陌生。我将一个旧的97访问数据库转换为访问2007,它已经工作了一段时间了。今天我进入它,在设计视图中四处窥探并查看代码。我什么也没改变。只是看看。当我去运行代码时,我一直收到“不是一个有效的书签”错误。为了确保我打开了我转换的旧程序,并且所有的代码都是相同的,问题在于

    me.bookmark=位置

    以下是整个程序。

    提前谢谢。

    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 回复  |  直到 16 年前
        1
  •  1
  •   Fionnuala    16 年前

    您将需要更改此代码,因为它已经过期一段时间了。我不知道为什么它一开始就起作用了,因为书签在更新、保存和重新查询之后会发生变化。我已经评论了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
    
        2
  •  1
  •   David-W-Fenton    16 年前

    要重新查询表格并返回到同一记录,请执行以下操作:

      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)的绘制,这样屏幕就不会闪烁,也看不到重新查询和导航。但是一定要添加一个错误处理程序,因为如果在关闭屏幕绘制时发生错误,您的用户可能会陷入困境,无法继续。

    推荐文章