Lies diesen Artikel und viele weitere mit einem kostenlosen, einwöchigen Testzugang.
Als Access“ler sind Sie es gewohnt, Daten in strukturierter Form in Tabellen zu speichern. Manchmal braucht man diese Daten aber nur ganz kurz, beispielsweise um diese aus einer Textdatei, einem XML-Dokument oder aus anderen Quellen einzulesen und sie zu sortieren oder zu filtern oder in einem Formular anzuzeigen. Dafür extra eine Tabelle zu erstellen, wäre in vielen Fällen übertrieben. Abhilfe schafft eine temporäre Datensatzgruppe (temporary recordset), die Sie leicht per ADO erstellen, füllen und wieder entsorgen.
Wozu temporäre Datensatzgruppen
Für den Einsatz einer temporären Datensatzgruppe kommen alle Situationen infrage, bei denen Daten zwar nicht dauerhaft gespeichert werden, aber in strukturierter Form vorliegen müssen. Die hier vorliegende Struktur ist ein Recordset, das beliebig viele Daten enthalten kann und die üblichen Vorteile des Recordset-Objekts bietet:
- Filtern und sortieren der enthaltenen Daten
- Anzeige der Daten in Formularen oder Berichten
- Anzeige der Daten in Steuerelementen wie Kombinations- oder Listenfeldern
Recordsets auf Basis bestehender Tabellen oder Abfragen können die beiden Bibliotheken für den Datenzugriff, DAO und ADODB, erstellen. Temporäre Recordsets erzeugen Sie aber nur mit ADODB, DAO bietet diese Möglichkeit nicht. Während laut aktuellem Stand DAO die bevorzugte Datenzugriffstechnik für Access-Anwendungen ist, hat ADODB wegen einiger spezieller Funktionen durchaus noch eine Daseinsberechtigung. Neben den hier vorgestellten temporären Datensatzgruppen sind das die Disconnected Recordsets (siehe auch den gleichnamigen Beitrag unter www.access-im-unternehmen.de/437).
Datenquellen für temporäre Datensatzgruppen
In vielen Fällen soll eine Funktion einer Anwendung etwas mit externen Daten durchführen, die beispielsweise aus einer Excel-Datei, einer Textdatei oder einem XML-Dokument stammen. Sie können diese Daten dazu in einer temporären Tabelle speichern, in ein Array, ein Collection- oder ein Dictionary-Objekt füllen oder auch eine temporäre Datensatzgruppe verwenden.
Letztere hat gegenüber der temporären Tabelle den Vorteil, dass Sie diese nicht extra anlegen müssen, außerdem blähen Sie mit einer temporären Datensatzgruppe die Datenbank nicht auf, wie es beim Anlegen, Füllen und Löschen einer temporären Tabelle der Fall ist. Gegenüber dem Array, dem Dictionary oder der Collection (mehr zu diesen Möglichkeiten erfahren Sie im Beitrag Arrays, Collections und Dictionaries, www.access-im-unternehmen.de/640) haben Sie den Vorteil, dass Sie komfortabel über die Recordset-Eigenschaften und -Methoden von ADODB auf die Daten zugreifen können.
Erstellen einer temporären Datensatzgruppe
Das A und O beim Einsatz einer temporären Datensatzgruppe ist deren Erstellung. Dazu definieren Sie zunächst eine entsprechende Objektvariable (nachdem Sie sichergestellt haben, dass Ihr VBA-Projekt einen Verweis auf die Microsoft ActiveX Data Objects 2.x Library enthält) und erzeugen das entsprechende Objekt:
Dim rst As ADODB.Recordset Set rst = New ADODB.Recordset
Danach können Sie schon mit dem Hinzufügen der Felder und ihrer Eigenschaften beginnen. Dazu verwenden Sie die Append-Anweisung der Fields-Auflistung des Recordset-Objekts, die folgende Parameter besitzt:
- Name: Feldname
- Type: Felddatentyp
- DefinedSize: Feldgröße
- Attrib: zusätzliche Attribute für das Feld
- FieldValue: Wert des Feldes
Den Feldnamen können Sie entsprechend der gängigen Konventionen festlegen. Für den Felddatentyp geben Sie eine der folgenden Konstanten an, die den Felddatentypen aus dem Tabellenentwurf entsprechen:
- Zahl (ReplikationID): adGUID (72)
- Zahl (Integer): adSmallInt (2)
- Zahl (LongInteger): adInteger (3)
- Zahl (Single): adSingle (4)
- Zahl (Double): adDouble (5)
- Währung: adCurrency (6)
- Datum: adDate (7)
- Ja/Nein: adBoolean (11)
- Zahl (Byte): adUnsignedTinyInt (17)
- Zahl (Dezimal): adNumeric (131)
- Text: adVarWChar (202)
- Memo: adLongVarWChar (203)
- Hyperlink: adLongVarWChar (203)
- OLEObjekt: adLongVarBinary (205)
Diese Werte haben wir durch Anlegen von Feldern entsprechender Datentypen und Auslesen der Eigenschaft Type des Field-Objekts gewonnen. Der Parameter DefinedSize und somit die Feldgröße benötigten Sie nur für einige Felddatentypen wie etwa das Textfeld, wo Sie einen Wert bis maximal 255 einstellen können. Unter Attrib geben Sie die Attribute der Enumeration FieldAttributeEnum ein, die aber in einem temporären Recordset keine Rolle spielen. Schließlich können Sie mit FieldValue gleich den Wert des Felds angeben. Dieses Feature ist interessant, wenn Sie nur einen Datensatz zum Recordset hinzufügen möchten. Anderenfalls füllen Sie das Recordset einfach im Anschluss an die Erstellung.
Beispiel für eine temporäre Datensatzgruppe
Als Beispiel soll der Inhalt einer einfachen Textdatei in eine temporäre Datensatzgruppe eingelesen werden. Die Textdatei sieht wie in Bild 1 aus und enthält je Zeile einen Namen, dessen Bestandteile durch das Tabulatorzeichen voneinander getrennt sind.
Bild 1: Diese Textdatei dient als Datenherkunft für die zu füllende temporäre Datensatzgruppe.
Die Funktion NamenEinlesen der Beispieldatenbank deklariert und erstellt zunächst wie oben beschrieben eine neue Datensatzgruppe. Außerdem verwendet sie noch eine Variable namens strPerson zum Zwischenspeichern der Namen:
Dim strPerson As String
Die folgenden beiden Anweisungen fügen der Datensatzgruppe rst die beiden Felder Vorname und Nachname hinzu, beide mit dem Datentyp adLongVarWChar, was dem Datentyp Text des Tabellenentwurfs entspricht:
With rst rst.Fields.Append "Vorname", _ adLongVarWChar, 255 rst.Fields.Append "Nachname", _ adLongVarWChar, 255 End With
Mit der Open-Methode erwecken wir die Datensatzgruppe zum Leben:
rst.Open
Zu beachten ist hier, dass wir Parameter wie die Connection gar nicht erst angeben – immerhin wollen wir ja mit einem temporären Recordset arbeiten.
Daten in das Recordset schreiben
Danach folgt der Teil zum Einlesen der Daten. Die Open-Methode öffnet die Textdatei zum zeilenweisen Einlesen:
Open CurrentProject.Path & "\Personen.txt" _ For Input As #1
In einer Do While-Schleife liest die Funktion dann jeweils eine Zeile der Textdatei ein und speichert den Inhalt in der Variablen strPerson zwischen:
Do While Not EOF(1) Line Input #1, strPerson
Sie legt dann einen neuen Datensatz in der temporären Datensatzgruppe an:
rst.AddNew
Die beiden Bestandteile des Namens ermittelt die Funktion durch Aufsplitten der Textzeile an der Stelle mit dem Tabulator-Zeichen und Auswahl des 0-ten (Vorname) und ersten Elements (Nachname):
rst!Vorname = Split(strPerson, vbTab)(0) rst!Nachname = Split(strPerson, vbTab)(1)
Schließlich speichert die Update-Methode die änderungen des Datensatzes und die Loop-Anweisung sorgt für den Sprung zur nächsten Zeile:
rst.Update Loop
Die Textdatei kann nun geschlossen werden:
Close #1
Vor der Übergabe der Datensatzgruppe an den Rückgabewert der Funktion verschieben wir den Datensatzzeiger noch auf den ersten Datensatz:
Ende des frei verfügbaren Teil. Wenn Du mehr lesen möchtest, hole Dir ...
Testzugang
eine Woche kostenlosen Zugriff auf diesen und mehr als 1.000 weitere Artikel
diesen und alle anderen Artikel mit dem Jahresabo