Recordset.GetRows, méthode (DAO)
S’applique à : Access 2013, Office 2013
Récupère plusieurs lignes à partir d’un objetRecordset .
Syntaxe
expression . GetRows(NumRows)
expression Variable représentant un objet Recordset.
Paramètres
Nom |
Obligatoire/facultatif |
Type de données |
Description |
---|---|---|---|
NumRows |
Facultatif |
Variant |
Nombre de lignes à récupérer. |
Valeur renvoyée
Variant
Remarques
Utilisez la méthode GetRows pour copier des enregistrements d'un objet Recordset.
GetRows renvoie un tableau à deux dimensions. Le premier indice identifie le champ, tandis que le second identifie le numéro de ligne. Par exemple, intField
représente le champ et intRecord
identifie le numéro de ligne :
avarRecords(intField, intRecord)
Pour obtenir la valeur du premier champ de la deuxième ligne en renvoi, utilisez un code semblable à celui-ci :
field1 = avarRecords(0,1)
Pour obtenir la valeur du deuxième champ de la première ligne, utilisez un code analogue au suivant :
field2 = avarRecords(1,0)
La variable avarRecords devient automatiquement un tableau matriciel à deux dimensions quand GetRows renvoie des données.
Si vous demandez plus de lignes qu'il n'y en a de disponibles, GetRows ne renvoie que le nombre de lignes disponibles. Vous pouvez utiliser la fonction UBound de Visual Basic pour Applications pour déterminer le nombre de lignes que GetRows extrait réellement, car le tableau est dimensionné en fonction du nombre de lignes renvoyées. Par exemple, si vous avez renvoyé les résultats dans une Variant appelée varA, vous pouvez utiliser le code suivant pour déterminer le nombre de lignes réellement renvoyées :
numReturned = UBound(varA,2) + 1
Vous devez utiliser « + 1 », car la première ligne renvoyée est l’élément 0 de la matrice. Le nombre de lignes que vous pouvez extraire est limité par la quantité de mémoire disponible. Vous ne devez pas utiliser GetRows pour extraire une table entière dans un tableau si celle-ci est volumineuse.
Étant donné que GetRows renvoie tous les champs de l'objet Recordset dans le tableau, y compris les champs de type Memo et Long Binary, il est recommandé d'utiliser une requête qui limite le nombre de champs renvoyés.
Suite à l'appel de GetRows, l'enregistrement actif est positionné au niveau de la ligne non lue suivante. Autrement dit, GetRows a le même effet sur l’enregistrement actif que Move numrows.
Si vous tentez d'extraire toutes les lignes en recourant à plusieurs appels GetRows, utilisez la propriété EOF pour être certain d'atteindre la fin de l'objet Recordset. La méthode GetRows renvoie un nombre de lignes inférieur à ce qui a été demandé si elle se trouve à la fin de l'objet Recordset, ou si elle ne peut pas extraire une ligne dans la plage demandée. Par exemple, si vous essayez d'extraire 10 enregistrements mais que vous ne pouvez pas extraire le cinquième, GetRows renvoie quatre enregistrements et le cinquième devient l'enregistrement actif. Cela ne génère pas d'erreur d'exécution. En revanche, il pourra s'en produire une si un autre utilisateur supprime un enregistrement dans un objet Recordset de type feuille de réponse dynamique. Consultez l’exemple pour savoir comment traiter ce problème.
Exemple
Cet exemple de code montre comment utiliser la méthode GetRows pour extraire un nombre déterminé de lignes d'un objet Recordset et pour remplir un tableau avec les données résultantes. La méthode GetRows peut renvoyer un nombre de lignes inférieur au nombre souhaité dans deux cas : si EOF a été atteint ou si GetRows a tenté d'extraire un enregistrement qui a été supprimé par un autre utilisateur. La fonction ne renvoie la valeur False que dans le deuxième cas. La fonction GetRowsOK est nécessaire à l'exécution de cette procédure.
Sub GetRowsX()
Dim dbsNorthwind As Database
Dim rstEmployees As Recordset
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 Recordset, _
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