【问题标题】:"Not a valid bookmark" with DAO RecordsetDAO 记录集的“不是有效书签”
【发布时间】:2013-03-08 15:55:20
【问题描述】:

我正在将 Access 数据项目 (ADP) 转换为带有 ODBC 链接表的标准 ACCDB 格式。在 ADP 中,我使用以下代码覆盖了 Refresh 按钮以将用户返回到当前记录:

Public Sub RibbonCmd_RefreshScreen(ctl As IRibbonControl, ByRef cancelDefault)
    On Error GoTo ErrHandler

    cancelDefault = False

    DoCmd.Echo False

    Dim saveBookmark
    With Screen.ActiveForm
        saveBookmark = .Bookmark
        .Requery
        .Bookmark = saveBookmark
    End With

    'Success - cancel the default behavior
    cancelDefault = True

ExitHandler:
    DoCmd.Echo True
    Exit Sub

ErrHandler:
    cancelDefault = False
    Resume ExitHandler

End Sub

我的理解是 DAO 应该可以正常工作,但我收到错误 3159,Not a valid bookmark. 我也尝试将 .Bookmark 替换为 .Recordset.Bookmark,但这给了我相同的结果。我在这里做错了吗?

【问题讨论】:

    标签: ms-access ms-access-2007 dao


    【解决方案1】:

    实际上,重新查询表单或重新查询记录集将重新设置并使书签无效。

    因此,此类书签在重新查询后不再有效。

    所以这里最好的方法将取决于任何一个

    a) 我只是想重新显示任何更改的记录(而不是移出当前记录)。

    b) 我只是想重新显示所有更改的记录并同时显示新记录(新记录是关键部分)。

    如果您只需要刷新,那么您可以使用适当调用的命令刷新。

    例如:

    Me.Refresh
    

    或者在你的情况下

    Screen.ActiveForm.Refresh
    

    所以上面是一行代码,就是你所需要的。使用此命令时,表单的当前记录指针不会改变。所有和任何更改的记录都会重新显示给您。

    注意,既然你可以在表单按钮后面使用:

    Me.Refresh
    

    然后几乎不需要调用您编写的通用例程。

    但是,如果您需要表单“加载”或显示添加的任何新记录,那么您必须使用重新查询。在这种情况下,如在这种情况下注明的书签都将失效。

    因此,对于要重新查询的代码,我们使用 PK 值(希望您使用默认 20 年的 ID 的默认 pk)。然后代码将变为:

    Dim lngID         As Long
    
    If IsNull(Me!ID) Then Exit Sub
    
    lngID = Me!ID
    
    Me.Requery
    
    Me.Recordset.FindFirst "id = " & lngID
    

    当然,如果每个表单的 PK id 不同,那么您当然可以将 PK 值的名称传递给您的“通用”刷新例程。它看起来像:

    Public Sub MyRefresh(strPK As String)
    
       Dim lngID         As Long
    
       If IsNull(Me(strPK)) Then Exit Sub
    
       lngID = Me(strPK)
    
       Me.Requery
    
       Me.Recordset.FindFirst strPK & " = " & lngID
    
    End Sub
    

    这里的“希望”是您实际上只需要刷新,因为如上所述,这只是一行代码,更好的是它不会移动记录指针。

    【讨论】:

    • 谢谢,阿尔伯特。这似乎是我缺少的信息——重新查询不会使 ADP 中的书签无效,而且我没有意识到它在 ACCDB 中会有所不同。我曾考虑过使用刷新,但恐怕我确实需要重新查询。我希望有一种方法可以在不更改我的代码以使用 ID 的情况下做到这一点,但至少你的回答解释了为什么我必须这样做。
    【解决方案2】:

    我在开发中使用 VB6 和 Visual Data Manager。我曾经也有过一样的问题。很可能是当 2 个用户尝试同时更新同一条记录时出现的。因此表中的某些字段已损坏。 以下是我用来解决问题的步骤: 1-将表的结构(我们称之为table1)复制到另一个表(我们称之为table2)。 2- 在表 1 中找到正确的记录。 3- 将数据从 table1 传输到 table2,但损坏的记录除外 4- 再次将排除的记录重新输入到表 2。 5-重命名表1表3 6-重命名table2 table1

    就是这样

    abdobox@yahoo.com

    【讨论】:

      【解决方案3】:

      我使用了 Recordset.AbsolutePosition 表单,这很好用,例如在某个字段的 OnKeyDown 出口中

      Dim PrefilterPosition As Long
      
      Private Sub ValnSubject_KeyDown(KeyCode As Integer, Shift As Integer)
      
      ' Not F2 - exit
      If KeyCode <> vbKeyF2 Then Exit Sub
      
      '   Get the active control
      Dim ActiveCtl As Control
      Set ActiveCtl = Me.ActiveControl
      
      ActiveControlName = ActiveCtl.Name
      
      ' Is the form's filter set?
      If Me.Filter = "" Then
      
      ' NO: Apply the new filter
              ' Note the current position in the recordset
              PrefilterPosition = Me.Recordset.AbsolutePosition
      
              ' Set the filter to the Active control's value
              Me.Filter = "[" & ActiveCtl.ControlSource & "]='" & ActiveCtl.Value & "'"
              Me.FilterOn = Me.Filter <> ""
              Me.Requery
      Else
      
      ' YES: Clear the filter
              Me.Filter = ""
              Me.FilterOn = Me.Filter <> ""
              Me.Requery
      
              ' Align the recordset on the previously stored position
              Me.Recordset.AbsolutePosition = PrefilterPosition
      
          End If
      
      ' Restore the cursor to where it came from
      Me.Controls(ActiveControlName).SetFocus
      
      Ex_it:
      
      End Sub
      

      对于上下文:此代码来自“即时过滤器”的想法,您将光标放在选项卡表单中的字段上,按 F2,然后应用过滤器,因此您只能看到具有所选字段的记录价值。再次按 F2,过滤器被删除,光标回到第一次按 F2 时的位置。正如 Albert 上面所说,书签在这里不起作用。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-11-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多