Цикл записи через VBA - PullRequest
       30

Цикл записи через VBA

2 голосов
/ 05 апреля 2010

Я пытаюсь назначить продавцов (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

Мои таблицы определены так:

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 Ответ

5 голосов
/ 05 апреля 2010

rsSalespeople.EOF не указывает, когда вы находитесь в последнем ряду, он указывает, когда вы ПРОШЛИ последний ряд.

Итак, когда ваше условное попадание EOF последнего продавца является ложным, поэтому он выполняет movenext (делая EOF true), тогда следующий проход цикла работает с «строкой EOF» rsSalespeople, из которой вы не можете получить значения, отсюда и ошибка.

Попробуйте вместо этого:

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