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.