Kombinations- und Listenfelder füllen

Lies diesen Artikel und viele weitere mit einem kostenlosen, einwöchigen Testzugang.

Autor: André Minhorst, Duisburg

Normalerweise sollte das Füllen von Kombinations- und Listenfeldern keine großartigen Probleme bereiten. Sie können dies einfach durch Zuweisen einer Datensatzherkunft wie einer Tabelle oder Abfrage, einer Wertliste oder einer Feldliste erledigen. Manchmal müssen Sie allerdings auf eine eher weniger bekannte Methode zurückgreifen: die Verwendung einer Funktion als Herkunftsart.

Wenn Sie eine Tabelle oder Abfrage mit den anzuzeigenden Daten verwenden können, bereiten Kombinations- und Listenfelder keine Probleme. Ebenso verhält es sich, wenn Sie eine kleine Menge statischer Daten haben und diese dem Steuerelement in Form einer Wertliste übergeben.

Kritisch wird es, wenn die Daten weder in Tabellen- noch in Abfrageform vorliegen und die Datenmenge zu groß ist, um die Bedingungen für den Einsatz einer Wertliste zu erfüllen – denn hier gibt es leider eine Beschränkung bezüglich der Zeichenzahl.

Ein solcher Fall tritt z. B. im Beitrag Dateien verwalten mit Access in der Ausgabe 4/2002 von Access im Unternehmen auf. Dort sollen Listenfelder dazu verwendet werden, um Verzeichnisse und Dateien anzuzeigen.

Function <Funktionsname>(Feld As Control, _    ID As Variant, Zeile As Variant, _    Spalte As Variant, Code As Variant) As Variant
    ''Deklarationsteil
    Select Case Code
        Case acLBInitialize     ''Initialisieren
        Case acLBOpen           ''öffnen.
        Case acLBGetRowCount    ''Zeilen lesen
        Case acLBGetColumnCount ''Spalten lesen
        Case acLBGetColumnWidth ''Spaltenbreite abrufen.
        Case acLBGetValue       ''Daten lesen.
        Case acGetFormat        ''Festlegen des Formats
        Case acLBEnd            ''Ende 
    End Select
End Function

Quellcode 1

Die Verwendung einer Wertliste scheint prädestiniert für diese Aufgabe, doch wenn Sie einmal die Verzeichnisse mit Ihrem Windows Explorer durchsehen, stellen Sie fest, dass 2048 Zeichen schnell verbraucht sind.

Eine andere Alternative wäre das Anlegen einer temporären Tabelle. Wenn Sie diese Tabelle allerdings oft verwenden, bläht sich die Datenbank sehr schnell auf und erfordert regelmäßiges Komprimieren.

Daher bleibt als letzte Möglichkeit die Verwendung einer Funktion als Herkunftsart des Listenfeldes. Sie haben sich nicht verlesen: Die Funktion wird tatsächlich als Herkunftsart und nicht als Datensatzherkunft eingetragen.

Die Funktionen zum Füllen von Kombinations- und Listenfeldern heißen Callback-Funktionen. Access ruft eine solche Funktion immer mehrmals hintereinander mit unterschiedlichen Parametern auf. Daher muss die Callback-Funktion ein bestimmtes Format haben. In Quellcode 1 finden Sie das Grundgerüst einer Callback-Funktion.

Bild 1: Beispiele für Listenfelder ohne Datensatzherkunft

Bereits im Aufruf finden Sie einige Parameter, die möglicherweise die Frage aufwerfen, wie sie zu füllen sind. Die Antwort ist einfach: Access übernimmt die Zuweisung der entsprechenden Werte. Sie müssen nur den Funktionsnamen für die Eigenschaft Herkunftsart des Kombinations- oder Listenfeldes eintragen.

Access ruft dann die Funktion unterschiedlich oft mit den verschiedenen Werten für den Parameter Code auf.

Mit der Select Case-Anweisung ermittelt die Funktion dann, welcher Schritt als nächster auszuführen ist. Alles Weitere lässt sich am besten an Hand eines Beispiels erläutern.

Die Funktionsweise von Callback-Funktionen soll an Hand eines Listenfeldes erläutert werden, das mit den Dateien eines bestimmten Verzeichnisses gefüllt werden soll (siehe Bild 1).

Hinweis

Das in den folgenden Abschnitten beschriebene Beispiel ist in der Beispieldatenbank zum Beitrag Dateien verwalten leicht gemacht enthalten. Sie finden die Datenbank namens Dateimanager97.mdb bzw. Dateimanager2000.mdb auf der Heft-CD.

Diese Dateien werden mit Hilfe des FileSystemObjects aus dem Dateisystem von Windows ausgelesen und in eine temporäre Datensatzgruppe geschrieben. Dort erfolgt die alphabetische Sortierung der Datensätze.

Deklarationsteil

Im Deklarationsteil der Callback-Funktion legen Sie die innerhalb der Funktion verwendeten Variablen fest.

Dabei ist eine Besonderheit zu beachten: Da das Listenfeld die Funktion mehrere Male aufruft und dabei auch auf die Ergebnisse vorheriger Aufrufe aufbaut, müssen diese dauerhaft vorhanden sein. Dazu definieren Sie die entsprechenden Variablen nicht mit der Dim-, sondern mit der Static-Anweisung.

Dies ist bei der Datensatzgruppe rstDateien und der Laufvariablen i erforderlich. Die Funktion legt die Inhalte beider Variablen beim ersten Aufruf fest und greift später wieder auf sie zurück.

Static Datei(1000) As String
Static i As Integer
Dim Rueckgabewert As Variant
Dim Pfad As String
Dim objFSO As Scripting.FileSystemObject
Dim objVerzeichnis As Scripting.folder
Dim objDatei As _Scripting.File

Initialisierung

Die Initialisierung erfolgt ein einziges Mal und wird durch den Code-Wert acLBInitialize ausgelöst.

In diesem Abschnitt der Select Case-Anweisung erfolgt in der Regel das Erfassen der Daten für das Listenfeld. Für die Aufbewahrung der Daten gibt es unterschiedliche Möglichkeiten. Dabei kann es sich z. B. um ein Datenfeld oder auch um eine Datensatzgruppe handeln.

Im Folgenden soll zunächst ein Datenfeld verwendet werden. Daher können Sie innerhalb der Select Case-Anweisung die folgenden Zeilen einfügen:

i = 0
Pfad = "c:\"
Set objFSO = New FileSystemObject
For Each objDatei In _    objFSO.GetFolder(Pfad).Files
    Datei(i) = objDatei.Name
    i = i + 1
Next objDatei
Rueckgabewert = i

Nach der Initialisierung des Zählers i legt die Funktion den Pfad fest, aus dem die Dateien eingelesen werden sollen.

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

Schreibe einen Kommentar