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

时间:2012-02-10 21:46:40

标签: ms-access vba recordset

在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发生时保持当前记录在表单中显示,而不是在{{1} {{1}时显示分秒的第一条记录正在寻找.FindFirst的记录?

3 个答案:

答案 0 :(得分:3)

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

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

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


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

答案 1 :(得分: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

答案 2 :(得分:1)

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

Me.Requery  '<-- resets the current record to the first one in the recordset
Me.Recordset.Requery  '<-- doesn't affect the current record