1

I'm in the process of converting an Access Data Project (ADP) into a standard ACCDB format with ODBC linked tables. In the ADP, I had overridden the Refresh button to return the user to the current record by using the following code:

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

My understanding is that this should work just fine with DAO, but I get error 3159, Not a valid bookmark. I've also tried replacing .Bookmark with .Recordset.Bookmark, but that gave me the same result. Is there something I'm doing wrong here?

4

3 回答 3

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

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

于 2013-03-09T09:37:29.233 回答
0

我使用了 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 上面所说,书签在这里不起作用。

于 2014-03-13T15:14:17.453 回答
0

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

这都是民间

abdobox@yahoo.com

于 2016-04-21T09:19:10.267 回答