Freigeben über


Extrahieren von Daten aus einem Datensatz in einem DAO-Recordset

Nachdem Sie einen bestimmten Datensatz oder bestimmte Datensätze gefunden haben, möchten Sie möglicherweise Daten extrahieren, um sie in Ihrer Anwendung zu verwenden, anstatt die zugrunde liegende Eingabetabelle zu bearbeiten.

Kopieren eines einzelnen Felds

Sie können ein einzelnes Feld eines Datensatzes in eine Variable des entsprechenden Datentyps kopieren. Im folgenden Beispiel werden drei Felder aus dem ersten Datensatz in einem Recordset-Objekt extrahiert.

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 

Kopieren ganzer Datensätze in ein Array

Um einen oder mehrere Datensätze zu kopieren, können Sie ein zweidimensionales Array erstellen und Datensätze nacheinander kopieren. Sie erhöhen den ersten Index für jedes Feld und den zweiten Index für jeden Datensatz.

Eine schnelle Möglichkeit ist die Verwendung der GetRows-Methode , die ein zweidimensionales Array zurückgibt. Der erste Index identifiziert das Feld und der zweite Index identifiziert die Zeilennummer folgendermaßen:

varRecords(intField, intRecord) 

Im folgenden Codebeispiel wird eine SQL-Anweisung verwendet, um drei Felder aus einer Tabelle namens Employees in ein Recordset-Objekt abzurufen. Anschließend wird die GetRows-Methode verwendet, um die ersten drei Datensätze des Recordset abzurufen, und die ausgewählten Datensätze werden in einem zweidimensionalen Array gespeichert. Anschließend wird jeder Datensatz mit jeweils einem Feld gedruckt, wobei die beiden Arrayindizes verwendet werden, um bestimmte Felder und Datensätze auszuwählen.

Um die Verwendung der Arrayindizes zu verdeutlichen, wird in dem folgenden Beispiel eine separate Anweisung verwendet, um jedes Feld eines jeden Datensatzes zu identifizieren und zu drucken. In der Praxis wäre es zuverlässiger, zwei ineinander geschachtelte Schleifen zu verwenden und ganzzahlige Variablen für die Indizes bereitzustellen, die beide Dimensionen des Arrays durchschreiten.

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

Verwenden Sie nachfolgende Aufrufe der GetRows-Methode , wenn weitere Datensätze verfügbar sind. Da das Array gefüllt wird, sobald Sie die GetRows-Methode aufrufen, können Sie sehen, warum dieser Ansatz viel schneller ist als das Kopieren eines Felds nach dem anderen.

Beachten Sie auch, dass Sie variant nicht als Array deklarieren müssen, da dies automatisch erfolgt, wenn die GetRows-Methode Datensätze zurückgibt. Dies ermöglicht Ihnen die Verwendung von Arraydimensionen mit fester Länge, ohne zu wissen, wie viele Datensätze oder Felder zurückgegeben werden, anstatt Dimensionen mit variabler Länge zu verwenden, die mehr Speicher belegen.

Wenn Sie versuchen, alle Zeilen mithilfe mehrerer GetRows-Aufrufe abzurufen, verwenden Sie die EOF-Eigenschaft , um sicherzustellen, dass Sie sich am Ende des Recordset-Objekts befinden. Die GetRows-Methode gibt möglicherweise weniger Zeilen zurück, als Sie anfordern. Wenn Sie z. B. mehr als die verbleibende Anzahl von Zeilen in einem Recordset anfordern, gibt die GetRows-Methode nur die verbleibenden Zeilen zurück. Wenn eine Zeile im angeforderten Bereich nicht abgerufen werden kann, wird diese Zeile ebenfalls nicht zurückgegeben.

Wenn beispielsweise der fünfte Datensatz in einer Gruppe von 10 Datensätzen, die Sie abrufen möchten, nicht abgerufen werden kann, gibt die GetRows-Methode vier Datensätze zurück und belässt die aktuelle Datensatzposition auf dem Datensatz, der ein Problem verursacht hat, und generiert keinen Laufzeitfehler. Diese Situation kann auftreten, wenn ein Datensatz in einem Dynaset von einem anderen Benutzer gelöscht wurde. Wenn weniger Datensätze als die angeforderte Anzahl zurückgegeben werden und Sie sich nicht am Ende der Datei befinden, müssen Sie jedes Feld im aktuellen Datensatz lesen, um zu bestimmen, welcher Fehler bei der GetRows-Methode aufgetreten ist.

Da die GetRows-Methode immer alle Felder im Recordset-Objekt zurückgibt, möchten Sie möglicherweise eine Abfrage erstellen, die nur die Felder zurückgibt, die Sie benötigen. Dies ist besonders wichtig für OLE-Objekte und Memo-Felder.

Support und Feedback

Haben Sie Fragen oder Feedback zu Office VBA oder zu dieser Dokumentation? Unter Office VBA-Support und Feedback finden Sie Hilfestellung zu den Möglichkeiten, wie Sie Support erhalten und Feedback abgeben können.