Sortieren und Filtern von Listenfeldern

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

André Minhorst, Duisburg

Die meisten Windows-Anwendungen bieten komfortable Möglichkeiten, wenn es um die Sortierung von Listen geht. Der Windows Explorer verfügt beispielsweise über je ein Feld oberhalb jeder Spalte, mit dem Sie die Sortierung der gewünschten Spalte einstellen können. Listenfelder in Access haben keine solche Eigenschaft und sind diesbezüglich recht unkomfortabel. Im vorliegenden Beitrag erfahren Sie, wie Sie nicht nur komfortabel sortieren, sondern auch noch filtern können.

Listenfelder dienen der übersichtlichen Anzeige von Daten aus einer oder mehreren Tabellen. Die übersicht geht aber beizeiten verloren – beispielsweise, wenn die Anzahl der Datensätze so groß ist, dass die Höhe des Listenfeldes zur gleichzeitigen Anzeige aller Datensätze nicht ausreicht.

Auch die fehlende Sortierung kann zu einem Problem werden – vor allem in Kombination mit größeren Datenmengen. Damit sind auch bereits die Gegenmittel gefunden: Sortieren und Filtern. Bleibt die Frage, wie die Funktionalität zu realisieren ist.

Im Windows Explorer finden Sie z. B. geeignete Steuerelemente zum Sortieren der unterschiedlichen Felder in aufsteigender und absteigender Reihenfolge in der Kopfzeile der Liste (siehe Bild 1).

Bild 1: Sortierung im Windows Explorer

Durch einen Klick auf eine der überschriften können Sie erstens das Feld auswählen, nach dessen Inhalt sortiert werden soll, und zweitens die Richtung der Sortierung festlegen.

Daten sortieren

Die Sortierung von Daten kann z. B. nach dem Alphabet oder nach Zahlenwerten erfolgen -technisch handelt es sich dabei um den gleichen Vorgang. Sortierungen erfolgen nämlich in der Regel nach dem Zahlenwert der Anfangsbuchstaben, der in einer ASCII-Tabelle festgelegt ist.

Es kann in zwei Richtungen sortiert werden – aufwärts und abwärts. Da die Sortierung später per SQL durchgeführt wird, sind hier schon einmal die entsprechenden Schlüsselwörter:

ORDER BY <Feldname> ASC

sortiert eine Tabelle aufsteigend nach einem Wert, während

ORDER BY <Feldname> DESC

nach dem gleichen Wert in absteigender Reihenfolge sortiert.

Wenn Sie nach mehreren Werten sortieren möchten, können Sie die weiteren Feldnamen gefolgt von dem jeweiligen Schlüsselwort – also DESC oder ASC – durch Komma getrennt anhängen. Die Sortierung erfolgt dabei in der Reihenfolge der Angabe der Sortierkriterien.

Bild 2: Beispiel eines Listenfeldes mit Sortier- und Filterfunktion

Bild 3: Datenherkunft des Listenfeldes

Bild 4: Eigenschaften des Listenfeldes

Daten filtern

Das Filtern von Daten kann die Menge der angezeigten Daten in den meisten Fällen soweit einschränken, dass die Anzahl der betroffenen Datensätze überschaubar wird.

Das wird umso einfacher, wenn Sie nach mehreren Feldern gleichzeitig filtern können.

Die Aufgabenverwaltung aus dem Beitrag Aufgabenverwaltung mit Access in der vorliegenden Ausgabe von Access im Unternehmen bietet ein geeignetes Listenfeld zur Demonstration effektiven Filterns und Sortierens (siehe Bild 2).

Allerdings ist der Aufbau des dortigen Listenfeldes relativ umfangreich, sodass die Funktionalität für den Einstieg an einem einfacheren Beispiel erläutert werden soll.

Hinweis

Als Beispieldaten halten – wie so oft – die Tabellen der Nordwind-Datenbank her. Zum Nachvollziehen der nachfolgenden Beispiele erstellen Sie am besten eine neue Datenbank und importieren die Tabellen Artikel, Kategorien und Lieferanten.

Das FormularfrmArtikeluebersicht

Anschließend legen Sie ein neues Formular namens frmArtikeluebersicht an. Fügen Sie dem Formular ein neues Listenfeld hinzu und geben Sie ihm den Namen lstArtikel.

Erstellen Sie als Datensatzherkunft des Listenfeldes eine neue Abfrage namens qryArtikelMitDetailinformationen. Den Aufbau der Abfrage können Sie Bild 3 entnehmen.

Füllen des Listenfeldes

Anschließend weisen Sie den Namen der neuen Abfrage der Eigenschaft Datensatzherkunft des Listenfeldes hinzu.

Bild 5: Formularansicht des Formulars frmArtikeluebersicht

Private Sub txtAufgabeFilter_AfterUpdate()
    FilterUndSortierung
End Sub

Quellcode 1

Stellen Sie anschließend die Eigenschaften Spaltenanzahl und Spaltenbreiten so ein, dass alle gewünschten Informationen in der richtigen Breite angezeigt werden (siehe Bild 4).

Die Formularansicht sollte schließlich wie in Bild 5 aussehen.

Das Filtern der Listenfelder soll nach Kriterien erfolgen, die Sie mit entsprechenden Text- oder Kombinationsfeldern eingeben bzw. auswählen.

Nachdem Sie das Listenfeld erstellt, die Datensatzherkunft des Listenfeldes zugewiesen und die Spaltenbreiten justiert haben, legen Sie die gewünschten Steuerelemente oberhalb der entsprechenden Spalten an – natürlich in der gleichen Breite wie die Spaltenbreite des Listenfeldes.

Praxis-Tipp

Eine gute Hilfe beim Ausrichten und dem Einstellen der Steuerelementbreite ist die Eigenschaft Spaltenbreiten des Listenfeldes (siehe Bild 4). Aufgrund der hier angegebenen Zahlen können Sie die Position und die Breite der Steuerelemente sehr genau festlegen.

Je nach der Beschaffenheit des Inhalts einer Spalte des Listenfeldes werden Sie entweder ein Textfeld oder ein Kombinationsfeld zum Setzen des Filterwertes verwenden.

Bei Text- oder Memofeldern verwenden Sie in jedem Fall ein Textfeld, während Sie bei Feldern, deren Inhalt nicht in der eigentlichen, sondern einer verknüpften Tabelle gespeichert ist, vermutlich auch ein Kombinationsfeld verwenden.

Dieses Kombinationsfeld zeigt dann alle Werte der verknüpften Tabelle als Filteroptionen an. Wenn Sie Textfelder als Filteroption verwenden, können Sie natürlich auf Platzhalter wie Fragezeichen () oder Sternchen (*) zurückgreifen.

Filtern per Textfeld

Wenn Sie per Textfeld filtern, müssen Sie – was die Benutzeroberfläche angeht – nur das entsprechende Textfeld über der gewünschten Spalte platzieren und den Wert seiner Eigenschaft Name eingeben, da das Feld später vom Code aus angesprochen werden muss.

Im vorliegenden Beispiel soll zunächst nach dem Feld Artikel gefiltert werden. Nennen Sie das Textfeld zur Eingabe des Filterkriteriums daher txtArtikelFilter.

Nun müssen Sie für die Ereigniseigenschaft Nach Aktualisierung eine Prozedur hinterlegen, die den Filtervorgang in Gang setzt (s. Quellcode 1). Das Ereignis Nach Aktualisierung wird nach der änderung des Textfeldinhalts ausgelöst.

Die Prozedur FilterUndSortierung führt anschließend den Filtervorgang aus, indem sie die Datensatzherkunft des Listenfeldes anpasst (s. Quellcode 2).

Die Prozedur bildet zunächst den Grundstein für die neue Datensatzherkunft des Listenfeldes und speichert es anschließend in der Variablen strSQLFilter.

Sub FilterUndSortierung()
    Dim strSQL As String
    Dim strSQLFilter As String
    Dim strSQLSort As String
    strSQL = "SELECT * FROM qryArtikelMitDetailinformationen"
    If Len(Me.txtArtikelFilter) > 0 Then
        strSQLFilter = strSQLFilter & ", Artikelname LIKE ''" & Me.txtArtikelFilter _            & "''"
    End If
    ''Hier weitere Filterkriterien eintragen
    If Len(strSQLFilter) > 0 Then
        strSQL = strSQL & " WHERE " & Mid(strSQLFilter, 2, Len(strSQLFilter) - 1)
    End If
    ''Hier Sortierkriterien eintragen
    Me.lstArtikeluebersicht.RowSource = strSQL
End Sub

Quellcode 2

Anschließend überprüft sie, ob das Textfeld mit dem Ausdruck, nach dem gefiltert werden soll, gefüllt ist. Falls ja, wird ein entsprechender Ausdruck an die Zeichenkette strSQLFilter angehängt. Falls das Textfeld keinen Inhalt hat, ist die neue Datensatzherkunft gleich der alten.

Schließlich hängt die Prozedur die Zeichenkette strSQLFilter – soweit sie nicht leer ist – der bereits bestehenden Zeichenkette strSQL mit einem vorangestellten WHERE an.

Filtern per Kombinationsfeld

Die Felder Kategorie und Lieferant beziehen ihre Werte aus den verknüpften Tabellen tblKategorien und tblLieferanten. Da die Werte also ohnehin aus einer festen Menge von Werten stammen, können Sie statt eines Textfeldes auch ein Kombinationsfeld für die Filterung bereitstellen. Der Benutzer kann den gesuchten Wert dann bequem aus dem Kombinationsfeld auswählen.

Legen Sie also z. B. über der Spalte mit den Lieferanten ein neues Kombinationsfeld an.

Geben Sie als Namen des Kombinationsfeldes cboLieferantenFilter an und verwenden Sie den folgenden Ausdruck als Datensatzherkunft:

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