Zur Hauptseite ... Zum Onlinearchiv ... Zum Abonnement ... Zum Newsletter ... Zu den Tools ... Zum Impressum ... Zum Login ...

Achtung: Dies ist nicht der vollständige Artikel, sondern nur ein paar Seiten davon. Wenn Sie hier nicht erfahren, was Sie wissen möchten, finden Sie am Ende Informationen darüber, wie Sie den ganzen Artikel lesen können.

Kompletten Artikel lesen?

Einfach für den Newsletter anmelden, dann lesen Sie schon in einer Minute den kompletten Artikel und erhalten die Beispieldatenbanken.

E-Mail:

Gedrucktes Heft

Diesen Beitrag finden Sie in Ausgabe 6/2010.

Unser Angebot für Sie!

Lesen Sie diesen Beitrag und 500 andere sofort im Onlinearchiv, und erhalten Sie alle zwei Monate brandheißes Access-Know-how auf 72 gedruckten Seiten! Plus attraktive Präsente, zum Beispiel das bald erscheinende Buch 'Access 2010 - Das Grundlagenbuch für Entwickler'!

Diesen Beitrag twittern

Zusammenfassung

Erweitern Sie Formulare älterer Access-Versionen und die Runtime-Version um praktische Filter- und Sortierfunktionen.

Techniken

Formulare, VBA, DAO

Voraussetzungen

Access 2000 und höher

Beispieldateien

FilternPerKontextmenue.mdb

Shortlink

www.access-im-unternehmen.de/749

Filtern und sortieren per Kontextmenü

André Minhorst, Duisburg

Eigentlich bieten die Datenblatt- und auch die Formularansicht eine Menge Werkzeuge, mit denen der Benutzer die Daten nach Wunsch filtern oder sortieren kann. Dummerweise stehen diese Möglichkeiten in der Runtime-Version von Access nicht zur Verfügung. Damit Sie auch Benutzer ohne Vollversion mit dem gewohnten Komfort beglücken können, bringen wir Ihren Formularen neue Techniken zum Aufruf von Filtern und Sortierungen bei.

Access bietet vor allem seit Access 2007 sehr praktische Filter- und Sortierfunktionen. So können Sie beispielsweise in der Datenblattansicht auf den kleinen Pfeil im Spaltenkopf klicken, um die Sortier- und Filteroptionen auszuwählen. Das daraufhin erscheinende Popup-Menü zeigt zwei Einträge zum Sortieren der Feldwerte in aufsteigender und absteigender Reihenfolge, die Möglichkeit zur Eingabe eines Textfilters oder auch das Auswählen konkreter Werte, die angezeigt werden sollen - oder auch nicht (s. Abb. 1).

pic001.png

Abb. 1: Filter- und Sortiermöglichkeiten in der Datenblattansicht

Hinweis: Access 2003 und älter bieten nicht so praktische Filter- und Sortiermöglichkeiten, daher gehen wir auf diese hier nicht ein. Unsere Lösung können Sie hingegen auch mit älteren Access-Versionen verwenden - wir werfen nur einen genauen Blick auf die Access 2007/2010-Techniken, um die Anforderungen für die Lösung zu ermitteln.

Sie können Filter und Sortierungen für mehrere Spalten festlegen, wobei diese mit UND verknüpft werden. Damit lassen sich etwa alle Adressen auswählen, deren Vorname mit A und deren Nachname mit B beginnt. Wenn Sie das Popupfenster zum Einstellen von Filter- und Sortierkriterien für eine gefilterte Spalte anzeigen, ist der Eintrag Filter löschen aus <Feldname> aktiviert (s. Abb. 2). Hiermit können Sie einzelne Filter wieder entfernen.

pic003.png

Abb. 2: Löschen einzelner Filter

Alle Filter entfernen Sie mit einem Eintrag im Ribbon, der unter Access 2010 wie in Abb. 3 aussieht.

pic004.png

Abb. 3: Entfernen aller aktiven Filter

Die Filter- und Sortiermöglichkeiten stehen auch in der Formularansicht über das Kontextmenü zur Verfügung (s. Abb. 4).

pic002.png

Abb. 4: Filtern per Kontextmenü in der Formularansicht

Datentypabhängiger Filter

Die Möglichkeiten der Filterfunktion erschließen sich erst, wenn Sie sich einmal die Einträge des Kontextmenüs für verschiedene Datentypen ansehen. Wenn Sie beispielsweise das Kontextmenü für ein Datumsfeld öffnen, können Sie sogar alle Daten eines bestimmten Quartals oder Monats auswählen (s. Abb. 5).

pic005.png

Abb. 5: Umfangreiche Filtermöglichkeiten für Datumsangaben

All diese Möglichkeiten wollen wir beim Nachbau einer solchen Filter- und Sortierfunktion via Kontextmenü natürlich offenhalten.

Spezialfall Runtime

Neben den älteren Access-Versionen, die weniger gut mit Filter- und Sortierfunktionen ausgestattet sind, gibt es mit der Runtime-Version von Access einen weiteren Spezialfall: Die praktischen Helferlein lassen sich dort nur über die Spaltenköpfe in der Datenblattansicht aufrufen, aber nicht über Kontextmenüs.

Der Grund für das Fehlen der Filter- und Sortierfunktionen in Anwendungen, die mit der Access-Runtime geöffnet werden, ist ganz einfach: Microsoft hat dort ganz einfach alle eingebauten Menüs beziehungsweise Ribbons sowie Kontextmenüs rausgeworfen.

Sie können das Verhalten der Runtime für eine beliebige Datenbankanwendung folgendermaßen nachstellen:

  • Access 2003 und älter: Öffnen Sie die Datenbank mit einer Verknüpfung wie c:\Programme\Microsoft Office\Office<Version>\MSAccess.exe <Pfad zur Datenbank> /runtime.
  • Access 2007 und jünger: Ändern Sie einfach die Dateiendung auf .accdr und öffnen Sie die Datenbank.

Filter nachrüsten

Da Sie wahrscheinlich nicht alle Daten ausschließlich in Formularen in der Datenblattansicht anzeigen möchten, müssen Sie Anwendungen, die als Runtime-Version weitergegeben werden sollen, mit eigenen Filterfunktionen ausrüsten - zumindest dort, wo keine Datenblattansicht vorliegt.

Wir beginnen mit zwei Einträgen in das Kontextmenü, die das auf- und absteigende Sortieren des jeweiligen Feldes erlauben. Bevor wir damit beginnen, sind jedoch einige Überlegungen notwendig:

  • Sollen ein oder mehrere Felder sortiert werden können?
  • Falls wir mehrere Felder sortieren, in welcher Reihenfolge wird sortiert? Verwenden wir die Aktivierreihenfolge, oder soll die Reihenfolge beliebig einstellbar sein?
  • Wie wird das Sortierkriterium nach der Zusammenstellung angewendet?

Die Sortierung nach nur einem Feld wäre am einfachsten und dürfte in der Praxis auch für die meinsten Fälle ausreichend sein. Jedoch kann es durchaus auch vorkommen, dass der Benutzer nach mehr als einem Kriterium sortieren möchte.

In dem Fall müssen wir uns überlegen, in welcher Reihenfolge der Felder die Sortierungg erfolgen. Bei der eingebauten Sortierfunktion wird das jeweils neueste Sortierkriterium vorne an den OrderBy-Ausdruck angehängt. Wenn Sie also zunächst eine aufsteigende Sortierung nach dem Vornamen anwenden, hat die OrderBy-Eigenschaft des Formulars den folgenden Wert:

[tblAdressen].[Vorname]

Wenn Sie anschließend eine absteigende Sortierung nach dem Nachnamen festlegen, sieht der Ausdruck so aus:

[tblAdressen].[Nachname] DESC, [tblAdressen].[Vorname]

Die Reihenfolge ist insofern wichtig, als dass immer zuerste nach dem erstgenannten Feld sortiert wird und erst dann nach den folgenden Feldern. Das heißt, dass sich die hinteren Sortierkriterien nur noch auswirken, wenn die vorderen Felder gleiche Inhalte aufweisen, die in der Sortierreihenfolge gleichrangig sind.

Übernehmen wir also dieser Vorgehensweise und stellen das Sortierkriterium so zusammen, dass die zuletzt hinzugefügte Sortierung die höchste Priorität erhält.

Wer genau beobachtet, stellt übrigens fest, dass die Standardfunktion zum Hinzufügen von Sortierkriterien nicht das Entfernen einzelner Sortierkriterien erlaubt - dies funktioniert nur für die komplette Sortierung. Dieses Feature werden wir natürlich noch hinzufügen.

Unser Kontextmenü sollte also die folgenden Einträge enthalten:

  • Aufsteigende Sortierung hinzufügen
  • Absteigende Sortierung hinzufügen
  • Sortierung für dieses Feld entfernen
  • Sortierung für alle Felder entfernen (da diese Funktion in der Runtime gar nicht greifbar ist)

Hinzufügen der Kontextmenüeinträge

Als Nächstes kümmern wir uns um die Erstellung der Kontextmenüeinträge. Diese können wir entweder dauerhaft speichern oder zur Laufzeit zusammenstellen. Da Sie wie der Autor dieser Zeilen nach der Lektüre zahlloser Beiträge zu diesem Thema in der dynamischen Erstellung von Kontextmenüs bewandert sein dürften, wählen wie diese Variante.

Die Funktionen zum Sortieren der Datensätze ist die einfachere, sie dürfte vor allem in Datenblatt- und Endlosansichten Verwendung finden. Die hier vorgestellte Lösung kann in Haupt- und Unterformularen und auch in modalen Dialogen eingesetzt werden.

Erstellen der Kontextmenüs

Unser erstes Ziel ist das Erstellen eines Kontextmenüs wie in Abb. 6. Der kleine Haken ist, dass wir je nach Datentyp des Feldes unterschiedliche Texte anzeigen wollen. Damit möchten wir auch Benutzer einfangen, die sonst wenig bis gar nicht mit Datenbankanwendungen arbeiten.

pic006.png

Abb. 6: Kontextmenü zum Sortieren eines Textfeldes

Für ein Textfeld lautet der Text zum Anwenden einer aufsteigenden Sortierung beispielsweise Von A bis Z sortieren und umgekehrt Von Z bis A sortieren, bei Datumsfeldern soll es Von früheren zu späteren Daten sortieren und Von späteren zu früheren Daten sortieren und so weiter.

Ablauf der Erstellung

Die Erstellung eines Kontextemenüs beginnt mit dem Laden des Formulars, dessen Steuerelemente mit den Sortier-Funktionen gefüllt werden sollen. Die komplette Funktionalität dafür steckt in zwei Klassenmodulen namens clsSortAndFilter und clsSortAndFilterControl.

Für den Einbau der Sortierfunktion brauchen Sie nur wenige Zeilen zum betroffenen Formular hinzuzufügen. Die erste deklariert ein Objekt auf Basis der Klasse clsSortAndFilter und landet im Kopf des Formularmoduls:

Dim objSortAndFilter As clsSortAndFilter

Danach legen Sie eine Ereignisprozedur an, die durch das Ereignis Beim Laden des Formulars ausgelöst wird. Beachten Sie, dass Sie bei Verwendung eines Unterformulars auch dort die Beim Laden-Ereignisprozedur anlegen müssen.

Diese Prozedur erstellt lediglich eine neue Instanz der Klasse clsSortAndFilter und weist sie der frisch deklarierten Objektvariablen zu. Außerdem verwendet es die Eigenschaft Form dieser Klasse, um einen Verweis auf das mit Sortiermenüs zu bestückende Formular zu übergeben:

Private Sub Form_Load()

    Set objSortAndFilter = New clsSortAndFilter

    With objSortAndFilter

    Set .Form = Me

    End With

End Sub

Steuerelemente mit Kontextmenüs versehen

Das Zuweisen des Formularverweises an die Eigenschaft Form löst die Property Get-Methode aus Listing 1 aus.

Listing 1: Diese Property Set-Methode ist die Steuerzentrale für das Anlegen der Sortier-Kontextmenüs.

Public Property Set Form(frm As Form)

    Dim ctl As Control

    Dim strControlSource As String

    Dim db As DAO.Database

    Dim rst As DAO.Recordset

    Dim fld As DAO.Field

    Set m_Form = frm

    Set colOrderBy = New Collection

    Set colCommandbarButtons = New Collection

    Set db = CurrentDb

    Set rst = db.OpenRecordset(m_Form.RecordSource, dbOpenDynaset)

    For Each ctl In m_Form.Controls

        strControlSource = ""

        On Error Resume Next

        strControlSource = ctl.ControlSource

        On Error GoTo 0

        If Len(strControlSource) > 0 Then

            'Datentyp des Feldes herausfinden

            Set fld = rst.Fields(strControlSource)

            Select Case fld.Type

                'Zahlentypen

                Case dbBigInt, dbByte, dbCurrency, dbDecimal, dbDouble, dbFloat, dbInteger, _

                        dbLong, dbNumeric, dbSingle

                    CreateSortBar "Aufsteigend sortieren", "Absteigend sortieren", "cbrNumber"

                    ctl.ShortcutMenuBar = "cbrNumber"

                'Text

                Case dbChar, dbText, dbMemo, dbGUID

                    CreateSortBar "Von A bis Z sortieren", "Von Z bis A sortieren", "cbrText"

Sie haben das Ende des frei verfügbaren Teils des Artikels erreicht. Lesen Sie weiter, um zu erfahren, wie Sie den vollständigen Artikel lesen und auf viele hundert weitere Artikel zugreifen können.

Sind Sie Abonnent?Jetzt einloggen ...
 

Kompletten Artikel lesen?

Einfach für den Newsletter anmelden, dann lesen Sie schon in einer Minute den kompletten Artikel und erhalten die Beispieldatenbanken.

E-Mail:

© 2003-2015 André Minhorst Alle Rechte vorbehalten.