Método Recordset2.GetRows (DAO)
Se aplica a: Access 2013, Office 2013
Recupera varias filas de un objeto Recordset.
Sintaxis
expresión . GetRows(NumRows)
Expresión Variable que representa un objeto Recordset2 .
Parameters
Nombre |
Obligatorio/opcional |
Tipo de datos |
Descripción |
---|---|---|---|
NumRows |
Opcional |
Variant |
El número de filas que quiere recuperar. |
Valor devuelto
Variant
Comentarios
Use el método GetRows para copiar registros de un objeto Recordset.
GetRows devuelve una matriz bidimensional. El primer subíndice identifica el campo y el segundo identifica el número de fila. Por ejemplo, intField
representa el campo e intRecord
identifica el número de fila:
avarRecords(intField, intRecord)
Para obtener el primer valor de campo en la segunda fila devuelta, utilice un código como el siguiente:
field1 = avarRecords(0,1)
Para obtener el segundo valor de campo en la primera fila, utilice un código como el siguiente:
field2 = avarRecords(1,0)
La variable avarRecords se convierte automáticamente en una matriz bidimensional cuando GetRows devuelve los datos.
Si solicitan más filas que las que están disponibles, GetRows devuelve sólo el número de filas disponibles. Puede utilizar la función UBound de Visual Basic para Aplicaciones para determinar cuántas filas GetRows ha recuperado realmente porque la matriz está adaptada para que quepa el número de filas devueltas. Por ejemplo, si devolvió los resultados en una Variant llamada varA, podría utilizar el siguiente código para averiguar cuántas filas se devolvieron en realidad:
numReturned = UBound(varA,2) + 1
Debe usar "+ 1" porque la primera fila devuelta está en el elemento de la matriz 0. El número de filas que puede recuperar está limitado por la cantidad de memoria disponible. No debe utilizar GetRows para recuperar toda una tabla en una matriz si es grande.
Como GetRows devuelve todos los campos de Recordset a la matriz, incluidos los campos Memo y Long Binary, es posible que desee usar una consulta que limite los campos devueltos.
Tras realizar una llamada GetRows, el registro activo se coloca en la siguiente fila no leída. Es decir, GetRows tiene el mismo efecto en el registro actual que Movernumrows.
Si intenta recuperar todas las filas mediante varias llamadas GetRows, use la propiedad EOF para asegurarse de que está al final de Recordset. GetRows devuelve un número inferior al solicitado si está al final de Recordset o si no puede recuperar una fila en el intervalo solicitado. Por ejemplo, si está intentando recuperar 10 registros, pero no puede recuperar el quinto registro, GetRows devuelve cuatro registros y hace del quinto el registro activo. Esto no generará un error en tiempo de ejecución. Esto puede ocurrir si otro usuario elimina un registro en un objeto Recordset de tipo dynaset. Vea el ejemplo para obtener una demostración de cómo controlar esto.
Ejemplo
En este ejemplo se usa el método GetRows para recuperar un número especificado de filas de un objeto Recordset y rellenar una matriz con los datos resultantes. El método GetRows devolverá un número de filas menor que el deseado en los dos siguientes casos: si se alcanza EOF o si GetRows ha tratado de recuperar un registro anteriormente eliminado por otro usuario. La función devuelve False solo si se produce el segundo caso. Se requiere la función GetRowsOK para que se ejecute este procedimiento.
Sub GetRowsX()
Dim dbsNorthwind As Database
Dim rstEmployees As Recordset2
Dim strMessage As String
Dim intRows As Integer
Dim avarRecords As Variant
Dim intRecord As Integer
Set dbsNorthwind = OpenDatabase("Northwind.mdb")
Set rstEmployees = dbsNorthwind.OpenRecordset( _
"SELECT FirstName, LastName, Title " & _
"FROM Employees ORDER BY LastName", dbOpenSnapshot)
With rstEmployees
Do While True
' Get user input for number of rows.
strMessage = "Enter number of rows to retrieve."
intRows = Val(InputBox(strMessage))
If intRows <= 0 Then Exit Do
' If GetRowsOK is successful, print the results,
' noting if the end of the file was reached.
If GetRowsOK(rstEmployees, intRows, _
avarRecords) Then
If intRows > UBound(avarRecords, 2) + 1 Then
Debug.Print "(Not enough records in " & _
"Recordset to retrieve " & intRows & _
" rows.)"
End If
Debug.Print UBound(avarRecords, 2) + 1 & _
" records found."
' Print the retrieved data.
For intRecord = 0 To UBound(avarRecords, 2)
Debug.Print " " & _
avarRecords(0, intRecord) & " " & _
avarRecords(1, intRecord) & ", " & _
avarRecords(2, intRecord)
Next intRecord
Else
' Assuming the GetRows error was due to data
' changes by another user, use Requery to
' refresh the Recordset and start over.
If .Restartable Then
If MsgBox("GetRows failed--retry?", _
vbYesNo) = vbYes Then
.Requery
Else
Debug.Print "GetRows failed!"
Exit Do
End If
Else
Debug.Print "GetRows failed! " & _
"Recordset not Restartable!"
Exit Do
End If
End If
' Because using GetRows leaves the current record
' pointer at the last record accessed, move the
' pointer back to the beginning of the Recordset
' before looping back for another search.
.MoveFirst
Loop
End With
rstEmployees.Close
dbsNorthwind.Close
End Sub
Function GetRowsOK(rstTemp As Recordset2, _
intNumber As Integer, avarData As Variant) As Boolean
' Store results of GetRows method in array.
avarData = rstTemp.GetRows(intNumber)
' Return False only if fewer than the desired number of
' rows were returned, but not because the end of the
' Recordset was reached.
If intNumber > UBound(avarData, 2) + 1 And _
Not rstTemp.EOF Then
GetRowsOK = False
Else
GetRowsOK = True
End If
End Function