requerying时如何避免进入第一记录?

问题描述 投票:3回答:3

在Access 2010中创建一个表单。我正在尝试创建一个移动到下一条记录的按钮(或者如果它在结尾处的第一条记录),但是因为我想考虑其他用户对已经发生的数据集的更新与此同时,我正在重新检查表格,然后再进入下一个记录。

我正在使用以下代码,改编自this SO post

Private Sub NextRec_Click()

Dim currentID As Long

currentID = Me.id.Value


'Here is where the requery brings the form back to the first record
Me.Requery


With Me.RecordsetClone
    .FindFirst "id=" & currentID
    If Not .NoMatch Then
       If Me.Dirty Then
          Me.Dirty = False
       End If
       Me.Bookmark = .Bookmark
    End If
End With

If Me.CurrentRecord < Me.Recordset.RecordCount Then
    DoCmd.GoToRecord , , acNext
Else
    DoCmd.GoToRecord , , acFirst
End If


End Sub

它工作正常,除了.requery导致表单暂时返回到第一个记录,然后返回到当前记录然后再到下一个记录。我不希望它这样做 - 有什么方法可以保持当前记录在.requery发生时显示在表单中,而不是显示第二个记录,而.FindFirst正在寻找CurrentID的记录?

ms-access vba recordset
3个回答
3
投票

抱歉,我强烈反对那些重新发明已经提供的NEXT按钮的程序员。 如果在用户移动到下一条记录时需要执行操作,请使用OnCurrent事件。这样,您还将捕获用户有权使用的Page Down键。

对我来说,代码是不必要的,浪费资源。记录集IS每隔n秒由Access自动更新(如刷新间隔中所指定)。

确实已删除的记录保留在那里并显示为#deleted#和新记录,除非您重新查询,否则可能不会出现。但这很少成为一个问题,重新查询真的很重,不友好。


在看到@ sigil自己的回复后编辑: 只是一个减少记录集刷新次数的想法,这对你来说很重要:你可以将Me.Recordset.RecordCountdCount("*", Me.RecordSource)进行比较,只有在那些不同时才重新查询。


1
投票

因此,正如Remou在iDevlop的回答中所写的评论中所写,ODBC刷新不显示新记录。我怀疑这是问题,因为表单是从链接表中获取数据。

我仍然需要拥有自己的Prev / Next按钮,因为我希望能够在传递最后一条记录时循环回第一条记录。但我修改了代码;而不是每次都重新查询,我检查记录是否是最后一个记录,并且只在我在最后一条记录上单击Next时才重新查询,或者在第一条记录上单击Prev。这充分解决了这个问题。

NextRec_Click的修改代码如下:

Private Sub NextRec_Click()

Dim currentID As Long

currentID = Me.id.Value

If Me.CurrentRecord = Me.RecordsetClone.RecordCount Then
    Me.Requery
    With Me.RecordsetClone
        .FindFirst "id=" & currentID
        If Not .NoMatch Then
           If Me.Dirty Then
              Me.Dirty = False
           End If
           Me.Bookmark = .Bookmark
        End If
    End With


    If Me.CurrentRecord < Me.Recordset.RecordCount Then
        DoCmd.GoToRecord , , acNext
    Else
        DoCmd.GoToRecord , , acFirst
    End If
Else
    DoCmd.GoToRecord , , acNext
End If

End Sub

1
投票

重新查询记录集,而不是表单本身:

Me.Requery  '<-- resets the current record to the first one in the recordset
Me.Recordset.Requery  '<-- doesn't affect the current record
© www.soinside.com 2019 - 2024. All rights reserved.