2010-04-05 74 views
2

我想通過以下方式分配在一個循環的方式銷售人員(rsSalespeople)給客戶(rsCustomers)循環:通過記錄與VBA

  1. 瀏覽到第一個客戶,將第一個營業員的顧客。
  2. 轉到下一位客戶。如果rsSalesPersons不在EOF處,請轉到Next SalesPerson;如果rsSalesPersons在EOF處,則MoveFirst將循環回第一個SalesPerson。將此(當前)SalesPerson分配給(當前)客戶。
  3. 重複步驟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 

隨着十個客戶和銷售人員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 

上述代碼適用於通過Salespeople記錄集進行初始循環,但在記錄集結束時發現錯誤。無論EOF如何,它似乎仍會嘗試執行rsSalespeople.MoveFirst命令。

我不是檢查的rsSalespeople.EOF正常嗎?任何想法讓這個代碼工作?

+1

不回答你的問題,但爲什麼運行在你的循環中的更新語句,如果你已經有一個開放的DAO記錄,而不是隻更新當前行與rsCustomers !SalespersonID = rsSalespeople!SalespersonID – JohnFx 2010-04-05 16:00:01

+1

根據您添加新客戶多少次並且必須運行此批次,您列表中的前幾名銷售人員將獲得不成比例的分配客戶數量。也許你可以按現有客戶的數量對銷售人員名單進行分類? – JeffO 2010-04-05 17:39:22

回答

5

rsSalespeople.EOF並不表示您何時位於最後一行,它表示您何時過去了最後一行。

所以當你的條件命中最後一個銷售人員EOF是假的,所以它做一個movenext(使EOF爲真),然後通過循環的下一個傳遞操作在rsSalespeople的「EOF行」,你不能從,因此錯誤。

試試這個:

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

糟糕...客戶和銷售人員不是我在應用程序中使用的實際實體;我只是用它們作爲例子,顯然錯過了我的實際代碼的轉換!無論如何感謝您的支持。我會編輯我的OP。 – Sesame 2010-04-05 16:22:30

+0

哎呀。編輯我的答案,爲您的核心問題添加解決方案。 – JohnFx 2010-04-05 16:26:36

+0

這個伎倆!非常感謝你! – Sesame 2010-04-05 16:31:48