DAO Recordset“不是有效的书签”

时间:2013-03-08 15:55:20

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

我正在使用ODBC链接表将Access数据项目(ADP)转换为标准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,但这给了我相同的结果。我在这里做错了吗?

3 个答案:

答案 0 :(得分:1)

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

所以这些书签在重新查询后不再有效。

所以这里最好的方法取决于

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

b)我只是想重新显示任何已更改的记录,并且还显示新记录(新记录是关键部分)。

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

例如:

Me.Refresh

或者在你的情况下

Screen.ActiveForm.Refresh

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

请注意,由于您可以在表单按钮后面使用:

Me.Refresh

然后需要LITTLE来调用你写的一般程序。

但是,如果您需要表单“加载”或显示添加的任何新记录,那么您必须使用requery。在这种情况下,在这种情况下,所述书签都变得无效。

因此,对于要重新查询的代码,我们使用PK值(希望您使用默认值为20年的默认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值的NAME传递给你的“常规”刷新例程。它看起来像是:

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

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

答案 1 :(得分: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时的位置。书签在这里不起作用,正如阿尔伯特上面所说的那样。

答案 2 :(得分:0)

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

那是所有人的

abdobox@yahoo.com

相关问题