【问题标题】:Access: Move to next record until EOF访问:移动到下一条记录直到 EOF
【发布时间】:2011-06-15 15:16:02
【问题描述】:

我需要通过移动到记录集中的下一条记录来循环表单。

我正在使用 Form_Current 事件循环。 我使用了几个语句并且有不同的结果。

这个有时会崩溃并给出错误信息:“你不能去指定的记录。”

DoCmd.GoToRecord , , acNext

这个最多只能记录 72 条记录并停止。

DoCmd.RunCommand acCmdRecordsGoToNext

这个最多只能记录 129 条记录并停止。

Me.Recordset.MoveNext

试图找到一条指令,该指令将转到下一条记录,直到它到达文件结尾。 我使用 Access 2010(Access 2002 -2003 文件格式 mdb)作为前端。记录源是 SQL Server 2008 链接视图。

【问题讨论】:

  • 我在 Form 上使用 ActiveX 控件,需要单独处理每条记录。

标签: ms-access vba


【解决方案1】:

从当前记录循环到结尾:

While Me.CurrentRecord < Me.Recordset.RecordCount
    ' ... do something to current record
    ' ...

    DoCmd.GoToRecord Record:=acNext
Wend

检查是否可以转到下一条记录:

If Me.CurrentRecord < Me.Recordset.RecordCount Then
    ' ...
End If

【讨论】:

    【解决方案2】:

    保持代码简单始终是我的建议:

    If IsNull(Me.Id) = True Then
      DoCmd.GoToRecord , , acNext
    Else
      DoCmd.GoToRecord , , acLast
    End If
    

    【讨论】:

    • 我喜欢这样。很好很简单。谢谢
    【解决方案3】:

    如果您想要循环遍历表单记录的 cmd 按钮,请尝试将此代码添加到您的 cmdNext_ClickcmdPrevious_Click VBA。 我发现它运行良好并且可以解决 BOF / EOF 问题:

    On Error Resume Next
    
    DoCmd.GoToRecord , , acNext
    
    On Error Goto 0
    
    
    On Error Resume Next
    
    DoCmd.GoToRecord , , acPrevious
    
    On Error Goto 0
    

    祝你好运!时间

    【讨论】:

      【解决方案4】:
      If (Not IsNull(Me.id.Value)) Then
      DoCmd.GoToRecord , , acNext
      End If
      

      嗨, 你需要把它放在表单中激活,并有一个名为 id 的 id 字段...

      这样它会一直通过,直到它到达没有 id 的那个(又名新的)...

      【讨论】:

        【解决方案5】:

        我过去也这样做过,并且一直使用这个:

          With Me.RecordsetClone
            .MoveFirst
            Do Until .EOF
              If Me.Dirty Then
                 Me.Dirty = False
              End If
              .MoveNext
              Me.Bookmark = .Bookmark
            Loop
          End With
        

        有些人会使用表单的 Recordset,它不需要设置书签(即导航表单的 Recordset 会自动导航表单的编辑缓冲区,因此用户会立即看到移动),但我更喜欢 RecordsetClone 的间接性.

        【讨论】:

          【解决方案6】:
          Set rs = me.RecordsetClone
          rs.Bookmark = me.Bookmark
          Do
              rs.movenext
          Loop until rs.eof
          

          【讨论】:

          • @David:我在那里设置了书签,以便循环从当前记录开始。他最初说他需要遍历记录,这并不意味着移动表单本身。
          • 嗯。关于 RecordsetClone 和表单的编辑/显示缓冲区之间的区别的好点——也就是说,recordsetclone 书签独立于表单的记录指针导航 RecordsetClone。您可能希望在不更改显示缓冲区的情况下进行编辑。所以,我删除了我的评论。但是,如果需要 ActiveX 控件来编辑记录,那么这肯定必须在表单的编辑/显示缓冲区中完成,而不仅仅是在 RecordsetClone 中,因为 ActiveX 控件只能在表单的编辑缓冲区中进行操作(即显示的内容)。
          【解决方案7】:

          在表单关闭事件中添加此代码无论您添加新记录还是删除,它都会重新创建从 1 到最后一条记录的主键。此代码不会干扰表的其他列。

          Sub updatePrimaryKeysOnFormClose()
              Dim i, rcount As Integer
              'Declare some object variables
              Dim dbLib As Database
              Dim rsTable1 As Recordset
              'Set dbLib to the current database (i.e. LIBRARY)
              Set dbLib = CurrentDb
              'Open a recordset object for the Table1 table
              Set rsTable1 = dbLib.OpenRecordset("Table1")
              rcount = rsTable1.RecordCount
              '== Add New Record ============================  
                  For i = 1 To rcount
                        With rsTable1
                                rsTable1.Edit  
                                rsTable1.Fields(0) = i  
                                rsTable1.Update  
                                '-- Go to Next Record ---  
                                rsTable1.MoveNext
                       End With  
                  Next  
                  Set rsTable1 = rsTable1
          End Sub
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2015-04-01
            • 2016-08-12
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多