{"id":55000749,"date":"2010-12-01T00:00:00","date_gmt":"2020-05-22T22:08:24","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=749"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"Filtern_und_sortieren_per_Kontextmenue","status":"publish","type":"post","link":"https:\/\/access-im-unternehmen.de\/Filtern_und_sortieren_per_Kontextmenue\/","title":{"rendered":"Filtern und sortieren per Kontextmen&uuml;"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/vg09.met.vgwort.de\/na\/855a933a0adf47f68f4777b9a719d81d\" width=\"1\" height=\"1\" alt=\"\"><\/p>\n<p><b>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&ouml;glichkeiten in der Runtime-Version von Access nicht zur Verf&uuml;gung. Damit Sie auch Benutzer ohne Vollversion mit dem gewohnten Komfort begl&uuml;cken k&ouml;nnen, bringen wir Ihren Formularen neue Techniken zum Aufruf von Filtern und Sortierungen bei.<\/b><\/p>\n<p>Access bietet vor allem seit Access 2007 sehr praktische Filter- und Sortierfunktionen. So k&ouml;nnen Sie beispielsweise in der Datenblattansicht auf den kleinen Pfeil im Spaltenkopf klicken, um die Sortier- und Filteroptionen auszuw&auml;hlen. Das daraufhin erscheinende Popup-Men&uuml; zeigt zwei Eintr&auml;ge zum Sortieren der Feldwerte in aufsteigender und absteigender Reihenfolge, die M&ouml;glichkeit zur Eingabe eines Textfilters oder auch das Ausw&auml;hlen konkreter Werte, die angezeigt werden sollen &#8211; oder auch nicht (s. Bild 1).<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2010_06\/FilterPerKontextmenue-web-images\/pic001.png\" alt=\"pic001.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 1: Filter- und Sortierm&ouml;glichkeiten in der Datenblattansicht<\/span><\/b><\/p>\n<p>Hinweis: Access 2003 und &auml;lter bieten nicht so praktische Filter- und Sortierm&ouml;glichkeiten, daher gehen wir auf diese hier nicht ein. Unsere L&ouml;sung k&ouml;nnen Sie hingegen auch mit &auml;lteren Access-Versionen verwenden &#8211; wir werfen nur einen genauen Blick auf die Access 2007\/2010-Techniken, um die Anforderungen f&uuml;r die L&ouml;sung zu ermitteln.<\/p>\n<p>Sie k&ouml;nnen Filter und Sortierungen f&uuml;r mehrere Spalten festlegen, wobei diese mit <b>UND <\/b>verkn&uuml;pft werden. Damit lassen sich etwa alle Adressen ausw&auml;hlen, deren Vorname mit <b>A <\/b>und deren Nachname mit <b>B <\/b>beginnt. Wenn Sie das Popupfenster zum Einstellen von Filter- und Sortierkriterien f&uuml;r eine gefilterte Spalte anzeigen, ist der Eintrag <b>Filter l&ouml;schen aus &lt;Feldname&gt; <\/b>aktiviert (s. Bild 2). Hiermit k&ouml;nnen Sie einzelne Filter wieder entfernen.<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2010_06\/FilterPerKontextmenue-web-images\/pic003.png\" alt=\"pic003.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 2: L&ouml;schen einzelner Filter<\/span><\/b><\/p>\n<p>Alle Filter entfernen Sie mit einem Eintrag im Ribbon, der unter Access 2010 wie in Bild 3 aussieht.<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2010_06\/FilterPerKontextmenue-web-images\/pic004.png\" alt=\"pic004.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 3: Entfernen aller aktiven Filter<\/span><\/b><\/p>\n<p>Die Filter- und Sortierm&ouml;glichkeiten stehen auch in der Formularansicht &uuml;ber das Kontextmen&uuml; zur Verf&uuml;gung (s. Bild 4).<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2010_06\/FilterPerKontextmenue-web-images\/pic002.png\" alt=\"pic002.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 4: Filtern per Kontextmen&uuml; in der Formularansicht<\/span><\/b><\/p>\n<p><b>Datentypabh&auml;ngiger Filter<\/b><\/p>\n<p>Die M&ouml;glichkeiten der Filterfunktion erschlie&szlig;en sich erst, wenn Sie sich einmal die Eintr&auml;ge des Kontextmen&uuml;s f&uuml;r verschiedene Datentypen ansehen. Wenn Sie beispielsweise das Kontextmen&uuml; f&uuml;r ein Datumsfeld &ouml;ffnen, k&ouml;nnen Sie sogar alle Daten eines bestimmten Quartals oder Monats ausw&auml;hlen (s. Bild 5).<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2010_06\/FilterPerKontextmenue-web-images\/pic005.png\" alt=\"pic005.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 5: Umfangreiche Filterm&ouml;glichkeiten f&uuml;r Datumsangaben<\/span><\/b><\/p>\n<p>All diese M&ouml;glichkeiten wollen wir beim Nachbau einer solchen Filter- und Sortierfunktion via Kontextmen&uuml; nat&uuml;rlich offenhalten.<\/p>\n<p><b>Spezialfall Runtime<\/b><\/p>\n<p>Neben den &auml;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 &uuml;ber die Spaltenk&ouml;pfe in der Datenblattansicht aufrufen, aber nicht &uuml;ber Kontextmen&uuml;s.<\/p>\n<p>Der Grund f&uuml;r das Fehlen der Filter- und Sortierfunktionen in Anwendungen, die mit der Access-Runtime ge&ouml;ffnet werden, ist ganz einfach: Microsoft hat dort ganz einfach alle eingebauten Men&uuml;s beziehungsweise Ribbons sowie Kontextmen&uuml;s rausgeworfen.<\/p>\n<p>Sie k&ouml;nnen das Verhalten der Runtime f&uuml;r eine beliebige Datenbankanwendung folgenderma&szlig;en nachstellen:<\/p>\n<ul>\n<li class=\"aufz-hlung\">Access 2003 und &auml;lter: &Ouml;ffnen Sie die Datenbank mit einer Verkn&uuml;pfung wie <b>c:\\Programme\\Microsoft Office\\Office&lt;Version&gt;\\MSAccess.exe &lt;Pfad zur Datenbank&gt; \/runtime<\/b>.<\/li>\n<li class=\"aufz-hlung\">Access 2007 und j&uuml;nger: &auml;ndern Sie einfach die Dateiendung auf <b>.accdr <\/b>und &ouml;ffnen Sie die Datenbank.<\/li>\n<\/ul>\n<p><b>Filter nachr&uuml;sten<\/b><\/p>\n<p>Da Sie wahrscheinlich nicht alle Daten ausschlie&szlig;lich in Formularen in der Datenblattansicht anzeigen m&ouml;chten, m&uuml;ssen Sie Anwendungen, die als Runtime-Version weitergegeben werden sollen, mit eigenen Filterfunktionen ausr&uuml;sten &#8211; zumindest dort, wo keine Datenblattansicht vorliegt.<\/p>\n<p>Wir beginnen mit zwei Eintr&auml;gen in das Kontextmen&uuml;, die das auf- und absteigende Sortieren des jeweiligen Feldes erlauben. Bevor wir damit beginnen, sind jedoch einige &Uuml;berlegungen notwendig:<\/p>\n<ul>\n<li class=\"aufz-hlung\">Sollen ein oder mehrere Felder sortiert werden k&ouml;nnen<\/li>\n<li class=\"aufz-hlung\">Falls wir mehrere Felder sortieren, in welcher Reihenfolge wird sortiert Verwenden wir die Aktivierreihenfolge, oder soll die Reihenfolge beliebig einstellbar sein<\/li>\n<li class=\"aufz-hlung\">Wie wird das Sortierkriterium nach der Zusammenstellung angewendet<\/li>\n<\/ul>\n<p>Die Sortierung nach nur einem Feld w&auml;re am einfachsten und d&uuml;rfte in der Praxis auch f&uuml;r die meinsten F&auml;lle ausreichend sein. Jedoch kann es durchaus auch vorkommen, dass der Benutzer nach mehr als einem Kriterium sortieren m&ouml;chte.<\/p>\n<p>In dem Fall m&uuml;ssen wir uns &uuml;berlegen, in welcher Reihenfolge der Felder die Sortierungg erfolgen. Bei der eingebauten Sortierfunktion wird das jeweils neueste Sortierkriterium vorne an den <b>OrderBy<\/b>-Ausdruck angeh&auml;ngt. Wenn Sie also zun&auml;chst eine aufsteigende Sortierung nach dem Vornamen anwenden, hat die OrderBy-Eigenschaft des Formulars den folgenden Wert:<\/p>\n<pre>[tblAdressen].[Vorname]<\/pre>\n<p>Wenn Sie anschlie&szlig;end eine absteigende Sortierung nach dem Nachnamen festlegen, sieht der Ausdruck so aus:<\/p>\n<pre>[tblAdressen].[Nachname] DESC, [tblAdressen].[Vorname]<\/pre>\n<p>Die Reihenfolge ist insofern wichtig, als dass immer zuerste nach dem erstgenannten Feld sortiert wird und erst dann nach den folgenden Feldern. Das hei&szlig;t, dass sich die hinteren Sortierkriterien nur noch auswirken, wenn die vorderen Felder gleiche Inhalte aufweisen, die in der Sortierreihenfolge gleichrangig sind.<\/p>\n<p>&Uuml;bernehmen wir also dieser Vorgehensweise und stellen das Sortierkriterium so zusammen, dass die zuletzt hinzugef&uuml;gte Sortierung die h&ouml;chste Priorit&auml;t erh&auml;lt.<\/p>\n<p>Wer genau beobachtet, stellt &uuml;brigens fest, dass die Standardfunktion zum Hinzuf&uuml;gen von Sortierkriterien nicht das Entfernen einzelner Sortierkriterien erlaubt &#8211; dies funktioniert nur f&uuml;r die komplette Sortierung. Dieses Feature werden wir nat&uuml;rlich noch hinzuf&uuml;gen.<\/p>\n<p>Unser Kontextmen&uuml; sollte also die folgenden Eintr&auml;ge enthalten:<\/p>\n<ul>\n<li class=\"aufz-hlung\">Aufsteigende Sortierung hinzuf&uuml;gen<\/li>\n<li class=\"aufz-hlung\">Absteigende Sortierung hinzuf&uuml;gen<\/li>\n<li class=\"aufz-hlung\">Sortierung f&uuml;r dieses Feld entfernen<\/li>\n<li class=\"aufz-hlung\">Sortierung f&uuml;r alle Felder entfernen (da diese Funktion in der Runtime gar nicht greifbar ist)<\/li>\n<\/ul>\n<p><b>Hinzuf&uuml;gen der Kontextmen&uuml;eintr&auml;ge<\/b><\/p>\n<p>Als N&auml;chstes k&uuml;mmern wir uns um die Erstellung der Kontextmen&uuml;eintr&auml;ge. Diese k&ouml;nnen wir entweder dauerhaft speichern oder zur Laufzeit zusammenstellen. Da Sie wie der Autor dieser Zeilen nach der Lekt&uuml;re zahlloser Beitr&auml;ge zu diesem Thema in der dynamischen Erstellung von Kontextmen&uuml;s bewandert sein d&uuml;rften, w&auml;hlen wie diese Variante.<\/p>\n<p>Die Funktionen zum Sortieren der Datens&auml;tze ist die einfachere, sie d&uuml;rfte vor allem in Datenblatt- und Endlosansichten Verwendung finden. Die hier vorgestellte L&ouml;sung kann in Haupt- und Unterformularen und auch in modalen Dialogen eingesetzt werden.<\/p>\n<p><b>Erstellen der Kontextmen&uuml;s<\/b><\/p>\n<p>Unser erstes Ziel ist das Erstellen eines Kontextmen&uuml;s wie in Bild 6. Der kleine Haken ist, dass wir je nach Datentyp des Feldes unterschiedliche Texte anzeigen wollen. Damit m&ouml;chten wir auch Benutzer einfangen, die sonst wenig bis gar nicht mit Datenbankanwendungen arbeiten.<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2010_06\/FilterPerKontextmenue-web-images\/pic006.png\" alt=\"pic006.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 6: Kontextmen&uuml; zum Sortieren eines Textfeldes<\/span><\/b><\/p>\n<p>F&uuml;r ein Textfeld lautet der Text zum Anwenden einer aufsteigenden Sortierung beispielsweise <b>Von A bis Z sortieren <\/b>und umgekehrt <b>Von Z bis A sortieren<\/b>, bei Datumsfeldern soll es <b>Von fr&uuml;heren zu sp&auml;teren Daten sortieren <\/b>und <b>Von sp&auml;teren zu fr&uuml;heren Daten sortieren<\/b> und so weiter.<\/p>\n<p><b>Ablauf der Erstellung<\/b><\/p>\n<p>Die Erstellung eines Kontextemen&uuml;s beginnt mit dem Laden des Formulars, dessen Steuerelemente mit den Sortier-Funktionen gef&uuml;llt werden sollen. Die komplette Funktionalit&auml;t daf&uuml;r steckt in zwei Klassenmodulen namens <b>clsSortAndFilter <\/b>und <b>clsSortAndFilterControl<\/b>.<\/p>\n<p>F&uuml;r den Einbau der Sortierfunktion brauchen Sie nur wenige Zeilen zum betroffenen Formular hinzuzuf&uuml;gen. Die erste deklariert ein Objekt auf Basis der Klasse <b>clsSortAndFilter <\/b>und landet im Kopf des Formularmoduls:<\/p>\n<pre>Dim objSortAndFilter As clsSortAndFilter<\/pre>\n<p>Danach legen Sie eine Ereignisprozedur an, die durch das Ereignis <b>Beim Laden <\/b>des Formulars ausgel&ouml;st wird. Beachten Sie, dass Sie bei Verwendung eines Unterformulars auch dort die <b>Beim Laden<\/b>-Ereignisprozedur anlegen m&uuml;ssen.<\/p>\n<p>Diese Prozedur erstellt lediglich eine neue Instanz der Klasse <b>clsSortAndFilter<\/b> und weist sie der frisch deklarierten Objektvariablen zu. Au&szlig;erdem verwendet es die Eigenschaft <b>Form<\/b> dieser Klasse, um einen Verweis auf das mit Sortiermen&uuml;s zu best&uuml;ckende Formular zu &uuml;bergeben:<\/p>\n<pre>Private Sub Form_Load()\r\n    Set objSortAndFilter = New clsSortAndFilter\r\n    With objSortAndFilter\r\n    Set .Form = Me\r\n    End With\r\nEnd Sub<\/pre>\n<p><b>Steuerelemente mit Kontextmen&uuml;s versehen<\/b><\/p>\n<p>Das Zuweisen des Formularverweises an die Eigenschaft <b>Form <\/b>l&ouml;st die <b>Property Get<\/b>-Methode aus <span class=\"verweis-ohneumbruch\"><a href=\"#anker-23-anchor\">Listing 1<\/a><\/span> aus.<\/p>\n<p class=\"listingueberschrift\">Listing 1: Diese Property Set-Methode ist die Steuerzentrale f&uuml;r das Anlegen der Sortier-Kontextmen&uuml;s.<\/p>\n<pre>Public Property Set Form(frm As Form)\r\n    Dim ctl As Control\r\n    Dim strControlSource As String\r\n    Dim db As DAO.Database\r\n    Dim rst As DAO.Recordset\r\n    Dim fld As DAO.Field\r\n    Set m_Form = frm\r\n    Set colOrderBy = New Collection\r\n    Set colCommandbarButtons = New Collection\r\n    Set db = CurrentDb\r\n    Set rst = db.OpenRecordset(m_Form.RecordSource, dbOpenDynaset)\r\n    For Each ctl In m_Form.Controls\r\n         strControlSource = &quot;&quot;\r\n        On Error Resume Next\r\n        strControlSource = ctl.ControlSource\r\n        On Error GoTo 0\r\n        If Len(strControlSource) &gt; 0 Then\r\n            ''Datentyp des Feldes herausfinden\r\n            Set fld = rst.Fields(strControlSource)\r\n            Select Case fld.Type\r\n                ''Zahlentypen\r\n                Case dbBigInt, dbByte, dbCurrency, dbDecimal, dbDouble, dbFloat, dbInteger, _\r\n                        dbLong, dbNumeric, dbSingle\r\n                    CreateSortBar &quot;Aufsteigend sortieren&quot;, &quot;Absteigend sortieren&quot;, &quot;cbrNumber&quot;\r\n                    ctl.ShortcutMenuBar = &quot;cbrNumber&quot;\r\n                ''Text\r\n                Case dbChar, dbText, dbMemo, dbGUID\r\n                    CreateSortBar &quot;Von A bis Z sortieren&quot;, &quot;Von Z bis A sortieren&quot;, &quot;cbrText&quot;\r\n                    ctl.ShortcutMenuBar = &quot;cbrText&quot;\r\n                ''Datum\r\n                Case dbDate, dbTime, dbTimeStamp\r\n                    CreateSortBar &quot;Von fr&uuml;heren zu sp&auml;teren Daten sortieren&quot;, _\r\n                    &quot;Von sp&auml;teren zu fr&uuml;heren Daten sortieren&quot;, &quot;cbrDate&quot;\r\n                    ctl.ShortcutMenuBar = &quot;cbrDate&quot;\r\n                ''Boolean\r\n                Case dbBoolean\r\n                    CreateSortBar &quot;Von Ja nach Nein sortieren&quot;, &quot;Von Nein nach Ja sortieren&quot;, &quot;cbrBoolean&quot;\r\n                    ctl.ShortcutMenuBar = &quot;cbrBoolean&quot;\r\n                Case Else\r\n                    Debug.Print fld.Name, fld.Type\r\n            End Select\r\n        End If\r\n    Next ctl\r\nEnd Property<\/pre>\n<p><!--30percent--><\/p>\n<p> Diese schreibt zun&auml;chst den Objektverweis in die private Variable m_Form, die im Kopf des Klassenmoduls wie folgt deklariert wird:<\/p>\n<pre>Private m_Form As Form<\/pre>\n<p>Dann erzeugt sie neue Instanzen der folgenden <b>Collection<\/b>-Objekte, deren Funktion wir gleich im Anschluss erl&auml;utern:<\/p>\n<pre>Public colOrderBy As Collection\r\nPublic colCommandbarButtons As Collection<\/pre>\n<p>Um sp&auml;ter den Datentyp des Feldes zu untersuchen, an welches das aktuell untersuchte Steuerelement gebunden ist, erstellt die Prozedur ein neues <b>Recordset<\/b>-Objekt und f&uuml;llt es mit den gleichen Daten, die auch das Formular enth&auml;lt.<\/p>\n<p>Danach durchl&auml;uft die Prozedur im Wesentlichen in einer <b>For Each<\/b>-Schleife alle Steuerelemente des Formulars auf <b>m_Form<\/b>. Das aktuelle Steuerelement wird dabei jeweils in der Variablen <b>ctl <\/b>gespeichert und genauer untersucht. Diese Untersuchung konzentriert sich darauf, ob das Steuerelement gebunden oder ungebunden ist. Dies findet die Prozedur &uuml;ber die Eigenschaft <b>ControlSource <\/b>heraus, die nur bei gebundenen Steuerelementen mit dem Namen des Herkunftsfeldes gef&uuml;llt ist.<\/p>\n<p>Da diese Eigenschaft nur bei bestimmten Steuerelementtypen vorhanden ist und die Abfrage der Eigenschaft einen Fehler ausl&ouml;st, wenn sie nicht vorhanden ist, wird die Fehlerbehandlung f&uuml;r diese Abfrage au&szlig;er Kraft gesetzt. Die Prozedur leert also die Variable <b>strControlSource <\/b>und versucht sie dann mit dem Namen der Eigenschaft <b>ControlSource <\/b>(im Eigenschaftsfenster <b>Steuerelementinhalt<\/b>) zu f&uuml;llen. Wenn die Variable nach diesem Versuch noch leer ist, ist das Steuerelement offensichtlich ungebunden und wird nicht mit einem Kontextmen&uuml; versehen. Anderenfalls wird das Steuerelement innerhalb einer <b>If&#8230;Then<\/b>-Bedingung genauer untersucht.<\/p>\n<p>Dort kommt das vor Beginn der <b>For Each<\/b>-Schleife erzeugte und gef&uuml;llte <b>Recordset<\/b>-Objekt rst zum Zuge: Die Prozedur ermittelt dort das Feld, an welches das aktuelle Steuerelement gebunden ist, und speichert einen Verweis darauf in der Objektvariablen <b>fld<\/b>. Die folgende <b>Select Case<\/b>-Bedingung pr&uuml;ft daraufhin &uuml;ber die Eigenschaft <b>Type <\/b>den den Datentyp des Feldes und setzt die Prozedur in einem von vier Zweigen fort: f&uuml;r Zahlen, Texte, Datumsangaben und <b>Ja\/Nein<\/b>-Felder.<\/p>\n<p>Innerhalb dieser Zweige erfolgt zuerst der Aufruf der Prozedur <b>CreateSortBar <\/b>mit zwei Parametern. Diese enthalten die Texte, welche das Kontextemen&uuml; zum Aufw&auml;rts- und Abw&auml;rtssortieren des jeweiligen Feldes anzeigen soll.<\/p>\n<p>Nach dem Erstellen der Kontextmen&uuml;s wird dieses dem aktuellen Steuerelement &uuml;ber die Eigenschaft <b>ShortcutMenuBar <\/b>als Kontextmen&uuml; zugewiesen.<\/p>\n<p><b>Men&uuml; erstellen<\/b><\/p>\n<p>Die Prozedur <b>CreateSortBar <\/b>ist f&uuml;r das Erstellen der Kontextmen&uuml;s verantwortlich (s. <span class=\"verweis-ohneumbruch\"><a href=\"#anker-24-anchor\">Listing 2<\/a><\/span>). Sie nimmt die von der aufrufenden Prozedur &uuml;bergebenen Text f&uuml;r die beiden Eintr&auml;ge zum Hinzuf&uuml;gen einer Sortierung sowie den Namen des Kontextmen&uuml;s entgegen.<\/p>\n<p class=\"listingueberschrift\">Listing 2: Die Methode CreateSortBar steuert das Erstellen eines Kontextmen&uuml;s mit den vier Steuerelementen zum Einstellen der Sortierung.<\/p>\n<pre>Private Sub CreateSortBar(strUp As String, strDown As String, strName As String)\r\n    CreateCommandbar strName, cbr\r\n    CreateCommandBarButton cbr, strUp, &quot;AddSortAsc&quot;\r\n    CreateCommandBarButton cbr, strDown, &quot;AddSortDESC&quot;\r\n    CreateCommandBarButton cbr, &quot;Sortierung f&uuml;r dieses Feld entfernen&quot;, &quot;DropSort&quot;\r\n    CreateCommandBarButton cbr, &quot;Alle Sortierungen entfernen&quot;, &quot;DropAllSort&quot;\r\nEnd Sub<\/pre>\n<p>Danach ruft sie zun&auml;chst die Prozedur <b>CreateCommandbar <\/b>auf, um ein neues Kontextmen&uuml; mit dem angegebenen Namen zu erstellen &#8211; zum Beispiel <b>cbrText<\/b>. Anschlie&szlig;end statten die vier Aufrufe der Prozedur <b>CreateCommandBarButton <\/b>die neue Kontextmen&uuml;leiste mit den vier Eintr&auml;gen zum Sortieren in aufsteigender und absteigender Reihenfolge, zum Entfernen der Sortierung des aktuellen Feldes und zum Entfernen aller Sortierungen aus.<\/p>\n<p>Die Prozedur <b>CreateCommandBar<\/b> finden Sie in <span class=\"verweis-ohneumbruch\"><a href=\"#anker-25-anchor\">Listing 3<\/a><\/span>. Sie entfernt eine eventuell vorhandene Men&uuml;leiste gleichen Namens und legt diese dann entsprechend der mit dem Parameter <b>strCommandbar <\/b>&uuml;bergebenen Bezeichnung neu an.<\/p>\n<p class=\"listingueberschrift\">Listing 3: Die eigentliche Erstellung der nackten Kontextmen&uuml;leiste erledigt diese Prozedur.<\/p>\n<pre>Private Function CreateCommandbar(strCommandbar As String, cbr As CommandBar)\r\n    On Error Resume Next\r\n    CommandBars(strCommandbar).Delete\r\n    On Error GoTo 0\r\n    Set cbr = CommandBars.Add(strCommandbar, msoBarPopup, , True)\r\nEnd Function<\/pre>\n<p><b>Schaltfl&auml;chen zum Kontextmen&uuml; hinzuf&uuml;gen<\/b><\/p>\n<p>Jetzt wird es spannend: Das Anlegen der Eintr&auml;ge des Kontextmen&uuml;s ist n&auml;mlich nicht gerade trivial. Der Hintergrund f&uuml;r die folgende, etwas kompliziert anmutende Vorgehensweise ist, dass wir irgendwo den Code unterbringen m&uuml;ssen, der durch einen Mausklick auf einen der Eintr&auml;ge des Kontextmen&uuml;s ausgel&ouml;st wird. Die erstbeste Variante daf&uuml;r w&auml;re ein Standardmodul mit <b>Public Function<\/b>-Prozeduren. Sie k&ouml;nnten die Namen dieser Prozeduren einfach der Eigenschaft <b>OnAction <\/b>der Men&uuml;schaltfl&auml;chen zuweisen.<\/p>\n<p>Beim Anklicken eines dieser Eintr&auml;ge w&uuml;rden dann die &ouml;ffentlichen Funktionen ausgef&uuml;hrt. Das Sortier-System soll aber m&ouml;glichst geschlossen sein, um eine saubere Architektur zu liefern: Der einzige Kontakt von au&szlig;en sollten die Instanzierung der Klasse und das Zuweisen des Formularverweises sein. Wenn wir ein &ouml;ffentliches Modul verwenden, um dort Funktionen auszulagern, sind diese nicht mehr sauber gekapselt.<\/p>\n<p>Die zweite Variante w&auml;re es, die durch die Men&uuml;eintr&auml;ge aufgerufenen Funktionen gleich in das betroffene Formular zu packen. Dies w&uuml;rde immerhin den Umweg &uuml;ber ein externes Standardmodul einsparen. Allerdings w&uuml;rde dies auch bedeuten, dass wir den gleichen Code in allen Formularmodulen unterbringen m&uuml;ssten, die mit der Sortierfunktion ausgestattet werden sollen &#8211; auch keine gute Idee.<\/p>\n<p>Also gehen wir einen zun&auml;chst komplizierten, aber sauberen Weg. Dieser wird durch die Prozedur <b>CreateCommandBarButton <\/b>eingeleitet, die f&uuml;r jede der vier pro Kontextmen&uuml; anzulegenden Schaltfl&auml;chen einmal aufgerufen wird. Die Prozedur erzeugt je Kontextmen&uuml;eintrag eine neue Instanz der Klasse <b>clsSortAndFilterControl<\/b>.<\/p>\n<p class=\"listingueberschrift\">Listing 4: Die Prozedur CreateCommandBarButton wird f&uuml;r jeden zu erzeugenden Eintrag des Kontextmen&uuml;s einmal aufgerufen.<\/p>\n<pre>Private Sub CreateCommandBarButton(cbr As CommandBar, strCaption As String, strAction As String)\r\n    Dim objSortAndFilterControl As clsSortAndFilterControl\r\n    Set objSortAndFilterControl = New clsSortAndFilterControl\r\n    With objSortAndFilterControl\r\n        .CreateButton cbr, strCaption, strAction, Me\r\n        colCommandbarButtons.Add objSortAndFilterControl\r\n    End With\r\nEnd Sub<\/pre>\n<p>Diese dient als Kapselklasse f&uuml;r jedes der <b>CommandBarButton<\/b>-Objekte, die wir dem Kontextmen&uuml; hinzuf&uuml;gen. Das hei&szlig;t, dass jedes <b>CommandBarButton<\/b>-Objekt innerhalb eines auf der Klasse <b>clsSortAndFilterControl <\/b>basierenden Objekts deklariert und instanziert sowie mit den gew&uuml;nschten Eigenschaften ausgestattet wird &#8211; in diesem Falle nur die Beschriftung.<\/p>\n<p>Die Prozedur <b>CreateCommandBarButton <\/b>erzeugt also eine neue Instanz von <b>clsSortAndFilterControl <\/b>und ruft dann dessen Methode <b>CreateButton <\/b>auf, wobei ein Verweis auf das <b>CommandBar<\/b>-Objekt, die Bezeichnung der Schaltfl&auml;che, ein Parameter zur Festlegung der durchzuf&uuml;hrenden Aktion (aufsteigend oder absteigend filtern, einen oder alle Filter aufheben) und ein Verweis auf die aufrufende Klasse &uuml;bergeben werden. Was diese Methode genau erledigt, schauen wir uns weiter unten an.<\/p>\n<p>Wichtig ist, dass das Objekt <b>objSortAndFilterControl <\/b>nun jeweils die Referenz auf eine der Schaltfl&auml;chen der aktuell erstellten Kontextmen&uuml;leiste enth&auml;lt. Und damit dieses Objekt und damit auch der Men&uuml;eintrag nach dem Erstellen nicht im Nirwana verschwinden, sammeln wir all diese Objekte in der Collection <b>colCommandbarButtons<\/b>.<\/p>\n<p>In <span class=\"verweis-ohneumbruch\"><a href=\"#anker-26-anchor\">Listing 5<\/a><\/span> finden wir nun den kompletten Inhalt der Kapselklasse f&uuml;r die Kontextmen&uuml;eintr&auml;ge. Ein wichtiger Grund f&uuml;r den Einsatz dieser Kapselklasse ist, dass wir darin den Objektverweis auf das <b>CommandBarButton<\/b>-Objekt mit dem Schl&uuml;sselwort <b>WithEvents <\/b>ausstatten und somit sehr gezielt auf die Ereignisse der Schaltfl&auml;che reagieren k&ouml;nnen. Im Detail bedeutet dies, dass wir in dieser Klasse eine Ereignisprozedur anlegen, die durch das Anklicken des Men&uuml;eintrags ausgel&ouml;st wird.<\/p>\n<p class=\"listingueberschrift\">Listing 5: Der komplette Inhalt der Klasse clsSortAndFilterControl.<\/p>\n<pre>Private WithEvents m_cbb As CommandBarButton\r\nPrivate m_Action As String\r\nPrivate m_SortAndFilter As clsSortAndFilter\r\nPublic Sub CreateButton(cbr As CommandBar, strCaption As String, strAction As String, _\r\n        objSortAndFilter As clsSortAndFilter)\r\n    Set m_cbb = cbr.Controls.Add(1)\r\n    With m_cbb\r\n        .Caption = strCaption\r\n    End With\r\n    m_Action = strAction\r\n    Set m_SortAndFilter = objSortAndFilter\r\nEnd Sub\r\nPrivate Sub m_cbb_Click(ByVal Ctrl As Office.CommandBarButton, CancelDefault As Boolean)\r\n    m_SortAndFilter.SetOrderBy m_Action\r\nEnd Sub<\/pre>\n<p>Zun&auml;chst schauen wir uns die Methode <b>CreateButton <\/b>dieser Klasse an. Diese erzeugt zun&auml;chst ein neues <b>CommandBarButton<\/b>-Objekt und speichert einen Verweis darauf in der Objektvariablen <b>m_cbb<\/b>. Die folgende Anweisung weist dieser Schaltfl&auml;che die mit dem Parameter <b>strCaption<\/b> &uuml;bergebene Beschriftung zu. Der Parameter, der die Sortieraktion definiert, wird der Variablen <b>m_Action <\/b>zugewiesen. Schlie&szlig;lich speichert die Objektvariable <b>m_SortAndFilter <\/b>den Verweis auf die aufrufende Klasse des Typs <b>clsSortAndFilter<\/b>.<\/p>\n<p>Warum wir diesen Verweis ben&ouml;tigen, wird beim Blick auf die Ereignisprozedur <b>m_cbb_Click <\/b>deutlich. Diese f&uuml;hrt n&auml;mlich keinesfalls direkt die Sortierung durch, sondern ruft eine Prozedur der Klasse <b>clsSortAndFilter <\/b>auf &#8211; und die k&uuml;mmert sich dann um den Rest.<\/p>\n<p><b>Sortierung durchf&uuml;hren<\/b><\/p>\n<p>Wenn der Benutzer mit der rechten Maustaste auf ein gebundenes Steuerelement klickt und dann einen der Eintr&auml;ge aus dem nun erscheinenden Kontextmen&uuml; ausw&auml;hlt, l&ouml;st dies also das Ereignis <b>m_cbb_Click <\/b>des in der Kapselklasse <b>clsSortAndFilterControl <\/b>gespeicherten <b>CommandBarButton<\/b>-Elements aus.<\/p>\n<p>Die Instanz der Klasse enth&auml;lt bereits einen der Schaltfl&auml;che entsprechenden Parameter in der Variablen <b>m_Action<\/b>, der entweder <b>AddSortAsc<\/b>, <b>AddSortDesc<\/b>, <b>DropSort <\/b>oder <b>DropAllSort <\/b>lautet. Mit einem dieser Parameter ruft die <b>Beim Klicken<\/b>-Methode nun die Prozedur <b>SetOrderBy <\/b>der Klasse <b>clsSortAndFilter <\/b>auf (s. <span class=\"verweis-ohneumbruch\">Listing 6<\/span>).<\/p>\n<p class=\"listingueberschrift\">Listing 6: Diese Prozedur sorgt f&uuml;r das Sortieren entsprechend der zuvor ausgew&auml;hlten Sortieroptionen.<\/p>\n<pre>Public Sub SetOrderBy(strAction As String)\r\n    Dim strOrderBy As String\r\n    Dim var As Variant\r\n    Select Case strAction\r\n        Case &quot;AddSortAsc&quot;\r\n            Dim strControlSource As String\r\n            strControlSource = Screen.ActiveControl.ControlSource\r\n            On Error Resume Next\r\n            colOrderBy.Remove strControlSource\r\n            On Error GoTo 0\r\n            colOrderBy.Add strControlSource &amp; &quot; ASC&quot;, strControlSource\r\n        Case &quot;AddSortDesc&quot;\r\n            strControlSource = Screen.ActiveControl.ControlSource\r\n            On Error Resume Next\r\n            colOrderBy.Remove strControlSource\r\n            On Error GoTo 0\r\n            colOrderBy.Add strControlSource &amp; &quot; DESC&quot;, strControlSource\r\n        Case &quot;DropSort&quot;\r\n            strControlSource = Screen.ActiveControl.ControlSource\r\n            On Error Resume Next\r\n            colOrderBy.Remove strControlSource\r\n            On Error GoTo 0\r\n        Case &quot;DropAllSort&quot;\r\n            Set colOrderBy = New Collection\r\n            m_Form.OrderBy = &quot;&quot;\r\n    End Select\r\n    strOrderBy = &quot;&quot;\r\n    For Each var In colOrderBy\r\n         strOrderBy = strOrderBy &amp; &quot;, &quot; &amp; var\r\n    Next var\r\n    strOrderBy = Mid(strOrderBy, 3)\r\n    m_Form.OrderBy = strOrderBy\r\n    m_Form.OrderByOn = True\r\nEnd Sub<\/pre>\n<p>Anhand des Wertes von <b>strAction <\/b>w&auml;hlt die Prozedur einen von vier Zweigen einer <b>Select Case<\/b>-Bedingung aus. Beim Hinzuf&uuml;gen einer aufsteigenden Sortierung (<b>AddSortAsc<\/b>) schreibt die Prozedur zun&auml;chst den Wert der Eigenschaft <b>ControlSource <\/b>des Steuerelements, f&uuml;r welches das Kontextmen&uuml; ge&ouml;ffnet wurde, in die Variable <b>strControlSource<\/b>. Dies entspricht dem Feld der Datenherkunft, an welches das Steuerelement gebunden ist.<\/p>\n<p>F&uuml;r das Verst&auml;ndnis der folgenden Anweisung m&uuml;ssen Sie wissen, dass alle hinzugef&uuml;gten Sortierkriterien als neues Element zum <b>Collection<\/b>-Objekt <b>colOrderBy <\/b>hinzugef&uuml;gt werden. Der eigentliche Wert ist dabei der Feldname plus Sortierreihenfolge (<b>ASC <\/b>oder <b>DESC<\/b>), f&uuml;r den zweiten Parameter <b>Key <\/b>&uuml;bergeben wir einfach nur den Feldnamen.<\/p>\n<p>Die neuen Sortierkriterien werden einfach unten angeh&auml;ngt. Auf diese Weise haben die zuerst angelegten Kriterien die h&ouml;chste Priorit&auml;t. Wenn Sie im Beispielformular <b>frmDatenblatt<\/b> beispielsweise erst eine aufsteigende Sortierung f&uuml;r das Feld <b>Nachname <\/b>und dann eine absteigende Sortierung f&uuml;r <b>Vorname <\/b>eintragen, sehen die beiden Elemente der Collection <b>colOrderBy <\/b>so aus (<b>Key <\/b>in Klammern):<\/p>\n<pre>Vorname ASC (Vorname)\r\nNachname DESC (Nachname)<\/pre>\n<p>&Uuml;ber den <b>Key <\/b>k&ouml;nnen wir einzelne Elemente der <b>Collection <\/b>referenzieren. Dies ist wichtig, weil wir so gezielt Elemente aus der Sortierung herausnehmen k&ouml;nnen. Wenn Sie also nun f&uuml;r das Feld <b>Vorname <\/b>den Kontextmen&uuml;-Eintrag <b>Sortierung f&uuml;r dieses Feld entfernen <\/b>ausw&auml;hlen, findet die <b>Remove<\/b>-Methode den entsprechenden Eintrag der <b>Collection <\/b>&uuml;ber den Namen der <b>ControlSource <\/b>und kann diesen dann entfernen.<\/p>\n<p>Das Hinzuf&uuml;gen der zwei Sortierrichtungen und das gezielte Entfernen einer bestimmten Sortierung &uuml;bernehmen die ersten drei Zweige der <b>Select Case<\/b>-Bedingung. Der vierte l&ouml;scht alle Sortierungen, indem er einfach die komplette <b>Collection <\/b>neu erstellt.<\/p>\n<p>Bei jedem Aufruf dieser Routine werden also entweder Eintr&auml;ge zur <b>Collection <\/b>hinzugef&uuml;gt oder entfernt, was dazu f&uuml;hrt, dass das gesamte aktuell g&uuml;ltige Filterkriterium auf Basis der Elemente der Collection neu zusammengesetzt werden muss. Dieser Ausdruck landet in der Variablen <b>strOrderBy<\/b>. Dazu durchl&auml;uft eine <b>For Each<\/b>-Schleife alle Elemente der Collection <b>colOrderBy <\/b>und f&uuml;gt den enthaltenen Wert mit einem f&uuml;hrenden Komma an den bestehenden Ausdruck an:<\/p>\n<pre>, Vorname ASC, Nachname DESC<\/pre>\n<p>Das f&uuml;hrende Komma wird noch entfernt, bevor der Sortierausdruck schlie&szlig;lich in der Eigenschaft <b>OrderBy <\/b>des Formulars landet. Damit die Sortierung auch wirkt, aktiviert die Prozedur noch die Eigenschaft <b>OrderByOn<\/b>.<\/p>\n<p><b>Filtern per Kontextmen&uuml;<\/b><\/p>\n<p>Die Version der L&ouml;sung mit den oben beschriebenen Sortierfunktionen finden Sie in der Beispieldatenbank <b>SortierenPerKontextmenue.mdb<\/b>. Diese enth&auml;lt noch nicht die Filterfunktionen, die wir der Beispieldatenbank <b>FilternPerKontextmenue.mdb<\/b> hinzugef&uuml;gt haben.<\/p>\n<p>Die Erweiterungen sind, gemessen am erforderlichen Code, noch etwas umfangreicher als die zum reinen Sortieren der Daten eines Formulars. Wir sparen uns daher an dieser Stelle eine detaillierte Beschreibung und verweisen auf die Lekt&uuml;re des Quellcodes. Stattdessen erl&auml;utern wir noch kurz die neu hinzugekommenen Funktionen.<\/p>\n<p>Wenn Sie beispielsweise das Kontextmen&uuml; eines Textfeldes anzeigen, finden Sie in dieser Version drei weitere Eintr&auml;ge, n&auml;mlich <b>Filtern nach &#8230;<\/b>, <b>Filter f&uuml;r dieses Feld l&ouml;schen <\/b>und <b>Alle Filter l&ouml;schen<\/b> (s. Bild 7). Der Eintrag <b>Filtern nach &#8230; <\/b>&ouml;ffnet ein &auml;hnliches Fenster wie die entsprechende eingebaute Version.<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2010_06\/FilterPerKontextmenue-web-images\/pic007.png\" alt=\"pic007.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 7: Um Filterfunktionen erweitertes Kontextmen&uuml;<\/span><\/b><\/p>\n<p>Sie jedoch ungleich m&auml;chtiger: Der Filter wird n&auml;mlich gleich nach der Eingabe eines jeden Zeichens aktualisiert. Das hei&szlig;t, dass Sie beispielsweise f&uuml;r das Feld <b>Vorname <\/b>nur <b>A* <\/b>eingeben m&uuml;ssen, damit alle Eintr&auml;ge, deren Vorname mit <b>A <\/b>beginnt, angezeigt werden. Je mehr Buchstaben Sie eingeben, desto genauer wird die Auswahl.<\/p>\n<p>Wenn Sie nun zu einem anderen Feld, beispielsweise Nachname, wechseln und dort ebenfalls einen Vergleichsausdruck eingeben, bleibt das zuvor festgelegte Vergleichskriterium nat&uuml;rlich erhalten.<\/p>\n<p>Sie k&ouml;nnen einzelne Kriterien mit dem Kontextmen&uuml;-Eintrag <b>Filter f&uuml;r dieses Feld l&ouml;schen <\/b>entfernen, damit die Datenherkunft nicht mehr nach diesem Feld gefiltert wird.<\/p>\n<p>Mit der Auswahl des Men&uuml;punktes <b>Alle Filter l&ouml;schen <\/b>zeigen Sie die komplette Datenherkunft wieder ungefiltert an.<\/p>\n<p>Bei der Filterung nach dem Datum gibt es noch mehr Optionen, wie Sie Bild 10). Hier wird die Datenherkunft zwar nicht gleich nach der Eingabe eines jeden Zeichens aktualisiert, aber immerhin gleich nach dem Verlassen eines der beiden Textfelder. So k&ouml;nnen Sie die beiden Steuerelemente bequem mit den gew&uuml;nschten Vergleichswerten f&uuml;llen, bis Sie die passenden Datumsangaben herausgefiltert haben.<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2010_06\/FilterPerKontextmenue-web-images\/pic008.png\" alt=\"pic008.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 8: Das Filtern erfolgt gleich bei der Eingabe des Filterkriteriums.<\/span><\/b><\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2010_06\/FilterPerKontextmenue-web-images\/pic009.png\" alt=\"pic009.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 9: F&uuml;r Datumsfelder gibt es eine ganze Reihe von Filterkriterien.<\/span><\/b><\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2010_06\/FilterPerKontextmenue-web-images\/pic010.png\" alt=\"pic010.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 10: Datumsbereiche gibt man in dieses Formular ein.<\/span><\/b><\/p>\n<p>Die Filterkriterien f&uuml;r Zahlenwerte funktionieren genauso wie die f&uuml;r Datumsangaben. F&uuml;r <b>Ja\/Nein<\/b>-Felder zeigt das Formular zur Eingabe des zu filternden Wertes lediglich ein <b>Ja\/Nein<\/b>-Feld an.<\/p>\n<p><b>Zusammenfassung und Ausblick<\/b><\/p>\n<p>Bislang unterst&uuml;tzten die Funktionen zum Sortieren und Filtern bereits die meisten Datentypen. Einige Datentypen wie OLE-Felder und Anlagefelder haben wir allerdings ausgelassen, weil es nicht besonders viele Anwendungsf&auml;lle zum Sortieren oder Filtern von Daten in solchen Feldern zu geben scheint.<\/p>\n<p>Es gibt aber noch mehr Erweiterungsm&ouml;glichkeiten. Zum Beispiel k&ouml;nnten Sie eine der bislang in Access im Unternehmen ver&ouml;ffentlichten Techniken zur &auml;hnlichkeitssuche in die L&ouml;sung integrieren (zum Beispiel <b>Fehlertolerantes Suchen<\/b>, <b>www.access-im-unternehmen.de\/733<\/b>).<\/p>\n<p>Oder Sie erleichtern die Datumseingabe durch die daf&uuml;r vorgesehene Klasse aus dem Beitrag <b>Flexible Datumsfelder <\/b>(<b>www.access-im-unternehmen.de\/690<\/b>). <\/p>\n<p>Zumindest aber k&ouml;nnte man die L&ouml;sung noch ein wenig aufh&uuml;bschen, beispielsweise durch das Hinzuf&uuml;gen von Icons zu den einzelnen Kontextmen&uuml;eintr&auml;gen.<\/p>\n<h3>Downloads zu diesem Beitrag<\/h3>\n<p>Enthaltene Beispieldateien:<\/p>\n<p>FilterPerKontextmenue.mdb<\/p>\n<p><a href=\"..\/fileadmin\/beispiele\/{B01AD9EF-DBC2-4270-A7AD-2363D8BB7576}\/aiu_749.zip\">Download<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>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&ouml;glichkeiten in der Runtime-Version von Access nicht zur Verf&uuml;gung. Damit Sie auch Benutzer ohne Vollversion mit dem gewohnten Komfort begl&uuml;cken k&ouml;nnen, bringen wir Ihren Formularen neue Techniken zum Aufruf von Filtern und Sortierungen bei.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"om_disable_all_campaigns":false,"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"_uf_show_specific_survey":0,"_uf_disable_surveys":false,"footnotes":""},"categories":[662010,66062010,44000023],"tags":[],"class_list":["post-55000749","post","type-post","status-publish","format-standard","hentry","category-662010","category-66062010","category-Mit_Formularen_arbeiten"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.9 (Yoast SEO v27.5) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Filtern und sortieren per Kontextmen&uuml; - Access im Unternehmen<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/access-im-unternehmen.de\/Filtern_und_sortieren_per_Kontextmenue\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Filtern und sortieren per Kontextmen&uuml;\" \/>\n<meta property=\"og:description\" content=\"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&ouml;glichkeiten in der Runtime-Version von Access nicht zur Verf&uuml;gung. Damit Sie auch Benutzer ohne Vollversion mit dem gewohnten Komfort begl&uuml;cken k&ouml;nnen, bringen wir Ihren Formularen neue Techniken zum Aufruf von Filtern und Sortierungen bei.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/access-im-unternehmen.de\/Filtern_und_sortieren_per_Kontextmenue\/\" \/>\n<meta property=\"og:site_name\" content=\"Access im Unternehmen\" \/>\n<meta property=\"article:published_time\" content=\"2020-05-22T22:08:24+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/vg09.met.vgwort.de\/na\/855a933a0adf47f68f4777b9a719d81d\" \/>\n<meta name=\"author\" content=\"Andr\u00e9 Minhorst\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Verfasst von\" \/>\n\t<meta name=\"twitter:data1\" content=\"Andr\u00e9 Minhorst\" \/>\n\t<meta name=\"twitter:label2\" content=\"Gesch\u00e4tzte Lesezeit\" \/>\n\t<meta name=\"twitter:data2\" content=\"22\u00a0Minuten\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Filtern_und_sortieren_per_Kontextmenue\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Filtern_und_sortieren_per_Kontextmenue\\\/\"},\"author\":{\"name\":\"Andr\u00e9 Minhorst\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\"},\"headline\":\"Filtern und sortieren per Kontextmen&uuml;\",\"datePublished\":\"2020-05-22T22:08:24+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Filtern_und_sortieren_per_Kontextmenue\\\/\"},\"wordCount\":3757,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Filtern_und_sortieren_per_Kontextmenue\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg09.met.vgwort.de\\\/na\\\/855a933a0adf47f68f4777b9a719d81d\",\"articleSection\":[\"2010\",\"6\\\/2010\",\"Mit Formularen arbeiten\"],\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Filtern_und_sortieren_per_Kontextmenue\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Filtern_und_sortieren_per_Kontextmenue\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Filtern_und_sortieren_per_Kontextmenue\\\/\",\"name\":\"Filtern und sortieren per Kontextmen&uuml; - Access im Unternehmen\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Filtern_und_sortieren_per_Kontextmenue\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Filtern_und_sortieren_per_Kontextmenue\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg09.met.vgwort.de\\\/na\\\/855a933a0adf47f68f4777b9a719d81d\",\"datePublished\":\"2020-05-22T22:08:24+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Filtern_und_sortieren_per_Kontextmenue\\\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Filtern_und_sortieren_per_Kontextmenue\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Filtern_und_sortieren_per_Kontextmenue\\\/#primaryimage\",\"url\":\"http:\\\/\\\/vg09.met.vgwort.de\\\/na\\\/855a933a0adf47f68f4777b9a719d81d\",\"contentUrl\":\"http:\\\/\\\/vg09.met.vgwort.de\\\/na\\\/855a933a0adf47f68f4777b9a719d81d\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Filtern_und_sortieren_per_Kontextmenue\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Filtern und sortieren per Kontextmen&uuml;\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\",\"name\":\"Access im Unternehmen\",\"description\":\"Das Magazin f\u00fcr Datenbankentwickler auf Basis von Microsoft Access\",\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/access-im-unternehmen.de\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"de\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\",\"name\":\"Andr\u00e9 Minhorst Verlag\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/wp-content\\\/uploads\\\/2019\\\/09\\\/aiu_wp.png\",\"contentUrl\":\"https:\\\/\\\/access-im-unternehmen.de\\\/wp-content\\\/uploads\\\/2019\\\/09\\\/aiu_wp.png\",\"width\":370,\"height\":111,\"caption\":\"Andr\u00e9 Minhorst Verlag\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/logo\\\/image\\\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\",\"name\":\"Andr\u00e9 Minhorst\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g\",\"caption\":\"Andr\u00e9 Minhorst\"}}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Filtern und sortieren per Kontextmen&uuml; - Access im Unternehmen","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/access-im-unternehmen.de\/Filtern_und_sortieren_per_Kontextmenue\/","og_locale":"de_DE","og_type":"article","og_title":"Filtern und sortieren per Kontextmen&uuml;","og_description":"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&ouml;glichkeiten in der Runtime-Version von Access nicht zur Verf&uuml;gung. Damit Sie auch Benutzer ohne Vollversion mit dem gewohnten Komfort begl&uuml;cken k&ouml;nnen, bringen wir Ihren Formularen neue Techniken zum Aufruf von Filtern und Sortierungen bei.","og_url":"https:\/\/access-im-unternehmen.de\/Filtern_und_sortieren_per_Kontextmenue\/","og_site_name":"Access im Unternehmen","article_published_time":"2020-05-22T22:08:24+00:00","og_image":[{"url":"http:\/\/vg09.met.vgwort.de\/na\/855a933a0adf47f68f4777b9a719d81d","type":"","width":"","height":""}],"author":"Andr\u00e9 Minhorst","twitter_card":"summary_large_image","twitter_misc":{"Verfasst von":"Andr\u00e9 Minhorst","Gesch\u00e4tzte Lesezeit":"22\u00a0Minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/access-im-unternehmen.de\/Filtern_und_sortieren_per_Kontextmenue\/#article","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/Filtern_und_sortieren_per_Kontextmenue\/"},"author":{"name":"Andr\u00e9 Minhorst","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f"},"headline":"Filtern und sortieren per Kontextmen&uuml;","datePublished":"2020-05-22T22:08:24+00:00","mainEntityOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Filtern_und_sortieren_per_Kontextmenue\/"},"wordCount":3757,"commentCount":0,"publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Filtern_und_sortieren_per_Kontextmenue\/#primaryimage"},"thumbnailUrl":"http:\/\/vg09.met.vgwort.de\/na\/855a933a0adf47f68f4777b9a719d81d","articleSection":["2010","6\/2010","Mit Formularen arbeiten"],"inLanguage":"de","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/access-im-unternehmen.de\/Filtern_und_sortieren_per_Kontextmenue\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/access-im-unternehmen.de\/Filtern_und_sortieren_per_Kontextmenue\/","url":"https:\/\/access-im-unternehmen.de\/Filtern_und_sortieren_per_Kontextmenue\/","name":"Filtern und sortieren per Kontextmen&uuml; - Access im Unternehmen","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/#website"},"primaryImageOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Filtern_und_sortieren_per_Kontextmenue\/#primaryimage"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Filtern_und_sortieren_per_Kontextmenue\/#primaryimage"},"thumbnailUrl":"http:\/\/vg09.met.vgwort.de\/na\/855a933a0adf47f68f4777b9a719d81d","datePublished":"2020-05-22T22:08:24+00:00","breadcrumb":{"@id":"https:\/\/access-im-unternehmen.de\/Filtern_und_sortieren_per_Kontextmenue\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/access-im-unternehmen.de\/Filtern_und_sortieren_per_Kontextmenue\/"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/access-im-unternehmen.de\/Filtern_und_sortieren_per_Kontextmenue\/#primaryimage","url":"http:\/\/vg09.met.vgwort.de\/na\/855a933a0adf47f68f4777b9a719d81d","contentUrl":"http:\/\/vg09.met.vgwort.de\/na\/855a933a0adf47f68f4777b9a719d81d"},{"@type":"BreadcrumbList","@id":"https:\/\/access-im-unternehmen.de\/Filtern_und_sortieren_per_Kontextmenue\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/access-im-unternehmen.de\/"},{"@type":"ListItem","position":2,"name":"Filtern und sortieren per Kontextmen&uuml;"}]},{"@type":"WebSite","@id":"https:\/\/access-im-unternehmen.de\/#website","url":"https:\/\/access-im-unternehmen.de\/","name":"Access im Unternehmen","description":"Das Magazin f\u00fcr Datenbankentwickler auf Basis von Microsoft Access","publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/access-im-unternehmen.de\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"de"},{"@type":"Organization","@id":"https:\/\/access-im-unternehmen.de\/#organization","name":"Andr\u00e9 Minhorst Verlag","url":"https:\/\/access-im-unternehmen.de\/","logo":{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/logo\/image\/","url":"https:\/\/access-im-unternehmen.de\/wp-content\/uploads\/2019\/09\/aiu_wp.png","contentUrl":"https:\/\/access-im-unternehmen.de\/wp-content\/uploads\/2019\/09\/aiu_wp.png","width":370,"height":111,"caption":"Andr\u00e9 Minhorst Verlag"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f","name":"Andr\u00e9 Minhorst","image":{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/secure.gravatar.com\/avatar\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g","caption":"Andr\u00e9 Minhorst"}}]}},"_links":{"self":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55000749","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/comments?post=55000749"}],"version-history":[{"count":0,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55000749\/revisions"}],"wp:attachment":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/media?parent=55000749"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/categories?post=55000749"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/tags?post=55000749"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}