Extraire les données d’un enregistrement d’un jeu d’enregistrements DAO

Après avoir localisé un ou des enregistrements, vous pouvez souhaiter extraire les données afin de les utiliser dans votre application au lieu de les modifier dans la table source sous-jacente.

Copier un seul champ

Vous pouvez copier un seul champ d'un enregistrement vers une variable du type de données approprié. L’exemple suivant extrait trois champs du premier enregistrement d’un objet Recordset.

Dim dbsNorthwind As DAO.Database 
Dim rstEmployees As DAO.Recordset 
Dim strFirstName As String 
Dim strLastName As String 
Dim strTitle As String 
 
   Set dbsNorthwind = CurrentDb 
   Set rstEmployees = dbsNorthwind.OpenRecordset("Employees") 
 
   rstEmployees.MoveFirst 
   strFirstName = rstEmployees!FirstName 
   strLastName = rstEmployees!LastName 
   strTitle = rstEmployees!Title 

Copier des enregistrements entiers dans un tableau

Pour copier un ou plusieurs enregistrements, vous pouvez créer un tableau bidimensionnel et copier un enregistrement à la fois. Vous incrémentez le premier indice de chaque champ et le second indice de chaque enregistrement.

Une méthode rapide consiste à utiliser la méthode GetRows, qui renvoie un tableau à deux dimensions. Le premier indice identifie le champ, tandis que le second identifie le numéro de ligne, comme suit.

varRecords(intField, intRecord) 

L’exemple de code suivant utilise une instruction SQL pour extraire 3 champs d’une table intitulée Employés dans un objet Recordset. Ensuite, il utilise la méthode GetRows pour extraire les 3 premiers enregistrements du jeu d’enregistrement et stocke les enregistrements sélectionnés dans un tableau à 2 dimensions. Puis, il imprime chaque enregistrement, champ par champ, en utilisant les 2 index de tableau pour sélectionner les champs et enregistrements.

Pour illustrer l'utilisation des index de tableau, l'exemple suivant utilise une instruction distincte pour identifier et imprimer chaque champ de chaque enregistrement. Dans la pratique, il est plus fiable d'utiliser deux boucles, l'une imbriquée dans l'autre, et de fournir des variables de type entier pour les index qui concernent les deux dimensions du tableau.

Sub GetRowsTest() 
 
Dim dbsNorthwind As DAO.Database 
Dim rstEmployees As DAO.Recordset 
Dim varRecords As Variant 
Dim intNumReturned As Integer 
Dim intNumColumns As Integer 
Dim intColumn As Integer 
Dim intRow As Integer 
Dim strSQL As String 
 
On Error GoTo ErrorHandler 
 
   Set dbsNorthwind = CurrentDb 
   strSQL = "SELECT FirstName, LastName, Title FROM Employees" 
   Set rstEmployees = dbsNorthwind.OpenRecordset(strSQL, dbOpenSnapshot) 
 
   varRecords = rstEmployees.GetRows(3) 
   intNumReturned = UBound(varRecords, 2) + 1 
   intNumColumns = UBound(varRecords, 1) + 1 
 
   For intRow = 0 To intNumReturned - 1 
      For intColumn = 0 To intNumColumns - 1 
         Debug.Print varRecords(intColumn, intRow) 
      Next intColumn 
   Next intRow 
 
   rstEmployees.Close 
   dbsNorthwind.Close 
 
   Set rstEmployees = Nothing 
   Set dbsNorthwind = Nothing 
 
Exit Sub 
 
ErrorHandler: 
   MsgBox "Error #: " & Err.Number & vbCrLf & vbCrLf & Err.Description 
End Sub

Vous pouvez utiliser des appels consécutifs de la méthode GetRows si plusieurs enregistrements sont disponibles. Comme le tableau est complété dès que vous appelez la méthode GetRows, vous voyez tout de suite pourquoi cette approche est beaucoup plus rapide que de copier un champ à la fois.

Notez également que vous ne devez pas déclarer le Variant en tant que tableau, car cette déclaration se fait automatiquement lorsque la méthode GetRows renvoie des enregistrements. Vous pouvez ainsi utiliser des dimensions de tableau de longueur fixe sans savoir combien d'enregistrements ou de champs seront renvoyés, au lieu d'utiliser des dimensions de longueur variable qui occupent de la mémoire.

Si vous essayez de récupérer toutes les lignes à l’aide de plusieurs appels GetRows, utilisez la propriété EOF pour vous assurer que vous êtes à la fin du recordset. La méthode GetRows peut renvoyer moins de lignes que demandé. Si vous demandez plus de lignes que le nombre de lignes restantes dans un jeu d'enregistrements, par exemple, la méthode GetRows ne renvoie que les lignes restantes. De même, s'il est impossible d'extraire une ligne dans la plage demandée, cette ligne ne sera pas renvoyée.

Par exemple, s'il est impossible d'extraire le cinquième enregistrement d'un groupe de 10 enregistrements que vous tentez d'extraire, la méthode GetRows renverra quatre enregistrements, laissera la position actuelle sur l'enregistrement qui a posé un problème et ne générera pas d'erreur d'exécution. Cette situation peut se produire si un enregistrement d'une feuille de réponse dynamique a été supprimé par un autre utilisateur. Si la méthode renvoie moins d'enregistrements que le nombre demandé et que vous n'êtes pas à la fin du fichier, vous devez lire chaque champ de l'enregistrement actif pour déterminer l'erreur rencontrée par la méthode GetRows.

Comme la méthode GetRows renvoie toujours tous les champs de l'objet Recordset, vous pouvez souhaiter créer une requête qui renvoie uniquement les champs requis. Ceci est particulièrement important pour les champs de type Objet OLE et Mémo.

Assistance et commentaires

Avez-vous des questions ou des commentaires sur Office VBA ou sur cette documentation ? Consultez la rubrique concernant l’assistance pour Office VBA et l’envoi de commentaires afin d’obtenir des instructions pour recevoir une assistance et envoyer vos commentaires.