Verwaltung von Daten ohne Tabelle

Einige Anwendungen erfordern die temporäre Verwaltung von Daten – d.h., die Daten werden im Programmverlauf ermittelt, für einen bestimmten Zweck verwendet und anschließend wieder gelöscht. Selbstverständlich könnte man für solche Fälle Tabellen anlegen, die Daten während der Bearbeitung darin speichern und die Tabelle anschließend wieder löschen. Das ist aber erstens aufwendig und zweitens wächst die Größe der Datenbank schnell ins Unermessliche, wenn der Anwender sie nicht regelmäßig komprimiert. Daher verwenden Sie entweder Datenfelder – sogenannte Arrays – oder die seit Access 2000 verfügbaren ungebundenen Datensatzgruppen.

Datenfelder (im Fachjargon: Arrays) dienen zum Speichern mehrerer Werte in einer einzigen Variablen. So können Sie sich – im Gegensatz zu einfachen Variablen – eine Menge Deklarationen und Wertzuweisungen speichern.

Gültigkeitsbereiche von Datenfeldern

Datenfelder haben einen Gültigkeitsbereich, der wie bei allen anderen Variablen von der Art der Deklaration abhängt. Dabei gibt es prinzipiell drei Möglichkeiten:

  • Das Datenfeld soll im ganzen Anwendungsbereich verfügbar sein. Deklarieren Sie das Datenfeld dann mit der Public-Anweisung im Deklarationsteil eines Moduls.
  • Das Datenfeld soll innerhalb eines Moduls verfügbar sein. Deklarieren Sie das Datenfeld mit der Private-Anweisung im Deklarationsteil des gewünschten Moduls.
  • Das Datenfeld soll nur innerhalb einer Prozedur oder Funktion verfügbar sein. Deklarieren Sie das Datenfeld dann mit der Private-Anweisung innerhalb der gewünschten Prozedur oder Funktion.
  • Statische und dynamische Datenfelder

  • Datenfelder können als statische oder dynamische Variablen deklariert werden. Der Unterschied ist, dass Sie bei statischen Datenfeldern bereits bei der Deklaration wissen müssen, wie viele Elemente das Datenfeld enthalten soll.
  • Statische Datenfelder

  • Das ist z.B. der Fall, wenn Sie die Namen aller Monate in einem Datenfeld speichern möchten. In dem Fall wissen Sie vorher, dass es sich um zwölf Elemente handelt. Die Deklaration lautet dann folgendermaßen:
  • Dim Monatsnamen(12) as String

    Zumindest lautet die Deklaration so, wenn Sie davon ausgehen, dass die einzelnen Daten von der Zahl Eins ausgehend durchnummeriert werden. Das ist aber standardmäßig nicht der Fall: Stattdessen beginnt der Index für Datenfelder bei der Zahl Null. Und da Sie mit der Zahl 12 die obere Bereichsgrenze angegeben haben, können Sie nun theoretisch 13 Daten in das Datenfeld eingeben – von 0 bis 12.

    Um die Anzahl der Elemente des Datenfeldes nun tatsächlich auf den Wert 12 festzulegen, gibt es zwei Möglichkeiten. Entweder setzen Sie die obere Grenze auf den Wert 11, wie in folgender Anweisung:

    Public Monatsnamen(11) As String

    Oder Sie setzen die untere Bereichsgrenze auf den Wert 1. Dazu verwenden Sie den folgenden Befehl und setzen gleichzeitig wieder die obere Grenze auf den Wert 12:

    Option Base 1
    Public Monatsnamen(12) As String

    Auf diese Weise können Sie nun die Monatsnamen von 1 bis 12 durchnummeriert in die gewünschte Variable einlesen. Dazu verwenden Sie eine kleine Prozedur:

    Sub MonatsnamenZuweisen()
        Monatsnamen(1) = "Januar"
        Monatsnamen(2) = "Februar"
        ....
        Monatsnamen(12) = "Dezember"
        
    End Sub

    Wenn Sie allerdings einen Monatsnamen eingeben möchten, dessen Index außerhalb des angegebenen Bereichs liegt, erscheint eine Fehlermeldung (siehe Bild 1). Um das zu testen, geben Sie einfach im Testfenster die folgende Anweisung ein:

    Monatsnamen(13) = "Fantasiemonat"

    Bild 1: Fehlermeldung nach der Eingabe eines unzulässigen Feldindizes

    Sie können die eingelesenen Monatsnamen nun beispielsweise mit der folgenden Anweisung ausgeben lassen:

    Debug.Print Monatsnamen(1)

    Oder Sie verwenden eine kleine Prozedur, um alle Monate auszugeben:

    Sub MonateAusgeben()
        Dim i As Integer
        For i = 1 To 12
            Debug.Print "Name des " _
                & i & ".ten Monats: " _
                & Monatsname(i)
        Next
    End Sub

    Die Angabe der unteren Grenze mit der Option Base-Anweisung können Sie allerdings auch umgehen, falls Sie mehrere Datenfelder verwenden und nicht alle die gleiche Untergrenze haben sollen. Geben Sie dazu die Untergrenze und die Obergrenze explizit in der Deklaration des Datenfeldes an:

    Public Monatsname(1 to 12) As String

    Sie können die Monatsnamen auch direkt als Liste eingeben. Dazu verwenden Sie die Array-Funktion. Die Funktion arbeitet allerdings nur mit Variant-Variablen, daher müssen Sie zuvor eine entsprechende Variable deklarieren:

    Public Monatsname As Variant

    Anschließend können Sie der Variablen mit dem folgenden Befehl die gewünschte Monatsliste zuweisen:

    Monatsname = Array("Januar", "Februar", "März", "April", "Mai", "Juni", "Juli", "August", "September", "Oktober", "November", "Dezember")

    In den bisherigen Beispielen haben Sie lediglich eindimensionale Datenfelder kennengelernt. Sie können aber auch zweidimensionale Datenfelder verwenden. Das ist z.B. sinnvoll, wenn Sie zu den Monatsnamen auch noch die jeweilige Anzahl Tage speichern möchten. Die Deklaration für ein solches Datenfeld sieht folgendermaßen aus:

    Public Monatsdaten(1 To 12, 1 To 2) As Variant

    Wahrscheinlich fragen Sie sich nun, warum das Datenfeld als Variant deklariert wird. Der Grund ist, dass man für das komplette Feld nur einen Datentyp angeben kann. Da die Anzahl der Tage eines Monats im Datenformat String nicht besonders sinnvoll erscheint, verwenden Sie hier den Datentypen Variant. Für Daten dieses Datentyps können beliebige Formate mit Ausnahme von Zeichenketten fester Länge und benutzerdefinierter Datentypen verwendet werden.

    Die Zuweisung der Daten eines zweidimensionalen Feldes erfolgt beispielsweise wie in folgender Prozedur:

    Sub MonatsdatenZuweisen()
        Monatsdaten(1, 1) = "Januar"
        Monatsdaten(2, 1) = "Februar"
        ....
        Monatsdaten(12, 1) = "Dezember"
        
        Monatsdaten(1, 2) = 31
        Monatsdaten(2, 2) = 28
        ....
        Monatsdaten(12, 2) = 31
    End Sub

    Zusätzlich zu den Monatsnamen enthält das Datenfeld nun noch die Anzahl Tage des jeweiligen Monats. Das Feld sieht nun etwa folgendermaßen aus:

    Monatsdaten(X,Y)

    Y=1

    Y=2

    X=1

    Januar

    31

    X=2

    Februar

    28

    X=3

    Dezember

    31

    Auf die beschriebene Weise können Sie beliebig große Felder anlegen.

    Dynamische Datenfelder

    Dynamische Datenfelder können Sie verwenden, wenn Sie bei der Deklaration noch nicht genau wissen, wie viele Daten das Feld aufnehmen soll.

    Wenn Sie beispielsweise Daten aus einer Textdatei einlesen möchten, aber nicht wissen, wie viele Zeilen die Datei enthält, ist ein dynamisches Datenfeld die richtige Wahl.

    Für das folgende Beispiel legen Sie bitte eine Textdatei wie in Bild 2 an.

    Bild 2: Textdatei mit einer Liste von Namen und Altersangaben

    Die im folgenden vorgestellte Anwendung soll die Daten in einer Tabelle namens tblAltersangaben speichern. Sie fragen nun zu Recht, warum man die Einträge nicht direkt in eine geeignete Tabelle schreiben kann. Der Grund ist, dass man zunächst die Informationen einer Zeile mit einer geeigneten Funktion auseinandernehmen muss. Daher liest man den Inhalt der Textdatei zunächst in ein geeignetes Datenfeld ein. Anschließend übergibt man das Feld an eine Funktion zum Extrahieren der einzelnen Elemente einer Zeile. Anschließend kann man die Informationen in die einzelnen Felder einer Tabelle schreiben.

    Mit der folgenden Prozedur können Sie die einzelnen Zeilen einer Textdatei in das Datenfeld Spalte einlesen:

    Sub TextdateiLesen()
        Dim Spalte(1 To 10) As String
        Dim i As Integer
        Open "c:\Alter.txt" For Input As #1
        i = 1
        While Not EOF(1)
            Line Input #1, Spalte(i)
            i = i + 1
        Wend
        Close #1
        For i = 1 To 10
            Debug.Print Spalte(i)
        Next i
    End Sub

    Im vorliegenden Fall ist das Datenfeld allerdings statisch festgelegt und kann nur zehn Elemente enthalten.

    Dementsprechend erhalten Sie eine Fehlermeldung, sobald die Datei mehr als zehn Einträge enthält. Bevor Sie aber nun für das Datenfeld eine entsprechend hohe Menge Speicherplatz reservieren und anschließend nur einen Bruchteil davon benötigen, deklarieren Sie das Datenfeld lieber als dynamisches Datenfeld. Der einzige Unterschied zur Deklaration eines statischen Datenfeldes ist, dass Sie weder die untere noch die obere Grenze des Datenfeldes angeben, sondern einfach eine leere Klammer angeben:

    Ende des frei verfügbaren Teil. Wenn Du mehr lesen möchtest, hole Dir ...

    den kompletten Artikel im PDF-Format mit Beispieldatenbank

    diesen und alle anderen Artikel mit dem Jahresabo

    Schreibe einen Kommentar