Ses*_*ame 2 sql ms-access vba loops recordset
我试图以下列方式以循环方式将销售人员(rsSalespeople)分配给客户(rsCustomers):
自从我处理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吗?有什么想法让这段代码有效吗?
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)