vbs fields sql ms-access vba loops recordset

sql - fields - recordset vb6



Looping a través de recordset con VBA (1)

rsSalespeople.EOF no indica cuando estás en la última fila, sino que indica cuándo estás PASADO en la última fila.

Así que cuando tus hits condicionales el último vendedor EOF es falso, entonces hace un movenext (haciendo que EOF sea verdadero), entonces el siguiente pase a través del bucle está operando en la "fila EOF" de rsSalespeople de la que no puedes extraer valores, de ahí el error .

Pruebe esto en su lugar:

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

Intento asignar vendedores (rsSalespeople) a los clientes (rsCustomers) en forma de turno rotativo de la siguiente manera:

  1. Navegue al primer cliente, asigne el primer SalesPerson al cliente.
  2. Mover a Siguiente Cliente. Si rsSalesPersons no está en EOF, pase a Next SalesPerson; si rsSalesPersons está en EOF, MoveFirst regresa al primer SalesPerson. Asigne este (actual) SalesPerson al Cliente (actual).
  3. Repita el paso 2 hasta que rsCustomers esté en EOF (EOF = True, es decir, End-Of-Recordset).

Ha pasado un tiempo desde que lidié con VBA, así que estoy un poco oxidado, pero esto es lo que se me ocurrió, hasta ahora:

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

Mis tablas se definen así:

Customers --CustomerID --Name --SalespersonID Salespeople --SalespersonID --Name

Con diez clientes y 5 vendedores, mi resultado previsto sería como:

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

El código anterior funciona para el ciclo inicial a través del conjunto de registros Salespeople, pero se produce un error cuando se encuentra el final del conjunto de registros. Independientemente del EOF, parece que todavía intenta ejecutar el comando rsSalespeople.MoveFirst.

¿No estoy revisando correctamente el rsSalespeople.EOF? ¿Alguna idea para hacer que este código funcione?