如何转到MS Access中的下一条记录

时间:2011-07-19 06:49:56

标签: ms-access ms-access-2007

我是MS access 2007编程的新手.. 我想逐个从数据库中获取信息。但我正在使用的代码并没有执行。如果我在第一个记录,那么它直接进入我不想要的最后一个记录。我想把它带到下一个记录.. 这是我的代码:

Private Sub MoveNextBttn_Click()
    Dim db As Database
    Set db = CurrentDb
    Dim str As String
    str = "SELECT * FROM Table_Emp_Info"
    Dim rst As Recordset
    Set rst = db.OpenRecordset(str)
    Dim xxx As Integer
    xxx = 1

    'If the recordset is empty, exit.
    If rst.EOF Then
       Exit Sub
    End If

    Do Until rst.EOF
        Emp_ID_Text.Value = rst.Fields("EmpID")
        Rowsource_Designation.Value = rst.Fields("Designation")
        RowSource_Dept.Value = rst.Fields("Dept")
        DOJ_Text.Value = rst.Fields("Date_Of_Joining")
        rst.MoveNext
         'xxx = xxx + 1
    Loop

    rst.Close

End Sub

5 个答案:

答案 0 :(得分:3)

您需要使用绑定表单,而不是未绑定表单。

听起来您正在尝试重新构建Access内置的功能。要将表单从未绑定表单更改为绑定表单,请执行以下操作:

  1. 在设计视图中打开表单。
  2. 按F4打开表单属性表。
  3. 单击“数据”选项卡。
  4. 在RecordSource属性中输入SELECT * FROM Table_Emp_Info(您也可以输入Table_Emp_Info将表单直接绑定到查询的基础表格。)
  5. 单击“格式”选项卡,确保“导航按钮”设置为“是”(默认值)。
  6. 摆脱你写的所有不必要的代码。
  7. 现在,您只需使用表单左下方的5个按钮即可浏览记录。从左到右按钮将带您进入First,Previous,Next,Last或New记录。

    有关详细信息,请搜索“ms access bound form”。

答案 1 :(得分:1)

您的代码看起来没问题,但您在每次迭代中都将Table_Emp_Info的值写入相同的位置:

    Emp_ID_Text.Value = rst.Fields("EmpID")
    Rowsource_Designation.Value = rst.Fields("Designation")
    RowSource_Dept.Value = rst.Fields("Dept")
    DOJ_Text.Value = rst.Fields("Date_Of_Joining")
    rst.MoveNext

这使得位置在循环结束时保持最后一行的值。这是你的意图,还是你想要一些不同的东西?

修改

根据您的评论判断,您想要逐步完成Table_Emp_Info的元组。在这种情况下,您不需要循环 - 单击应执行rst.MoveNext并更新显示数据的字段。

这样的事情可行,但有免责声明:我对Access模型的工作原理几乎一无所知。

private rst As Recordset

Private Sub Form_Open(Cancel As Integer)
    set rst = CurrentDb.OpenRecordset("SELECT * FROM Table_Emp_Info")
    call UpdateForm()
End Sub

private sub UpdateForm()
    if not rst.EOF
        Emp_ID_Text.Value = rst.Fields("EmpID")
        Rowsource_Designation.Value = rst.Fields("Designation")
        RowSource_Dept.Value = rst.Fields("Dept")
        DOJ_Text.Value = rst.Fields("Date_Of_Joining")
    end if
end sub

private sub MoveNextBttn_Click()
    if not rst.EOF then
        rst.MoveNext
        call UpdateForm()
    end if
end sub

答案 2 :(得分:0)

Do while not rst.EOF
        Emp_ID_Text.Value = rst.Fields("EmpID")
        Rowsource_Designation.Value = rst.Fields("Designation")
        RowSource_Dept.Value = rst.Fields("Dept")
        DOJ_Text.Value = rst.Fields("Date_Of_Joining")
        rst.MoveNext
         'xxx = xxx + 1
    Loop

答案 3 :(得分:0)

在我看来,您应该使用单个SQL UPDATE语句来执行更新,而不是遍历表单和记录集并逐个记录复制数据。

但是,您没有提供足够的信息来提供示例SQL,因为我无法知道目标表单与源数据的关系。

可能是您正在创建新记录并从记录集中复制数据,在这种情况下,您将使用SQL INSERT语句而不是UPDATE,但这里没有足够的信息可用

ASIDE:

顺便说一句,作为一个禁止在记录集没有返回任何内容时执行循环的保护子句,DAO中的常用方法是检查记录集的.Recordcount属性是否为0:

  'If the recordset is empty, skip the loop.
  If rst.RecordCount <> 0 Then
     Do Until rst.EOF
       Emp_ID_Text.Value = rst.Fields("EmpID")
       Rowsource_Designation.Value = rst.Fields("Designation")
       RowSource_Dept.Value = rst.Fields("Dept")
       DOJ_Text.Value = rst.Fields("Date_Of_Joining")
       rst.MoveNext
       'xxx = xxx + 1
     Loop
  End If
  rst.Close
  Set rst = Nothing ' you omitted this step

你实际上不想退出,因为你没有关闭你的记录集。

答案 4 :(得分:-1)

在do循环之前尝试这样做:

{{1}}