使用VBA循环记录集

Ses*_*ame 2 sql ms-access vba loops recordset

我试图以下列方式以循环方式将销售人员(rsSalespeople)分配给客户(rsCustomers):

  1. 导航到第一个客户,将第一个SalesPerson分配给客户.
  2. 转到下一个客户.如果rsSalesPersons不在EOF,请转到Next SalesPerson; 如果rsSalesPersons处于EOF,则MoveFirst将循环回第一个SalesPerson.将此(当前)SalesPerson分配给(当前)客户.
  3. 重复步骤2,直到rsCustomers处于EOF(EOF = True,即End-Of-Recordset).

自从我处理VBA以来已经有一段时间了,所以我有点生疏,但到目前为止,这是我想出来的:

Private Sub Command31_Click()

'On Error GoTo ErrHandler

Dim intCustomer As Integer
Dim intSalesperson As Integer
Dim rsCustomers As DAO.Recordset
Dim rsSalespeople As DAO.Recordset
Dim strSQL As String

strSQL = "SELECT CustomerID, SalespersonID FROM Customers WHERE SalespersonID Is Null"
Set rsCustomers = CurrentDb.OpenRecordset(strSQL)

strSQL = "SELECT SalespersonID FROM Salespeople"
Set rsSalespeople = CurrentDb.OpenRecordset(strSQL)

rsCustomers.MoveFirst
rsSalespeople.MoveFirst

Do While Not rsCustomers.EOF

    intCustomer = rsCustomers!CustomerID
    intSalesperson = rsSalespeople!SalespersonID

    strSQL = "UPDATE Customers SET SalespersonID = " & intSalesperson & " WHERE CustomerID = " & intCustomer
    DoCmd.RunSQL (strSQL)
    rsCustomers.MoveNext

    If Not rsSalespeople.EOF Then
        rsSalespeople.MoveNext
    Else
        rsSalespeople.MoveFirst
    End If

Loop

ExitHandler:
    Set rsCustomers = Nothing
    Set rsSalespeople = Nothing
    Exit Sub

ErrHandler:
    MsgBox (Err.Description)
    Resume ExitHandler

End Sub
Run Code Online (Sandbox Code Playgroud)

我的表定义如下:

Customers
--CustomerID
--Name
--SalespersonID

Salespeople
--SalespersonID
--Name
Run Code Online (Sandbox Code Playgroud)

有十个客户和五个销售人员,我的预期结果如下:

CustomerID--Name--SalespersonID
1---A---1
2---B---2
3---C---3
4---D---4
5---E---5
6---F---1
7---G---2
8---H---3
9---I---4
10---J---5
Run Code Online (Sandbox Code Playgroud)

上面的代码适用于通过Salespeople记录集的初始循环,但是在找到记录集的末尾时出错.无论EOF如何,它似乎仍然尝试执行rsSalespeople.MoveFirst命令.

我没有正确检查rsSalespeople.EOF吗?有什么想法让这段代码有效吗?

Joh*_*nFx 5

rsSalespeople.EOF不指示您何时在最后一行,它指示您在最后一行过去的时间.

因此,当您的条件命中最后一个销售人员时,EOF为false,因此它执行movenext(使EOF为true),然后下一次循环操作在rsSalespeople的"EOF行"上运行,您无法从中提取值,因此错误.

试试这个:

rsSalespeople.MoveNext
If (rsSalespeople.EOF) Then
    rsSalespeople.MoveFirst
End If
Run Code Online (Sandbox Code Playgroud)