Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/75.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 使用VBA在记录集中循环_Sql_Ms Access_Vba_Loops_Recordset - Fatal编程技术网

Sql 使用VBA在记录集中循环

Sql 使用VBA在记录集中循环,sql,ms-access,vba,loops,recordset,Sql,Ms Access,Vba,Loops,Recordset,我试图通过以下方式以循环方式将销售人员(RSSalesoper)分配给客户(rsCustomers): 导航到第一个客户,将第一个销售人员分配给该客户 转到下一个客户。如果销售人员不在EOF,则转到下一个销售人员;如果RSSalesons处于EOF,则移动first以返回到第一个销售人员。将此(当前)销售人员分配给(当前)客户 重复步骤2,直到rsCustomers处于EOF(EOF=True,即记录集结束) 我已经有一段时间没有处理VBA了,所以我有点生疏,但到目前为止,我已经想到了以下几点:

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

  • 导航到第一个客户,将第一个销售人员分配给该客户
  • 转到下一个客户。如果销售人员不在EOF,则转到下一个销售人员;如果RSSalesons处于EOF,则移动first以返回到第一个销售人员。将此(当前)销售人员分配给(当前)客户
  • 重复步骤2,直到rsCustomers处于EOF(EOF=True,即记录集结束)
  • 我已经有一段时间没有处理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
    
    我的表格定义如下:

    Customers
    --CustomerID
    --Name
    --SalespersonID
    
    Salespeople
    --SalespersonID
    --Name
    
    有10名客户和5名销售人员,我的预期结果如下:

    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
    
    上述代码适用于Salesopers记录集的初始循环,但在找到记录集的结尾时出错。不管EOF如何,它似乎仍然尝试执行rssaleopers.MoveFirst命令


    我没有正确检查RSSalesopers.EOF吗?有没有办法让这段代码正常工作?

    rsSalespeople.EOF不表示您何时在最后一行,它表示您何时超过最后一行

    因此,当您的条件命中最后一个销售人员EOF为false时,它会执行movenext(使EOF为true),然后循环的下一次传递将在RSSalesopers的“EOF行”上运行,您无法从中提取值,因此会出现错误

    请尝试以下方法:

    rsSalespeople.MoveNext
    If (rsSalespeople.EOF) Then
        rsSalespeople.MoveFirst
    End If
    

    不是你的问题的答案,但是为什么在你的循环中运行一个更新语句,如果你已经有一个开放的DAO记录集,而不是仅仅用RSUSER更新当前行!salersonid=rsSalespeople!销售人员分配取决于您添加新客户并必须运行此批处理的次数,列表中的前几个销售人员分配的客户数量不成比例。也许你可以按现有客户的数量对销售人员名单进行排序?哦。。。客户和销售人员不是我在应用程序中使用的实际实体;我只是用它们作为例子,显然在转换我的实际代码时忽略了这一点!无论如何,谢谢你抓住了它。我会编辑我的作品。编辑我的答案,为您的核心问题添加解决方案。