Datensätze nach Zahl ausgeben

Sie kennen das sicher vom Drucken-Dialog, wo Sie einzelne Zahlen oder Zahlenbereiche angeben können, um die betroffenen Seiten zu drucken – also beispielsweise 1-2, 3-5 und so weiter. Eine solche Möglichkeit wollen wir auch für das Filtern von Datensätzen in der Datenblattansicht schaffen. Der Benutzer soll also eine oder mehrere Seitenzahlen oder Bereiche von Seiten in ein Textfeld eingeben können, nach denen dann gefiltert wird.

Vorbereitung

Wir benötigen ein Hauptformular, welches das Textfeld für die Eingabe der gewünschten Filterausdrücke enthält sowie ein Unterformular, das die gefilterten Datensätze anzeigt. Das Unterformular soll die Tabelle tblArtikel als Datensatzquelle verwenden, und zwar als Abfrage formuliert, welche die Artikel aufsteigend nach dem Wert des Feldes ArtikelID sortiert. Das Unterformular namens sfmArtikelNachBereich enthält alle Felder der zugrundeliegenden Abfrage. Außerdem stellen wir seine Eigenschaft Standardansicht auf Datenblatt ein.

Das Formular sfmArtikelNachBereich fügen wir dann dem Hauptformular als Unterformular hinzu. Außerdem legen wir im Hauptformular ein Textfeld namens txtBereiche an. Neben diesem Textfeld legen wir zwei Schaltflächen an – eine zum Anwenden des Filters und eine zum Zurücksetzen. Für das Hauptformular stellen wir außerdem die Eigenschaften Datensatzmarkierer, Navigationsschaltflächen und Bildlaufleisten auf Nein und Automatisch zentrieren auf Ja ein.

Die beiden Eigenschaften Horizontaler Anker und Vertikaler Anker des Unterformular-Steuerelements erhalten den Wert Beide, das Bezeichnungsfeld des Unterformular-Steuerelements löschen wir. Das Hauptformular sieht dann inklusive Steuerelementen und Unterformular wie in Bild 1 aus.

Entwurf des Formulars zum Filtern nach Zahlenbereichen

Bild 1: Entwurf des Formulars zum Filtern nach Zahlenbereichen

Anforderungen

Welche Filtermöglichkeiten wollen wir schaffen Hier sind die einzelnen Möglichkeiten:

  • Durch Komma getrennte Zahlen, also zum Beispiel 1, 3, 5, sollen die erste, dritte und fünfte Seite liefern.
  • Zwei durch einen Bindestrich verbundene Zahlen geben einen Bereich an, zum Beispiel soll 1-4 alle Datensätze von 1 bis 4 liefern.
  • Ein Bindestrich vor einer Zahl soll alle Datensätze bis zu dieser Zahl liefern. -5 soll also alle Datensätze von 1 bis 5 ausgeben.
  • Ein Bindestrich nach einer Zahl soll alle Datensätze ab dieser Zahl liefern (einschließlich dieser Zahl). 3- soll also alle Datensätze ab 3 ausgeben.

Diese Möglichkeiten sollen auch noch kombiniert werden können, und zwar jeweils getrennt durch das Komma-Zeichen.

Und was auch noch nicht geklärt ist: Worauf genau sollen sich die Zahlen beziehen Dazu gibt es zwei Möglichkeiten:

  • Den Index der angezeigten Datensätze.
  • Den Primärschlüsselwert der angezeigten Datensätze.

Da wir vorher nie wissen, wie die Wünsche des Benutzers aussehen, fügen wir dazu noch eine Optionsgruppe mit den beiden Möglichkeiten hinzu.

So kann der Benutzer auch nach der Sortierung etwa nach dem Artikelnamen die Datensätze nach dem Index filtern lassen. Dazu fügen wir noch die Optionsgruppe ogrFilter wie in Bild 2 zum Hauptformular hinzu.

Optionsgruppe zum Einstellen des Kriteriums zum Filtern

Bild 2: Optionsgruppe zum Einstellen des Kriteriums zum Filtern

Einzelne Filterausdrücke extrahieren

Wir beginnen einfach und wollen zunächst alle Filterausdrücke aus dem Textfeld txtBereiche extrahieren. Das sind also alle Teile der im Textfeld enthaltenen Zeichenkette, die durch ein Komma voneinander getrennt werden.

Um diese schnell zu erhalten, nutzen wir die Split-Funktion, um aus der Zeichenkette ein String-Array mit den einzelnen Elementen zu bilden.

Dieses durchlaufen wir dann in einer For…Next-Schleife über alle Elemente. Die Indexwerte dieser Elemente ermitteln wir dabei mit den Funktionen LBound (unterer Indexwert) und UBound (oberer Indexwert):

Private Sub cmdFiltern_Click()
     Dim strFilter As String
     Dim strBereiche As String
     Dim strVergleichswerte() As String
     Dim i As Integer
     strBereiche = Nz(Me!txtBereiche, "")
     strVergleichswerte = Split(strBereiche, ",")
     For i = LBound(strVergleichswerte) To  UBound(strVergleichswerte)
         Debug.Print strVergleichswerte(i)
     Next i
End Sub

Wenn der Benutzer nun 1,3,5 eingibt, erhalten wir diese Ausgabe:

1
3
5

Damit lässt sich schon einmal arbeiten. Wenn wir Bereiche eingeben, erhalten wir auch die gewünschten Informationen, zum Beispiel bei -2, 4, 7-9, 75-. Das liefert:

-2
4
7-9
75-

Unzulässige Zeichen erkennen

Bevor wir überhaupt in die Analyse der einzelnen, durch Kommata getrennten Elemente einsteigen, wollen wir direkt prüfen, ob der Ausdruck unzulässige Zeichen enthält. Dazu nutzen wir die folgende Funktion, der wir zwei Parameter übergeben:

  • die zu untersuchende Zeichenfolge und
  • eine Zeichenkette mit den zulässigen Zeichen.

Der Aufruf dieser Funktion sieht beispielsweise wie folgt aus:

  NurZulaessigeZeichen("x-2, 4, 7-9, 75-", "[0-9,-]")

Als Ergebnis soll eine Zeichenkette ohne nicht zulässige Zeichen zurückgeliefert werden.

In diesem Fall ist das führende x ein nicht zulässiges Zeichen, also sollte der Aufruf dieses Ergebnis liefern:

-2, 4, 7-9, 75-

Die Funktion sieht wie folgt aus:

Public Function NurZulaessigeZeichen(strText As String,  strZeichen As String)
     Dim i As Integer
     Dim strTemp As String
     For i = 1 To Len(strText)
         If Mid(strText, i, 1) Like strZeichen Then
             strTemp = strTemp & Mid(strText, i, 1)
         End If
     Next i
     NurZulaessigeZeichen = strTemp
End Function

Die Funktion erwartet die nicht zulässigen Zeichen in einer Form, wie Sie mit einem Like-Vergleich genutzt werden kann, also in eckigen Klammern. Außerdem können Bereiche von Zeichen wie etwa die Zahlen von 0 bis 9 vereinfacht durch 0-9 angegeben werden.

Die Funktion durchläuft alle Zeichen der zu untersuchenden Zeichenkette in einer For…Next-Schleife, wobei jeweils ein Zeichen mit dem Like-Operator mit den Vergleichszeichen vergleichen wird. Ist das Zeichen in den mit dem zweiten Parameter übergebenen Zeichen enthalten, wird dieses an die Zeichenkette der Variablen strTemp angehängt. Diese wird nach dem Durchlaufen aller Zeichen an die aufrufende Instanz zurückgegeben.

Der Sinn dieser Funktion ist in unserem Fall, unerwünschte und gegebenenfalls versehentlich eingegebene Zeichen zu extrahieren. Diese Funktion bauen wir daher direkt in die Ereignisprozedur cmdFiltern_Click ein:

Private Sub cmdFiltern_Click()
     ...
     strBereiche = Nz(Me!txtBereiche, "")
     strBereiche = NurZulaessigeZeichen(strBereiche,  "[,-0-9]")
     ...
End Sub

Bereiche analysieren

Diese Bereiche analysieren wir nun. Dabei gibt es die folgenden Fälle:

  • eine Zahl, zum Beispiel 4,
  • eine Zahl mit folgendem Bindestrich, zum Beispiel 75-,
  • eine Zahl mir führendem Bindestrich, zum Beispiel -2 und
  • zwei durch einen Bindestrich getrennte Zahlen, zum Beispiel 7-9.

Diese vier Fälle müssen wir zunächst erkennen. Dazu verwenden wir eine neue Funktion, die wir in der For…Next-Schleife für jedes durch Komma getrennte Element einmal aufrufen:

For i = LBound(strVergleichswerte) To  UBound(strVergleichswerte)
     Debug.Print strVergleichswerte(i)
     FilterkriteriumErmitteln strVergleichswerte(i)
Next i

Die Funktion sieht zunächst wie folgt aus:

Private Function FilterkriteriumErmitteln(ByVal  strVergleichswert As String)
     Dim intPos As Integer
     strVergleichswert = Replace(strVergleichswert, " ", "")
     intPos = InStr(1, strVergleichswert, "-")
     Select Case intPos
         Case 0
             Debug.Print "kein Minus"
         Case 1
             Debug.Print "Minus an erster Stelle"
         Case Else
             If intPos = Len(strVergleichswert) Then
                 Debug.Print "Minus an letzter Stelle"
             Else
                 Debug.Print "Minus dazwischen"
             End If
     End Select
End Function

Die Funktion ersetzt zunächst alle Leerzeichen durch leere Zeichenketten. Dann ermittelt sie in der Variablen intPos die Position des Minuszeichens (). Im Falle von 0 ist kein Minuszeichen vorhanden, was wir aktuell einfach im Direktbereich vermerken. Lautet der Wert von intPos hingegen 1, befindet sich das Minuszeichen an der ersten Stelle, was auf einen Ausdruck wie -3 hindeutet. In allen anderen Fällen ist eine weitere Untersuchung nötig, die wir im Else-Zweig der Select Case-Bedingung prüfen. Hier prüfen wir, ob intPos gleich der Anzahl der Zeichen der übergebenen Zeichenkette entspricht, was bedeuten würde, dass sich das Minus-Zeichen an der letzten Stelle befindet. In allen anderen Fällen befindet sich das Minuszeichen nicht an erster und nicht an letzter Stelle, der Ausdruck sollte also wie 1-3 lauten.

Vergleichsausdrücke ermitteln

Nun reichern wir die obige Prozedur um die resultierenden Vergleichsausdrücke an. Dabei betrachten wir zunächst nur den Fall, dass wir das ID-Feld als Vergleichsfeld nutzen wollen und nicht den Index der angezeigten Elemente – der ist nämlich noch etwas komplizierter zu handhaben.

Die neue Version der Prozedur finden Sie in Listing 1. Die Prozedur erwartet nun mit dem ersten Parameter auch noch den Namen des Feldes, das als Vergleichsfeld verwendet werden soll. Im Vergleichswert entfernen wir die Leerzeichen und ermitteln dann die Position eines gegebenenfalls enthaltenen Minuszeichens.

Public Function FilterkriteriumErmitteln(strVergleichsfeld As String, ByVal strVergleichswert As String)
     Dim intPos As String
     Dim strVergleichsausdruck As String
     strVergleichswert = Replace(strVergleichswert, " ", "")
     intPos = InStr(1, strVergleichswert, "-")
     Select Case intPos
         Case 0
             strVergleichsausdruck = strVergleichsfeld & " = " & strVergleichswert
         Case 1
             strVergleichsausdruck = strVergleichsfeld & " <= " & Mid(strVergleichswert, intPos + 1)
         Case Else
             If intPos = Len(strVergleichswert) Then
                 strVergleichsausdruck = strVergleichsfeld & " >= " & Mid(strVergleichswert, 1, intPos - 1)
             Else
                 strVergleichsausdruck = "(" & strVergleichsfeld & " >= " & Mid(strVergleichswert, 1, intPos - 1) _
                     & " AND " & strVergleichsfeld & " <= " & Mid(strVergleichswert, intPos + 1) & ")"
             End If
     End Select
     FilterkriteriumErmitteln = strVergleichsausdruck
End Function

Listing 1: Ermittlung der Vergleichsausdrücke

Im ersten Case-Zweig der Select Case-Bedingung tragen wir für die Variable strVergleichsausdruck den Namen des Vergleichsfeldes, ein Gleichheitszeichen und den Vergleichswert ein, und zwar in der Form = .

Der Case-Zweig, der davon ausgeht, dass das Minuszeichen gleich das erste Zeichen ist, fügt den Namen des Vergleichsfelds mit dem Vergleichsoperator <= und dem Teil aus strVergleichswert zusammen, der nach dem Minuszeichen folgt, also in der Form <= .

Im If-Teil der If…Then-Bedingung des Else-Zweigs der Select Case-Bedingung, der davon ausgeht, dass sich das Minuszeichen am Ende von strVergleichswert befindet, fügen wir in strVergleichsausdruck den Wert aus strVergleichsfeld, den Vergleichsoperator >= und den Inhalt aus strVergleichswert bis zum Minuszeichen zusammen. Der Ausdruck lautet dann >= .

Schließlich folgt noch der Else-Teil der If…Then-Bedingung aus dem Else-Teil der Select Case-Bedingung. Dieser nimmt an, dass das Minuszeichen sich zwischen zwei Zahlenwerten befindet. Hier soll der Vergleichsausdruck später ( => AND <= ) lauten.

Der in strVergleichsausdruck enthaltene Vergleichsausdruck wird dann als Funktionsergebnis an die aufrufende Routine zurückgegeben.

In der For…Next-Schleife der aufrufenden Prozedur, die nun wie in Listing 2 aussieht, stellen wir nun in der Variablen strFilterkriterium die einzelnen Kriterienausdrücke zusammen. Dabei stellen wir jedem Ausdruck zunächst den OR-Operator voran.

Private Sub cmdFiltern_Click()
     Dim strFilter As String
     Dim strBereiche As String
     Dim strVergleichswerte() As String
     Dim strFilterkriterium As String
     Dim i As Integer
     strBereiche = Nz(Me!txtBereiche, "")
     strBereiche = NurZulaessigeZeichen(strBereiche, "[0-9,-]")
     strVergleichswerte = Split(strBereiche, ",")
     For i = LBound(strVergleichswerte) To UBound(strVergleichswerte)
         strFilterkriterium = strFilterkriterium & " OR " & FilterkriteriumErmitteln("ArtikelID", strVergleichswerte(i))
     Next i
     If Len(strFilterkriterium) > 0 Then
         strFilterkriterium = Mid(strFilterkriterium, 5)
         With Me!sfmArtikelNachBereich.Form
             .Filter = strFilterkriterium
             .FilterOn = True
         End With
     Else
         Me!sfmArtikelNachBereich.Form.Filter = ""
     End If
End Sub

Listing 2: Setzen des Filters

Für unseren weiter oben vorgestellten Ausdruck -2, 4, 7-9, 75- enhält strFilterkriterium beim ersten Aufruf also folgenden Ausdruck:

  OR ArtikelID <= 2

In den folgenden Durchläufen wird der Ausdruck dann zu folgendem Ausdruck ergänzt:

  OR ArtikelID <= 2 OR ArtikelID = 4 OR (ArtikelID >= 7 AND ArtikelID <= 9) OR ArtikelID >= 75

Die folgende If…Then-Bedingung prüft dann, ob strFilterkriterium eine Zeichenkette mit einer Länge größer 0 enthält. Ist das der Fall, schneidet die Prozedur zunächst das führende OR ab, sodass dieser Ausdruck übrigbleibt:

ArtikelID <= 2 OR ArtikelID = 4 OR (ArtikelID >= 7 AND ArtikelID <= 9) OR ArtikelID >= 75

Diesen Ausdruck weisen wir dann der Eigenschaft Filter des Formulars im Unterformular-Steuerelement zu und aktivieren den Filter, indem wir die Eigenschaft FilterOn auf True einstellen.

Wenn strFilterkriterium hingegen eine leere Zeichenkette enthält, führt die Prozedur den Else-Teil der If…Then-Bedingung aus, welcher die Eigenschaft Filter auf eine leere Zeichenkette einstellt und somit den Filter zurücksetzt.

Das Ergebnis sieht nun wie in Bild 3 aus und entspricht genau den Erwartungen.

Erster Test der Filterfunktion

Bild 3: Erster Test der Filterfunktion

Filtern nach Index

Das Filtern nach dem Index ist noch ein wenig komplizierter, da wir für jedes angezeigte Element über den Index erst den Primärschlüsselwert ermitteln und dann nach diesem filtern müssen.

Als Erstes erweitern wir die Ereignisprozedur, die durch das Anklicken der Schaltfläche cmdFiltern ausgelöst wird. Innerhalb der For…Next-Schleife, die alle Elemente des Arrays strVergleichswerte durchläuft, fügen wir nun noch eine If…Then-Bedingung hinzu, die prüft, ob die Optionsgruppe ogrFilter den Wert 1 (ID) oder 2 (Index) aufweist.

Im Fall des Wertes 1 behalten wir den bisherigen Aufruf der Funktion FilterkriteriumErmitteln bei, den wir auch weiter oben bereits beschrieben haben.

Anderenfalls rufen wir eine neue Funktion namens FilterkriteriumErmittelnIndex auf, der wir das Recordset des Unterformulars als ersten Parameter übergeben. Als zweiten und dritten Parameter übergeben wir die gleichen Werte, die wir auch bisher schon übergeben haben – also den Namen des Primärschlüsselfeldes und den aktuellen Wert des Arrays strVergleichswerte (siehe Listing 3).

Private Sub cmdFiltern_Click()
     ...
     For i = LBound(strVergleichswerte) To UBound(strVergleichswerte)
         If Me!ogrFilter = 1 Then
             strFilterkriterium = strFilterkriterium & " OR " & FilterkriteriumErmitteln("ArtikelID", _
                 strVergleichswerte(i))
         Else
             strFilterkriterium = strFilterkriterium & " OR " & FilterkriteriumErmittelnIndex( _
                 Me!sfmArtikelNachBereich.Form.Recordset, "ArtikelID", strVergleichswerte(i))
         End If
     Next i
     ...
End Sub

Listing 3: Erweiterte Version der Prozedur, die beim Filtern ausgelöst wird

Die Funktion FilterkriteriumErmittelnIndex finden Sie in Listing 4. Sie entfernt wieder die Leerzeichen aus dem übergebenen Vergleichswert, der genauso aufgebaut sein kann wie die Vergleichswerte, die wir für das Filtern nach dem Primärschlüsselwerten (ID) weiter oben verwendet haben – also beispielsweise -2, 4, 7-9, 75-. Der Unterschied ist nun, dass wir die Werte und Bereiche nicht auf den Primärschlüsselwert anwenden, sondern auf den Index der Einträge im Datenblatt. Ein weiterer Vorteil ist, dass die Funktion die aktuelle Sortierung berücksichtigt. Wenn Sie also beispielsweise vorher nach dem Artikelnamen sortieren statt nach dem Primärschlüsselwert, verwendet die Funktion den aktuellen Index mit Sortierung nach dem Artikelnamen.

Public Function FilterkriteriumErmittelnIndex(rst As DAO.Recordset, strVergleichsfeld As String, _
         ByVal strVergleichswert As String)
     Dim intPos As Integer
     Dim strVergleichsausdruck As String
     Dim l As Long
     Dim strIN As String
     Dim lngMax As Long
     strVergleichswert = Replace(strVergleichswert, " ", "")
     intPos = InStr(1, strVergleichswert, "-")
     Select Case intPos
         Case 0
             strVergleichsausdruck = strVergleichsfeld & " = " & IndexErmitteln(rst, strVergleichsfeld, _
                 CLng(strVergleichswert))
         Case 1
             For l = 1 To Mid(strVergleichswert, intPos + 1)
                 strIN = strIN & ", " & IndexErmitteln(rst, strVergleichsfeld, l)
             Next l
             If Len(strIN) > 0 Then
                 strIN = Mid(strIN, 2)
                 strVergleichsausdruck = strVergleichsfeld & " IN (" & strIN & ")"
             End If
         Case Else
             If intPos = Len(strVergleichswert) Then
                 For l = Mid(strVergleichswert, 1, intPos - 1) To rst.RecordCount
                     strIN = strIN & ", " & IndexErmitteln(rst, strVergleichsfeld, CLng(l))
                 Next l
             Else
                 lngMax = Mid(strVergleichswert, intPos + 1)
                 If lngMax > rst.RecordCount Then
                     lngMax = rst.RecordCount
                 End If
                 For l = Mid(strVergleichswert, 1, intPos - 1) To lngMax
                     strIN = strIN & ", " & IndexErmitteln(rst, strVergleichsfeld, CLng(l))
                 Next l
             End If
             If Len(strIN) > 0 Then
                 strIN = Mid(strIN, 2)
                 strVergleichsausdruck = strVergleichsfeld & " IN (" & strIN & ")"
             End If
     End Select
     FilterkriteriumErmittelnIndex = strVergleichsausdruck
End Function

Listing 4: Funktion zum Ermitteln der Vergleichsausdrücke zum Filtern nach dem Index

Der grundsätzliche Aufbau der Funktion ist mit der vorherigen identisch – wir haben wieder eine Select Case-Anweisung mit drei Case-Zweigen, von denen der letzte wieder eine If…Then-Bedingung enthält.

Der erste Case-Zweig behandelt einzelne Indexwerte, also etwa 4. Sie verwendet eine Hilfsfunktion namens IndexErmitteln, die wieder das Recordset, den Namen des Vergleichsfeldes und die Nummer des Vergleichswertes als Long-Wert erwartet. Diese Funktion soll den Primärschlüsselwert für den Datensatz mit dem angegebenen Index ermitteln. Dazu erstellt sie ein Recordset-Clone, verschiebt den Datensatzzeiger über die AbsolutePosition-Eigenschaft auf die Position mit dem entsprechenden Index (minus 1, da dieser im Gegensatz zu dem übergebenen Wert 0-basiert ist). Der Rückgabewert ist dann schließlich der Primärschlüsselwert dieses Datensatzes:

Public Function IndexErmitteln(rst As DAO.Recordset,  strVergleichsfeld As String, lngIndex As Long) As Long
     Dim rstClone As DAO.Recordset
     Set rstClone = rst.Clone
     rstClone.AbsolutePosition = lngIndex - 1
     IndexErmitteln = rstClone(strVergleichsfeld)
End Function

Dadurch entsteht dann in unseren Beispieldaten bei einem gesuchten Index von 4 ein Ausdruck wie ArtikelID = 60.

In den anderen drei Fällen wird es etwas komplizierter. Hier müssen wir alle Datensätze durchgehen, die durch die Angabe von Bereichen wie -2, 7-9 oder 75- angegeben werden.

Falls sich das Minuszeichen an der ersten Position befindet, wollen wir alle Datensätze filtern, deren Index sich zwischen der ersten Position befindet und der Position, die durch die folgende Zahl angegeben ist – bei -2 also die Datensätze an Position 1 und Position 2. Dazu durchlaufen wir eine For…Next-Schleife über diese Zahlenwerte, also von 1 bis 2. In dieser Schleife fügen wir dann in der String-Variablen strIN eine Zeichenkette zusammen, die jeweils aus einem Komma und dem mit der Funktion IndexErmitteln ermittelten Primärschlüsselwert besteht.

Für unsere Beispieldaten kommt dann für den Ausdruck -2 nach der For…Next-Schleife der Wert , 17, 3 für strIN heraus. Dadurch findet die folgende If…Then-Bedingung heraus, dass strIN mehr als null Zeichen enthält. Dadurch werden innerhalb der Bedingung zunächst das führende Komma und das Leerzeichen abgeschnitten, sodass 17, 3 übrigbleibt. In strVergleichsausdruck wird dann ein Ausdruck wie ArtikelID IN (17, 3) zusammengeführt.

Logisch: Wir können, wenn wir nach den Primärschlüsselwerten filtern wollen, die nicht unbedingt aufsteigend sortiert sein müssen, keine Bereiche mehr angeben, sondern müssen mit einer IN-Klausel genau die zu filternden Elemente angeben.

Wenn sich das Minuszeichen nicht am Anfang der Zeichenkette aus strVergleichswert befindet, kommt der dritte Case-Zweig zur Geltung. Hier finden wir wie in der Funktion FilterkriteriumErmitteln eine If…Then-Bedingung, die danach unterscheidet, ob sich das Minuszeichen in strVergleichswert an der letzten Position befindet (wie in 75-) oder nicht – dann handelt es sich um einen Ausdruck wie 7-9.

Im ersten Fall durchlaufen wir wieder eine For…Next-Schleife, und zwar von dem Zahlenwert, der sich vor dem Minuszeichen befindet bis zur Anzahl der Datensätze des Recordsets.

Innerhalb der For…Next-Schleife stellt die Prozedur wie im vorherigen Fall in strIN eine Liste der mit der Funktion IndexErmitteln gefundenen Elemente zusammen. Diese wird nach Abschluss der If…Then-Bedingung wieder zu einer vollständigen Bedingung zusammengestellt, mit unseren Beispieldaten beim Ausdruck 75- also zu ArtikelID IN ( 63, 64, 47).

Und in dem Fall, dass sich das Minuszeichen zwischen zwei Zahlenwerten befindet, stellen wir die For…Next-Schleife so zusammen, dass der Startwert dem ersten Zahlenwert entspricht (bei 7-9 also 7) und der Endwert dem zweiten Zahlenwert (9). Der resultierende Ausdruck lautet dann ArtikelID IN ( 2, 39, 4).

Hier kann es sein, dass der zweite Wert größer ist als die Anzahl der angezeigten Datensätze. In diesem Fall wird der zweite Wert auf die Anzahl der Datensätze eingestellt.

Usability

Um direkt nach der Eingabe der Zahlenbereiche filtern zu können, belegen wir die Eigenschaft Standard der Schaltfläche cmdFiltern mit dem Wert Ja. Dadurch löst das Betätigen der Eingabetaste innerhalb des Formulars immer direkt die Ereignisprozedur der Schaltfläche cmdFiltern aus.

Zusammenfassung und Ausblick

Mit der hier vorgestellten Lösung kann der Benutzer die Datensätze einer Datenblattansicht über die Angabe von einzelnen Primärschlüsselwerten oder von Bereichen von Primärschlüsselwerten filtern. Oder er stellt um auf das Filtern nach dem Index – dann kann er nach den Positionen filtern, unter denen die Einträge zu finden sind.

Damit haben wir die Funktion, die sich sonst in Drucken-Dialogen zur Auswahl der zu druckenden Seiten findet, für die Anzeige von Datensätzen abgebildet.

Downloads zu diesem Beitrag

Enthaltene Beispieldateien:

DatensaetzeNachZahlAusgeben.accdb

Download

Schreibe einen Kommentar