{"id":55001219,"date":"2020-02-01T00:00:00","date_gmt":"2020-07-10T09:39:23","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=1219"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"Datensaetze_nach_Zahl_ausgeben","status":"publish","type":"post","link":"https:\/\/access-im-unternehmen.de\/Datensaetze_nach_Zahl_ausgeben\/","title":{"rendered":"Datens&auml;tze nach Zahl ausgeben"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/vg06.met.vgwort.de\/na\/8826b115ffba496c8718accb25feda83\" width=\"1\" height=\"1\" alt=\"\"><\/p>\n<p><b>Sie kennen das sicher vom Drucken-Dialog, wo Sie einzelne Zahlen oder Zahlenbereiche angeben k&ouml;nnen, um die betroffenen Seiten zu drucken &#8211; also beispielsweise 1-2, 3-5 und so weiter. Eine solche M&ouml;glichkeit wollen wir auch f&uuml;r das Filtern von Datens&auml;tzen in der Datenblattansicht schaffen. Der Benutzer soll also eine oder mehrere Seitenzahlen oder Bereiche von Seiten in ein Textfeld eingeben k&ouml;nnen, nach denen dann gefiltert wird.<\/b><\/p>\n<p><b>Vorbereitung<\/b><\/p>\n<p>Wir ben&ouml;tigen ein Hauptformular, welches das Textfeld f&uuml;r die Eingabe der gew&uuml;nschten Filterausdr&uuml;cke enth&auml;lt sowie ein Unterformular, das die gefilterten Datens&auml;tze anzeigt. Das Unterformular soll die Tabelle <b>tblArtikel <\/b>als Datensatzquelle verwenden, und zwar als Abfrage formuliert, welche die Artikel aufsteigend nach dem Wert des Feldes <b>ArtikelID <\/b>sortiert. Das Unterformular namens <b>sfmArtikelNachBereich <\/b>enth&auml;lt alle Felder der zugrundeliegenden Abfrage. Au&szlig;erdem stellen wir seine Eigenschaft <b>Standardansicht <\/b>auf <b>Datenblatt <\/b>ein.<\/p>\n<p>Das Formular <b>sfmArtikelNachBereich <\/b>f&uuml;gen wir dann dem Hauptformular als Unterformular hinzu. Au&szlig;erdem legen wir im Hauptformular ein Textfeld namens <b>txtBereiche <\/b>an. Neben diesem Textfeld legen wir zwei Schaltfl&auml;chen an &#8211; eine zum Anwenden des Filters und eine zum Zur&uuml;cksetzen. F&uuml;r das Hauptformular stellen wir au&szlig;erdem die Eigenschaften <b>Datensatzmarkierer<\/b>, <b>Navigationsschaltfl&auml;chen <\/b>und <b>Bildlaufleisten <\/b>auf <b>Nein <\/b>und <b>Automatisch zentrieren <\/b>auf <b>Ja <\/b>ein.<\/p>\n<p>Die beiden Eigenschaften <b>Horizontaler Anker <\/b>und <b>Vertikaler Anker <\/b>des Unterformular-Steuerelements erhalten den Wert <b>Beide<\/b>, das Bezeichnungsfeld des Unterformular-Steuerelements l&ouml;schen wir. Das Hauptformular sieht dann inklusive Steuerelementen und Unterformular wie in Bild 1 aus.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2020_01\/pic_1219_001.png\" alt=\"Entwurf des Formulars zum Filtern nach Zahlenbereichen\" width=\"549,6265\" height=\"431,5094\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 1: Entwurf des Formulars zum Filtern nach Zahlenbereichen<\/span><\/b><\/p>\n<p><b>Anforderungen<\/b><\/p>\n<p>Welche Filterm&ouml;glichkeiten wollen wir schaffen Hier sind die einzelnen M&ouml;glichkeiten:<\/p>\n<ul>\n<li>Durch Komma getrennte Zahlen, also zum Beispiel <b>1, 3, 5<\/b>, sollen die erste, dritte und f&uuml;nfte Seite liefern.<\/li>\n<li>Zwei durch einen Bindestrich verbundene Zahlen geben einen Bereich an, zum Beispiel soll <b>1-4 <\/b>alle Datens&auml;tze von <b>1 <\/b>bis <b>4 <\/b>liefern.<\/li>\n<li>Ein Bindestrich vor einer Zahl soll alle Datens&auml;tze bis zu dieser Zahl liefern. <b>-5<\/b> soll also alle Datens&auml;tze von <b>1 <\/b>bis <b>5 <\/b>ausgeben.<\/li>\n<li>Ein Bindestrich nach einer Zahl soll alle Datens&auml;tze ab dieser Zahl liefern (einschlie&szlig;lich dieser Zahl). <b>3- <\/b>soll also alle Datens&auml;tze ab <b>3 <\/b>ausgeben.<\/li>\n<\/ul>\n<p>Diese M&ouml;glichkeiten sollen auch noch kombiniert werden k&ouml;nnen, und zwar jeweils getrennt durch das Komma-Zeichen.<\/p>\n<p>Und was auch noch nicht gekl&auml;rt ist: Worauf genau sollen sich die Zahlen beziehen Dazu gibt es zwei M&ouml;glichkeiten:<\/p>\n<ul>\n<li>Den Index der angezeigten Datens&auml;tze.<\/li>\n<li>Den Prim&auml;rschl&uuml;sselwert der angezeigten Datens&auml;tze.<\/li>\n<\/ul>\n<p>Da wir vorher nie wissen, wie die W&uuml;nsche des Benutzers aussehen, f&uuml;gen wir dazu noch eine Optionsgruppe mit den beiden M&ouml;glichkeiten hinzu.<\/p>\n<p>So kann der Benutzer auch nach der Sortierung etwa nach dem Artikelnamen die Datens&auml;tze nach dem Index filtern lassen. Dazu f&uuml;gen wir noch die Optionsgruppe <b>ogrFilter <\/b>wie in Bild 2 zum Hauptformular hinzu.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2020_01\/pic_1219_002.png\" alt=\"Optionsgruppe zum Einstellen des Kriteriums zum Filtern\" width=\"424,7115\" height=\"207,3395\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 2: Optionsgruppe zum Einstellen des Kriteriums zum Filtern<\/span><\/b><\/p>\n<p><b>Einzelne Filterausdr&uuml;cke extrahieren<\/b><\/p>\n<p>Wir beginnen einfach und wollen zun&auml;chst alle Filterausdr&uuml;cke aus dem Textfeld <b>txtBereiche<\/b> extrahieren. Das sind also alle Teile der im Textfeld enthaltenen Zeichenkette, die durch ein Komma voneinander getrennt werden.<\/p>\n<p>Um diese schnell zu erhalten, nutzen wir die <b>Split<\/b>-Funktion, um aus der Zeichenkette ein <b>String<\/b>-Array mit den einzelnen Elementen zu bilden.<\/p>\n<p>Dieses durchlaufen wir dann in einer <b>For&#8230;Next<\/b>-Schleife &uuml;ber alle Elemente. Die Indexwerte dieser Elemente ermitteln wir dabei mit den Funktionen <b>LBound <\/b>(unterer Indexwert) und <b>UBound <\/b>(oberer Indexwert):<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>cmdFiltern_Click()\r\n     <span style=\"color:blue;\">Dim <\/span>strFilter<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strBereiche<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strVergleichswerte()<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>i<span style=\"color:blue;\"> As Integer<\/span>\r\n     strBereiche = Nz(Me!txtBereiche, \"\")\r\n     strVergleichswerte = <span style=\"color:blue;\">Split<\/span>(strBereiche, \",\")\r\n     For i = <span style=\"color:blue;\">LBound<\/span>(strVergleichswerte) To  <span style=\"color:blue;\">UBound<\/span>(strVergleichswerte)\r\n         <span style=\"color:blue;\">Debug.Print<\/span> strVergleichswerte(i)\r\n     <span style=\"color:blue;\">Next<\/span> i\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Wenn der Benutzer nun <b>1,3,5 <\/b>eingibt, erhalten wir diese Ausgabe:<\/p>\n<pre>1\r\n3\r\n5<\/pre>\n<p>Damit l&auml;sst sich schon einmal arbeiten. Wenn wir Bereiche eingeben, erhalten wir auch die gew&uuml;nschten Informationen, zum Beispiel bei <b>-2, 4, 7-9, 75-<\/b>. Das liefert:<\/p>\n<pre>-2\r\n4\r\n7-9\r\n75-<\/pre>\n<p><b>Unzul&auml;ssige Zeichen erkennen<\/b><\/p>\n<p>Bevor wir &uuml;berhaupt in die Analyse der einzelnen, durch Kommata getrennten Elemente einsteigen, wollen wir direkt pr&uuml;fen, ob der Ausdruck unzul&auml;ssige Zeichen enth&auml;lt. Dazu nutzen wir die folgende Funktion, der wir zwei Parameter &uuml;bergeben:<\/p>\n<ul>\n<li>die zu untersuchende Zeichenfolge und <\/li>\n<li>eine Zeichenkette mit den zul&auml;ssigen Zeichen.<\/li>\n<\/ul>\n<p>Der Aufruf dieser Funktion sieht beispielsweise wie folgt aus:<\/p>\n<pre>  NurZulaessigeZeichen(\"x-2, 4, 7-9, 75-\", \"[0-9,-]\")<\/pre>\n<p>Als Ergebnis soll eine Zeichenkette ohne nicht zul&auml;ssige Zeichen zur&uuml;ckgeliefert werden.<\/p>\n<p>In diesem Fall ist das f&uuml;hrende <b>x <\/b>ein nicht zul&auml;ssiges Zeichen, also sollte der Aufruf dieses Ergebnis liefern:<\/p>\n<pre>-2, 4, 7-9, 75-<\/pre>\n<p>Die Funktion sieht wie folgt aus:<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>NurZulaessigeZeichen(strText<span style=\"color:blue;\"> As String<\/span>,  strZeichen<span style=\"color:blue;\"> As String<\/span>)\r\n     <span style=\"color:blue;\">Dim <\/span>i<span style=\"color:blue;\"> As Integer<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strTemp<span style=\"color:blue;\"> As String<\/span>\r\n     For i = 1 To <span style=\"color:blue;\">Len<\/span>(strText)\r\n         <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Mid<\/span>(strText, i, 1) Like strZeichen<span style=\"color:blue;\"> Then<\/span>\r\n             strTemp = strTemp & <span style=\"color:blue;\">Mid<\/span>(strText, i, 1)\r\n         <span style=\"color:blue;\">End If<\/span>\r\n     <span style=\"color:blue;\">Next<\/span> i\r\n     NurZulaessigeZeichen = strTemp\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p>Die Funktion erwartet die nicht zul&auml;ssigen Zeichen in einer Form, wie Sie mit einem <b>Like<\/b>-Vergleich genutzt werden kann, also in eckigen Klammern. Au&szlig;erdem k&ouml;nnen Bereiche von Zeichen wie etwa die Zahlen von <b>0 <\/b>bis <b>9 <\/b>vereinfacht durch <b>0-9 <\/b>angegeben werden.<\/p>\n<p>Die Funktion durchl&auml;uft alle Zeichen der zu untersuchenden Zeichenkette in einer <b>For&#8230;Next<\/b>-Schleife, wobei jeweils ein Zeichen mit dem <b>Like<\/b>-Operator mit den Vergleichszeichen vergleichen wird. Ist das Zeichen in den mit dem zweiten Parameter &uuml;bergebenen Zeichen enthalten, wird dieses an die Zeichenkette der Variablen <b>strTemp <\/b>angeh&auml;ngt. Diese wird nach dem Durchlaufen aller Zeichen an die aufrufende Instanz zur&uuml;ckgegeben.<\/p>\n<p>Der Sinn dieser Funktion ist in unserem Fall, unerw&uuml;nschte und gegebenenfalls versehentlich eingegebene Zeichen zu extrahieren. Diese Funktion bauen wir daher direkt in die Ereignisprozedur <b>cmdFiltern_Click <\/b>ein:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>cmdFiltern_Click()\r\n     ...\r\n     strBereiche = Nz(Me!txtBereiche, \"\")\r\n     strBereiche = NurZulaessigeZeichen(strBereiche,  \"[,-0-9]\")\r\n     ...\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b>Bereiche analysieren<\/b><\/p>\n<p>Diese Bereiche analysieren wir nun. Dabei gibt es die folgenden F&auml;lle: <\/p>\n<ul>\n<li>eine Zahl, zum Beispiel <b>4<\/b>,<\/li>\n<li>eine Zahl mit folgendem Bindestrich, zum Beispiel <b>75-<\/b>,<\/li>\n<li>eine Zahl mir f&uuml;hrendem Bindestrich, zum Beispiel <b>-2 <\/b>und<\/li>\n<li>zwei durch einen Bindestrich getrennte Zahlen, zum Beispiel <b>7-9<\/b>.<\/li>\n<\/ul>\n<p>Diese vier F&auml;lle m&uuml;ssen wir zun&auml;chst erkennen. Dazu verwenden wir eine neue Funktion, die wir in der <b>For&#8230;Next<\/b>-Schleife f&uuml;r jedes durch Komma getrennte Element einmal aufrufen:<\/p>\n<pre>For i = <span style=\"color:blue;\">LBound<\/span>(strVergleichswerte) To  <span style=\"color:blue;\">UBound<\/span>(strVergleichswerte)\r\n     <span style=\"color:blue;\">Debug.Print<\/span> strVergleichswerte(i)\r\n     FilterkriteriumErmitteln strVergleichswerte(i)\r\n<span style=\"color:blue;\">Next<\/span> i<\/pre>\n<p>Die Funktion sieht zun&auml;chst wie folgt aus:<\/p>\n<pre><span style=\"color:blue;\">Private Function <\/span>FilterkriteriumErmitteln(ByVal  strVergleichswert<span style=\"color:blue;\"> As String<\/span>)\r\n     <span style=\"color:blue;\">Dim <\/span>intPos<span style=\"color:blue;\"> As Integer<\/span>\r\n     strVergleichswert = <span style=\"color:blue;\">Replace<\/span>(strVergleichswert, \" \", \"\")\r\n     intPos = <span style=\"color:blue;\">InStr<\/span>(1, strVergleichswert, \"-\")\r\n     Select Case intPos\r\n         <span style=\"color:blue;\">Case <\/span>0\r\n             <span style=\"color:blue;\">Debug.Print<\/span> \"kein Minus\"\r\n         <span style=\"color:blue;\">Case <\/span>1\r\n             <span style=\"color:blue;\">Debug.Print<\/span> \"Minus an erster Stelle\"\r\n         <span style=\"color:blue;\">Case Else<\/span>\r\n             <span style=\"color:blue;\">If <\/span>intPos = <span style=\"color:blue;\">Len<\/span>(strVergleichswert)<span style=\"color:blue;\"> Then<\/span>\r\n                 <span style=\"color:blue;\">Debug.Print<\/span> \"Minus an letzter Stelle\"\r\n             <span style=\"color:blue;\">Else<\/span>\r\n                 <span style=\"color:blue;\">Debug.Print<\/span> \"Minus dazwischen\"\r\n             <span style=\"color:blue;\">End If<\/span>\r\n     <span style=\"color:blue;\">End Select<\/span>\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p>Die Funktion ersetzt zun&auml;chst alle Leerzeichen durch leere Zeichenketten. Dann ermittelt sie in der Variablen <b>intPos <\/b>die Position des Minuszeichens (<b>&#8211;<\/b>). Im Falle von <b>0 <\/b>ist kein Minuszeichen vorhanden, was wir aktuell einfach im Direktbereich vermerken. Lautet der Wert von <b>intPos <\/b>hingegen <b>1<\/b>, befindet sich das Minuszeichen an der ersten Stelle, was auf einen Ausdruck wie <b>-3 <\/b>hindeutet. In allen anderen F&auml;llen ist eine weitere Untersuchung n&ouml;tig, die wir im <b>Else<\/b>-Zweig der <b>Select Case<\/b>-Bedingung pr&uuml;fen. Hier pr&uuml;fen wir, ob <b>intPos <\/b>gleich der Anzahl der Zeichen der &uuml;bergebenen Zeichenkette entspricht, was bedeuten w&uuml;rde, dass sich das Minus-Zeichen an der letzten Stelle befindet. In allen anderen F&auml;llen befindet sich das Minuszeichen nicht an erster und nicht an letzter Stelle, der Ausdruck sollte also wie 1-3 lauten.<\/p>\n<p><!--30percent--><\/p>\n<p><b>Vergleichsausdr&uuml;cke ermitteln<\/b><\/p>\n<p>Nun reichern wir die obige Prozedur um die resultierenden Vergleichsausdr&uuml;cke an. Dabei betrachten wir zun&auml;chst nur den Fall, dass wir das <b>ID<\/b>-Feld als Vergleichsfeld nutzen wollen und nicht den Index der angezeigten Elemente &#8211; der ist n&auml;mlich noch etwas komplizierter zu handhaben.<\/p>\n<p>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.<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>FilterkriteriumErmitteln(strVergleichsfeld<span style=\"color:blue;\"> As String<\/span>, ByVal strVergleichswert<span style=\"color:blue;\"> As String<\/span>)\r\n     <span style=\"color:blue;\">Dim <\/span>intPos<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strVergleichsausdruck<span style=\"color:blue;\"> As String<\/span>\r\n     strVergleichswert = <span style=\"color:blue;\">Replace<\/span>(strVergleichswert, \" \", \"\")\r\n     intPos = <span style=\"color:blue;\">InStr<\/span>(1, strVergleichswert, \"-\")\r\n     Select Case intPos\r\n         <span style=\"color:blue;\">Case <\/span>0\r\n             strVergleichsausdruck = strVergleichsfeld & \" = \" & strVergleichswert\r\n         <span style=\"color:blue;\">Case <\/span>1\r\n             strVergleichsausdruck = strVergleichsfeld & \" &lt;= \" & <span style=\"color:blue;\">Mid<\/span>(strVergleichswert, intPos + 1)\r\n         <span style=\"color:blue;\">Case Else<\/span>\r\n             <span style=\"color:blue;\">If <\/span>intPos = <span style=\"color:blue;\">Len<\/span>(strVergleichswert)<span style=\"color:blue;\"> Then<\/span>\r\n                 strVergleichsausdruck = strVergleichsfeld & \" &gt;= \" & <span style=\"color:blue;\">Mid<\/span>(strVergleichswert, 1, intPos - 1)\r\n             <span style=\"color:blue;\">Else<\/span>\r\n                 strVergleichsausdruck = \"(\" & strVergleichsfeld & \" &gt;= \" & <span style=\"color:blue;\">Mid<\/span>(strVergleichswert, 1, intPos - 1) _\r\n                     & \" AND \" & strVergleichsfeld & \" &lt;= \" & <span style=\"color:blue;\">Mid<\/span>(strVergleichswert, intPos + 1) & \")\"\r\n             <span style=\"color:blue;\">End If<\/span>\r\n     <span style=\"color:blue;\">End Select<\/span>\r\n     FilterkriteriumErmitteln = strVergleichsausdruck\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 1: Ermittlung der Vergleichsausdr&uuml;cke<\/span><\/b><\/p>\n<p>Im ersten <b>Case<\/b>-Zweig der <b>Select Case<\/b>-Bedingung tragen wir f&uuml;r die Variable <b>strVergleichsausdruck <\/b>den Namen des Vergleichsfeldes, ein Gleichheitszeichen und den Vergleichswert ein, und zwar in der Form <b><Vergleichsfeld> = <Vergleichswert><\/b>.<\/p>\n<p>Der <b>Case<\/b>-Zweig, der davon ausgeht, dass das Minuszeichen gleich das erste Zeichen ist, f&uuml;gt den Namen des Vergleichsfelds mit dem Vergleichsoperator <b><= <\/b>und dem Teil aus <b>strVergleichswert <\/b>zusammen, der nach dem Minuszeichen folgt, also in der Form <b><Vergleichsfeld> <= <Vergleichswert><\/b>.<\/p>\n<p>Im <b>If<\/b>-Teil der <b>If&#8230;Then<\/b>-Bedingung des <b>Else<\/b>-Zweigs der <b>Select Case<\/b>-Bedingung, der davon ausgeht, dass sich das Minuszeichen am Ende von <b>strVergleichswert <\/b>befindet, f&uuml;gen wir in <b>strVergleichsausdruck <\/b>den Wert aus <b>strVergleichsfeld<\/b>, den Vergleichsoperator <b>>= <\/b>und den Inhalt aus <b>strVergleichswert <\/b>bis zum Minuszeichen zusammen. Der Ausdruck lautet dann <b><Vergleichsfeld> >= <Vergleichswert><\/b>.<\/p>\n<p>Schlie&szlig;lich folgt noch der <b>Else<\/b>-Teil der If<b>&#8230;Then<\/b>-Bedingung aus dem <b>Else<\/b>-Teil der <b>Select Case<\/b>-Bedingung. Dieser nimmt an, dass das Minuszeichen sich zwischen zwei Zahlenwerten befindet. Hier soll der Vergleichsausdruck sp&auml;ter <b>(<Vergleichsfeld> => <Vergleichswert> AND <Vergleichsfeld> <= <Vergleichswert>) <\/b>lauten.<\/p>\n<p>Der in <b>strVergleichsausdruck <\/b>enthaltene Vergleichsausdruck wird dann als Funktionsergebnis an die aufrufende Routine zur&uuml;ckgegeben.<\/p>\n<p>In der <b>For&#8230;Next<\/b>-Schleife der aufrufenden Prozedur, die nun wie in Listing 2 aussieht, stellen wir nun in der Variablen <b>strFilterkriterium <\/b>die einzelnen Kriterienausdr&uuml;cke zusammen. Dabei stellen wir jedem Ausdruck zun&auml;chst den <b>OR<\/b>-Operator voran.<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>cmdFiltern_Click()\r\n     <span style=\"color:blue;\">Dim <\/span>strFilter<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strBereiche<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strVergleichswerte()<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strFilterkriterium<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>i<span style=\"color:blue;\"> As Integer<\/span>\r\n     strBereiche = Nz(Me!txtBereiche, \"\")\r\n     strBereiche = NurZulaessigeZeichen(strBereiche, \"[0-9,-]\")\r\n     strVergleichswerte = <span style=\"color:blue;\">Split<\/span>(strBereiche, \",\")\r\n     For i = <span style=\"color:blue;\">LBound<\/span>(strVergleichswerte) To <span style=\"color:blue;\">UBound<\/span>(strVergleichswerte)\r\n         strFilterkriterium = strFilterkriterium & \" OR \" & FilterkriteriumErmitteln(\"ArtikelID\", strVergleichswerte(i))\r\n     <span style=\"color:blue;\">Next<\/span> i\r\n     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Len<\/span>(strFilterkriterium) &gt; 0<span style=\"color:blue;\"> Then<\/span>\r\n         strFilterkriterium = <span style=\"color:blue;\">Mid<\/span>(strFilterkriterium, 5)\r\n         <span style=\"color:blue;\">With<\/span> Me!sfmArtikelNachBereich.Form\r\n             .Filter = strFilterkriterium\r\n             .FilterOn = <span style=\"color:blue;\">True<\/span>\r\n         End <span style=\"color:blue;\">With<\/span>\r\n     <span style=\"color:blue;\">Else<\/span>\r\n         Me!sfmArtikelNachBereich.Form.Filter = \"\"\r\n     <span style=\"color:blue;\">End If<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 2: Setzen des Filters<\/span><\/b><\/p>\n<p>F&uuml;r unseren weiter oben vorgestellten Ausdruck <b>-2, 4, 7-9, 75- <\/b>enh&auml;lt <b>strFilterkriterium <\/b>beim ersten Aufruf also folgenden Ausdruck:<\/p>\n<pre>  OR ArtikelID &lt;= 2<\/pre>\n<p>In den folgenden Durchl&auml;ufen wird der Ausdruck dann zu folgendem Ausdruck erg&auml;nzt:<\/p>\n<pre>  OR ArtikelID &lt;= 2 OR ArtikelID = 4 OR (ArtikelID &gt;= 7 AND ArtikelID &lt;= 9) OR ArtikelID &gt;= 75<\/pre>\n<p>Die folgende <b>If&#8230;Then<\/b>-Bedingung pr&uuml;ft dann, ob <b>strFilterkriterium <\/b>eine Zeichenkette mit einer L&auml;nge gr&ouml;&szlig;er <b>0 <\/b>enth&auml;lt. Ist das der Fall, schneidet die Prozedur zun&auml;chst das f&uuml;hrende <b>OR <\/b>ab, sodass dieser Ausdruck &uuml;brigbleibt:<\/p>\n<pre>ArtikelID &lt;= 2 OR ArtikelID = 4 OR (ArtikelID &gt;= 7 AND ArtikelID &lt;= 9) OR ArtikelID &gt;= 75<\/pre>\n<p>Diesen Ausdruck weisen wir dann der Eigenschaft <b>Filter <\/b>des Formulars im Unterformular-Steuerelement zu und aktivieren den Filter, indem wir die Eigenschaft <b>FilterOn <\/b>auf <b>True <\/b>einstellen.<\/p>\n<p>Wenn <b>strFilterkriterium <\/b>hingegen eine leere Zeichenkette enth&auml;lt, f&uuml;hrt die Prozedur den <b>Else<\/b>-Teil der <b>If&#8230;Then<\/b>-Bedingung aus, welcher die Eigenschaft <b>Filter <\/b>auf eine leere Zeichenkette einstellt und somit den Filter zur&uuml;cksetzt.<\/p>\n<p>Das Ergebnis sieht nun wie in Bild 3 aus und entspricht genau den Erwartungen.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2020_01\/pic_1219_003.png\" alt=\"Erster Test der Filterfunktion\" width=\"499,6607\" height=\"392,2813\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 3: Erster Test der Filterfunktion<\/span><\/b><\/p>\n<p><b>Filtern nach Index<\/b><\/p>\n<p>Das Filtern nach dem Index ist noch ein wenig komplizierter, da wir f&uuml;r jedes angezeigte Element &uuml;ber den Index erst den Prim&auml;rschl&uuml;sselwert ermitteln und dann nach diesem filtern m&uuml;ssen.<\/p>\n<p> Als Erstes erweitern wir die Ereignisprozedur, die durch das Anklicken der Schaltfl&auml;che <b>cmdFiltern <\/b>ausgel&ouml;st wird. Innerhalb der <b>For&#8230;Next<\/b>-Schleife, die alle Elemente des Arrays <b>strVergleichswerte <\/b>durchl&auml;uft, f&uuml;gen wir nun noch eine <b>If&#8230;Then<\/b>-Bedingung hinzu, die pr&uuml;ft, ob die Optionsgruppe <b>ogrFilter <\/b>den Wert <b>1 <\/b>(<b>ID<\/b>) oder <b>2 <\/b>(<b>Index<\/b>) aufweist.<\/p>\n<p>Im Fall des Wertes <b>1 <\/b>behalten wir den bisherigen Aufruf der Funktion <b>FilterkriteriumErmitteln <\/b>bei, den wir auch weiter oben bereits beschrieben haben. <\/p>\n<p>Anderenfalls rufen wir eine neue Funktion namens <b>FilterkriteriumErmittelnIndex <\/b>auf, der wir das Recordset des Unterformulars als ersten Parameter &uuml;bergeben. Als zweiten und dritten Parameter &uuml;bergeben wir die gleichen Werte, die wir auch bisher schon &uuml;bergeben haben &#8211; also den Namen des Prim&auml;rschl&uuml;sselfeldes und den aktuellen Wert des Arrays <b>strVergleichswerte<\/b> (siehe Listing 3).<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>cmdFiltern_Click()\r\n     ...\r\n     For i = <span style=\"color:blue;\">LBound<\/span>(strVergleichswerte) To <span style=\"color:blue;\">UBound<\/span>(strVergleichswerte)\r\n         <span style=\"color:blue;\">If <\/span>Me!ogrFilter = 1<span style=\"color:blue;\"> Then<\/span>\r\n             strFilterkriterium = strFilterkriterium & \" OR \" & FilterkriteriumErmitteln(\"ArtikelID\", _\r\n                 strVergleichswerte(i))\r\n         <span style=\"color:blue;\">Else<\/span>\r\n             strFilterkriterium = strFilterkriterium & \" OR \" & FilterkriteriumErmittelnIndex( _\r\n                 Me!sfmArtikelNachBereich.Form.Recordset, \"ArtikelID\", strVergleichswerte(i))\r\n         <span style=\"color:blue;\">End If<\/span>\r\n     <span style=\"color:blue;\">Next<\/span> i\r\n     ...\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 3: Erweiterte Version der Prozedur, die beim Filtern ausgel&ouml;st wird<\/span><\/b><\/p>\n<p>Die Funktion <b>FilterkriteriumErmittelnIndex <\/b>finden Sie in Listing 4. Sie entfernt wieder die Leerzeichen aus dem &uuml;bergebenen Vergleichswert, der genauso aufgebaut sein kann wie die Vergleichswerte, die wir f&uuml;r das Filtern nach dem Prim&auml;rschl&uuml;sselwerten (<b>ID<\/b>) weiter oben verwendet haben &#8211; also beispielsweise <b>-2, 4, 7-9, 75-<\/b>. Der Unterschied ist nun, dass wir die Werte und Bereiche nicht auf den Prim&auml;rschl&uuml;sselwert anwenden, sondern auf den Index der Eintr&auml;ge im Datenblatt. Ein weiterer Vorteil ist, dass die Funktion die aktuelle Sortierung ber&uuml;cksichtigt. Wenn Sie also beispielsweise vorher nach dem Artikelnamen sortieren statt nach dem Prim&auml;rschl&uuml;sselwert, verwendet die Funktion den aktuellen Index mit Sortierung nach dem Artikelnamen.<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>FilterkriteriumErmittelnIndex(rst<span style=\"color:blue;\"> As <\/span>DAO.Recordset, strVergleichsfeld<span style=\"color:blue;\"> As String<\/span>, _\r\n         ByVal strVergleichswert<span style=\"color:blue;\"> As String<\/span>)\r\n     <span style=\"color:blue;\">Dim <\/span>intPos<span style=\"color:blue;\"> As Integer<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strVergleichsausdruck<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>l<span style=\"color:blue;\"> As Long<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strIN<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>lngMax<span style=\"color:blue;\"> As Long<\/span>\r\n     strVergleichswert = <span style=\"color:blue;\">Replace<\/span>(strVergleichswert, \" \", \"\")\r\n     intPos = <span style=\"color:blue;\">InStr<\/span>(1, strVergleichswert, \"-\")\r\n     Select Case intPos\r\n         <span style=\"color:blue;\">Case <\/span>0\r\n             strVergleichsausdruck = strVergleichsfeld & \" = \" & IndexErmitteln(rst, strVergleichsfeld, _\r\n                 CLng(strVergleichswert))\r\n         <span style=\"color:blue;\">Case <\/span>1\r\n             For l = 1 To <span style=\"color:blue;\">Mid<\/span>(strVergleichswert, intPos + 1)\r\n                 strIN = strIN & \", \" & IndexErmitteln(rst, strVergleichsfeld, l)\r\n             <span style=\"color:blue;\">Next<\/span> l\r\n             <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Len<\/span>(strIN) &gt; 0<span style=\"color:blue;\"> Then<\/span>\r\n                 strIN = <span style=\"color:blue;\">Mid<\/span>(strIN, 2)\r\n                 strVergleichsausdruck = strVergleichsfeld & \" IN (\" & strIN & \")\"\r\n             <span style=\"color:blue;\">End If<\/span>\r\n         <span style=\"color:blue;\">Case Else<\/span>\r\n             <span style=\"color:blue;\">If <\/span>intPos = <span style=\"color:blue;\">Len<\/span>(strVergleichswert)<span style=\"color:blue;\"> Then<\/span>\r\n                 For l = <span style=\"color:blue;\">Mid<\/span>(strVergleichswert, 1, intPos - 1) To rst.RecordCount\r\n                     strIN = strIN & \", \" & IndexErmitteln(rst, strVergleichsfeld, CLng(l))\r\n                 <span style=\"color:blue;\">Next<\/span> l\r\n             <span style=\"color:blue;\">Else<\/span>\r\n                 lngMax = <span style=\"color:blue;\">Mid<\/span>(strVergleichswert, intPos + 1)\r\n                 <span style=\"color:blue;\">If <\/span>lngMax &gt; rst.RecordCount<span style=\"color:blue;\"> Then<\/span>\r\n                     lngMax = rst.RecordCount\r\n                 <span style=\"color:blue;\">End If<\/span>\r\n                 For l = <span style=\"color:blue;\">Mid<\/span>(strVergleichswert, 1, intPos - 1) To lngMax\r\n                     strIN = strIN & \", \" & IndexErmitteln(rst, strVergleichsfeld, CLng(l))\r\n                 <span style=\"color:blue;\">Next<\/span> l\r\n             <span style=\"color:blue;\">End If<\/span>\r\n             <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Len<\/span>(strIN) &gt; 0<span style=\"color:blue;\"> Then<\/span>\r\n                 strIN = <span style=\"color:blue;\">Mid<\/span>(strIN, 2)\r\n                 strVergleichsausdruck = strVergleichsfeld & \" IN (\" & strIN & \")\"\r\n             <span style=\"color:blue;\">End If<\/span>\r\n     <span style=\"color:blue;\">End Select<\/span>\r\n     FilterkriteriumErmittelnIndex = strVergleichsausdruck\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 4: Funktion zum Ermitteln der Vergleichsausdr&uuml;cke zum Filtern nach dem Index<\/span><\/b><\/p>\n<p>Der grunds&auml;tzliche Aufbau der Funktion ist mit der vorherigen identisch &#8211; wir haben wieder eine <b>Select Case<\/b>-Anweisung mit drei <b>Case<\/b>-Zweigen, von denen der letzte wieder eine <b>If&#8230;Then<\/b>-Bedingung enth&auml;lt.<\/p>\n<p>Der erste <b>Case<\/b>-Zweig behandelt einzelne Indexwerte, also etwa <b>4<\/b>. Sie verwendet eine Hilfsfunktion namens <b>IndexErmitteln<\/b>, die wieder das Recordset, den Namen des Vergleichsfeldes und die Nummer des Vergleichswertes als <b>Long<\/b>-Wert erwartet. Diese Funktion soll den Prim&auml;rschl&uuml;sselwert f&uuml;r den Datensatz mit dem angegebenen Index ermitteln. Dazu erstellt sie ein Recordset-Clone, verschiebt den Datensatzzeiger &uuml;ber die <b>AbsolutePosition<\/b>-Eigenschaft auf die Position mit dem entsprechenden Index (minus <b>1<\/b>, da dieser im Gegensatz zu dem &uuml;bergebenen Wert 0-basiert ist). Der R&uuml;ckgabewert ist dann schlie&szlig;lich der Prim&auml;rschl&uuml;sselwert dieses Datensatzes:<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>IndexErmitteln(rst<span style=\"color:blue;\"> As <\/span>DAO.Recordset,  strVergleichsfeld<span style=\"color:blue;\"> As String<\/span>, lngIndex<span style=\"color:blue;\"> As Long<\/span>)<span style=\"color:blue;\"> As Long<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>rstClone<span style=\"color:blue;\"> As <\/span>DAO.Recordset\r\n     <span style=\"color:blue;\">Set<\/span> rstClone = rst.Clone\r\n     rstClone.AbsolutePosition = lngIndex - 1\r\n     IndexErmitteln = rstClone(strVergleichsfeld)\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p>Dadurch entsteht dann in unseren Beispieldaten bei einem gesuchten Index von <b>4 <\/b>ein Ausdruck wie <b>ArtikelID = 60<\/b>.<\/p>\n<p>In den anderen drei F&auml;llen wird es etwas komplizierter. Hier m&uuml;ssen wir alle Datens&auml;tze durchgehen, die durch die Angabe von Bereichen wie <b>-2<\/b>, <b>7-9 <\/b>oder <b>75- <\/b>angegeben werden.<\/p>\n<p>Falls sich das Minuszeichen an der ersten Position befindet, wollen wir alle Datens&auml;tze filtern, deren Index sich zwischen der ersten Position befindet und der Position, die durch die folgende Zahl angegeben ist &#8211; bei <b>-2 <\/b>also die Datens&auml;tze an Position <b>1 <\/b>und Position <b>2<\/b>. Dazu durchlaufen wir eine <b>For&#8230;Next<\/b>-Schleife &uuml;ber diese Zahlenwerte, also von <b>1 <\/b>bis <b>2<\/b>. In dieser Schleife f&uuml;gen wir dann in der <b>String<\/b>-Variablen <b>strIN <\/b>eine Zeichenkette zusammen, die jeweils aus einem Komma und dem mit der Funktion <b>IndexErmitteln <\/b>ermittelten Prim&auml;rschl&uuml;sselwert besteht.<\/p>\n<p>F&uuml;r unsere Beispieldaten kommt dann f&uuml;r den Ausdruck <b>-2 <\/b>nach der <b>For&#8230;Next<\/b>-Schleife der Wert <b>, 17, 3<\/b> f&uuml;r <b>strIN <\/b>heraus. Dadurch findet die folgende <b>If&#8230;Then<\/b>-Bedingung heraus, dass <b>strIN <\/b>mehr als null Zeichen enth&auml;lt. Dadurch werden innerhalb der Bedingung zun&auml;chst das f&uuml;hrende Komma und das Leerzeichen abgeschnitten, sodass <b>17, 3<\/b> &uuml;brigbleibt. In <b>strVergleichsausdruck <\/b>wird dann ein Ausdruck wie <b>ArtikelID IN (17, 3) <\/b>zusammengef&uuml;hrt.<\/p>\n<p>Logisch: Wir k&ouml;nnen, wenn wir nach den Prim&auml;rschl&uuml;sselwerten filtern wollen, die nicht unbedingt aufsteigend sortiert sein m&uuml;ssen, keine Bereiche mehr angeben, sondern m&uuml;ssen mit einer <b>IN<\/b>-Klausel genau die zu filternden Elemente angeben.<\/p>\n<p>Wenn sich das Minuszeichen nicht am Anfang der Zeichenkette aus <b>strVergleichswert <\/b>befindet, kommt der dritte <b>Case<\/b>-Zweig zur Geltung. Hier finden wir wie in der Funktion <b>FilterkriteriumErmitteln <\/b>eine <b>If&#8230;Then<\/b>-Bedingung, die danach unterscheidet, ob sich das Minuszeichen in <b>strVergleichswert <\/b>an der letzten Position befindet (wie in <b>75-<\/b>) oder nicht &#8211; dann handelt es sich um einen Ausdruck wie <b>7-9<\/b>.<\/p>\n<p>Im ersten Fall durchlaufen wir wieder eine <b>For&#8230;Next<\/b>-Schleife, und zwar von dem Zahlenwert, der sich vor dem Minuszeichen befindet bis zur Anzahl der Datens&auml;tze des Recordsets.<\/p>\n<p>Innerhalb der <b>For&#8230;Next<\/b>-Schleife stellt die Prozedur wie im vorherigen Fall in <b>strIN <\/b>eine Liste der mit der Funktion <b>IndexErmitteln <\/b>gefundenen Elemente zusammen. Diese wird nach Abschluss der <b>If&#8230;Then<\/b>-Bedingung wieder zu einer vollst&auml;ndigen Bedingung zusammengestellt, mit unseren Beispieldaten beim Ausdruck <b>75- <\/b>also zu <b>ArtikelID IN ( 63, 64, 47)<\/b>.<\/p>\n<p>Und in dem Fall, dass sich das Minuszeichen zwischen zwei Zahlenwerten befindet, stellen wir die <b>For&#8230;Next<\/b>-Schleife so zusammen, dass der Startwert dem ersten Zahlenwert entspricht (bei <b>7-9 <\/b>also <b>7<\/b>) und der Endwert dem zweiten Zahlenwert (<b>9<\/b>). Der resultierende Ausdruck lautet dann <b>ArtikelID IN ( 2, 39, 4)<\/b>.<\/p>\n<p>Hier kann es sein, dass der zweite Wert gr&ouml;&szlig;er ist als die Anzahl der angezeigten Datens&auml;tze. In diesem Fall wird der zweite Wert auf die Anzahl der Datens&auml;tze eingestellt.<\/p>\n<p><b>Usability<\/b><\/p>\n<p>Um direkt nach der Eingabe der Zahlenbereiche filtern zu k&ouml;nnen, belegen wir die Eigenschaft <b>Standard <\/b>der Schaltfl&auml;che <b>cmdFiltern <\/b>mit dem Wert <b>Ja<\/b>. Dadurch l&ouml;st das Bet&auml;tigen der Eingabetaste innerhalb des Formulars immer direkt die Ereignisprozedur der Schaltfl&auml;che <b>cmdFiltern <\/b>aus.<\/p>\n<p><b>Zusammenfassung und Ausblick<\/b><\/p>\n<p>Mit der hier vorgestellten L&ouml;sung kann der Benutzer die Datens&auml;tze einer Datenblattansicht &uuml;ber die Angabe von einzelnen Prim&auml;rschl&uuml;sselwerten oder von Bereichen von Prim&auml;rschl&uuml;sselwerten filtern. Oder er stellt um auf das Filtern nach dem Index &#8211; dann kann er nach den Positionen filtern, unter denen die Eintr&auml;ge zu finden sind.<\/p>\n<p>Damit haben wir die Funktion, die sich sonst in Drucken-Dialogen zur Auswahl der zu druckenden Seiten findet, f&uuml;r die Anzeige von Datens&auml;tzen abgebildet.<\/p>\n<h3>Downloads zu diesem Beitrag<\/h3>\n<p>Enthaltene Beispieldateien:<\/p>\n<p>DatensaetzeNachZahlAusgeben.accdb<\/p>\n<p><a href=\"..\/fileadmin\/beispiele\/C6946884-4255-44BD-92C5-3A76418576C9\/aiu_1219.zip\">Download<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Sie kennen das sicher vom Drucken-Dialog, wo Sie einzelne Zahlen oder Zahlenbereiche angeben k&ouml;nnen, um die betroffenen Seiten zu drucken &#8211; also beispielsweise 1-2, 3-5 und so weiter. Eine solche M&ouml;glichkeit wollen wir auch f&uuml;r das Filtern von Datens&auml;tzen in der Datenblattansicht schaffen. Der Benutzer soll also eine oder mehrere Seitenzahlen oder Bereiche von Seiten in ein Textfeld eingeben k&ouml;nnen, nach denen dann gefiltert wird.<\/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":[66012020,662020,44000023],"tags":[],"class_list":["post-55001219","post","type-post","status-publish","format-standard","hentry","category-66012020","category-662020","category-Mit_Formularen_arbeiten"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.9 (Yoast SEO v27.4) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Datens&auml;tze nach Zahl ausgeben - 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\/Datensaetze_nach_Zahl_ausgeben\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Datens&auml;tze nach Zahl ausgeben\" \/>\n<meta property=\"og:description\" content=\"Sie kennen das sicher vom Drucken-Dialog, wo Sie einzelne Zahlen oder Zahlenbereiche angeben k&ouml;nnen, um die betroffenen Seiten zu drucken - also beispielsweise 1-2, 3-5 und so weiter. Eine solche M&ouml;glichkeit wollen wir auch f&uuml;r das Filtern von Datens&auml;tzen in der Datenblattansicht schaffen. Der Benutzer soll also eine oder mehrere Seitenzahlen oder Bereiche von Seiten in ein Textfeld eingeben k&ouml;nnen, nach denen dann gefiltert wird.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/access-im-unternehmen.de\/Datensaetze_nach_Zahl_ausgeben\/\" \/>\n<meta property=\"og:site_name\" content=\"Access im Unternehmen\" \/>\n<meta property=\"article:published_time\" content=\"2020-07-10T09:39:23+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/vg06.met.vgwort.de\/na\/8826b115ffba496c8718accb25feda83\" \/>\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=\"8\u00a0Minuten\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Datensaetze_nach_Zahl_ausgeben\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Datensaetze_nach_Zahl_ausgeben\\\/\"},\"author\":{\"name\":\"Andr\u00e9 Minhorst\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\"},\"headline\":\"Datens&auml;tze nach Zahl ausgeben\",\"datePublished\":\"2020-07-10T09:39:23+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Datensaetze_nach_Zahl_ausgeben\\\/\"},\"wordCount\":1311,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Datensaetze_nach_Zahl_ausgeben\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg06.met.vgwort.de\\\/na\\\/8826b115ffba496c8718accb25feda83\",\"articleSection\":[\"1\\\/2020\",\"2020\",\"Mit Formularen arbeiten\"],\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Datensaetze_nach_Zahl_ausgeben\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Datensaetze_nach_Zahl_ausgeben\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Datensaetze_nach_Zahl_ausgeben\\\/\",\"name\":\"Datens&auml;tze nach Zahl ausgeben - Access im Unternehmen\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Datensaetze_nach_Zahl_ausgeben\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Datensaetze_nach_Zahl_ausgeben\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg06.met.vgwort.de\\\/na\\\/8826b115ffba496c8718accb25feda83\",\"datePublished\":\"2020-07-10T09:39:23+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Datensaetze_nach_Zahl_ausgeben\\\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Datensaetze_nach_Zahl_ausgeben\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Datensaetze_nach_Zahl_ausgeben\\\/#primaryimage\",\"url\":\"http:\\\/\\\/vg06.met.vgwort.de\\\/na\\\/8826b115ffba496c8718accb25feda83\",\"contentUrl\":\"http:\\\/\\\/vg06.met.vgwort.de\\\/na\\\/8826b115ffba496c8718accb25feda83\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Datensaetze_nach_Zahl_ausgeben\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Datens&auml;tze nach Zahl ausgeben\"}]},{\"@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":"Datens&auml;tze nach Zahl ausgeben - 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\/Datensaetze_nach_Zahl_ausgeben\/","og_locale":"de_DE","og_type":"article","og_title":"Datens&auml;tze nach Zahl ausgeben","og_description":"Sie kennen das sicher vom Drucken-Dialog, wo Sie einzelne Zahlen oder Zahlenbereiche angeben k&ouml;nnen, um die betroffenen Seiten zu drucken - also beispielsweise 1-2, 3-5 und so weiter. Eine solche M&ouml;glichkeit wollen wir auch f&uuml;r das Filtern von Datens&auml;tzen in der Datenblattansicht schaffen. Der Benutzer soll also eine oder mehrere Seitenzahlen oder Bereiche von Seiten in ein Textfeld eingeben k&ouml;nnen, nach denen dann gefiltert wird.","og_url":"https:\/\/access-im-unternehmen.de\/Datensaetze_nach_Zahl_ausgeben\/","og_site_name":"Access im Unternehmen","article_published_time":"2020-07-10T09:39:23+00:00","og_image":[{"url":"http:\/\/vg06.met.vgwort.de\/na\/8826b115ffba496c8718accb25feda83","type":"","width":"","height":""}],"author":"Andr\u00e9 Minhorst","twitter_card":"summary_large_image","twitter_misc":{"Verfasst von":"Andr\u00e9 Minhorst","Gesch\u00e4tzte Lesezeit":"8\u00a0Minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/access-im-unternehmen.de\/Datensaetze_nach_Zahl_ausgeben\/#article","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/Datensaetze_nach_Zahl_ausgeben\/"},"author":{"name":"Andr\u00e9 Minhorst","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f"},"headline":"Datens&auml;tze nach Zahl ausgeben","datePublished":"2020-07-10T09:39:23+00:00","mainEntityOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Datensaetze_nach_Zahl_ausgeben\/"},"wordCount":1311,"commentCount":0,"publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Datensaetze_nach_Zahl_ausgeben\/#primaryimage"},"thumbnailUrl":"http:\/\/vg06.met.vgwort.de\/na\/8826b115ffba496c8718accb25feda83","articleSection":["1\/2020","2020","Mit Formularen arbeiten"],"inLanguage":"de","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/access-im-unternehmen.de\/Datensaetze_nach_Zahl_ausgeben\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/access-im-unternehmen.de\/Datensaetze_nach_Zahl_ausgeben\/","url":"https:\/\/access-im-unternehmen.de\/Datensaetze_nach_Zahl_ausgeben\/","name":"Datens&auml;tze nach Zahl ausgeben - Access im Unternehmen","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/#website"},"primaryImageOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Datensaetze_nach_Zahl_ausgeben\/#primaryimage"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Datensaetze_nach_Zahl_ausgeben\/#primaryimage"},"thumbnailUrl":"http:\/\/vg06.met.vgwort.de\/na\/8826b115ffba496c8718accb25feda83","datePublished":"2020-07-10T09:39:23+00:00","breadcrumb":{"@id":"https:\/\/access-im-unternehmen.de\/Datensaetze_nach_Zahl_ausgeben\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/access-im-unternehmen.de\/Datensaetze_nach_Zahl_ausgeben\/"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/access-im-unternehmen.de\/Datensaetze_nach_Zahl_ausgeben\/#primaryimage","url":"http:\/\/vg06.met.vgwort.de\/na\/8826b115ffba496c8718accb25feda83","contentUrl":"http:\/\/vg06.met.vgwort.de\/na\/8826b115ffba496c8718accb25feda83"},{"@type":"BreadcrumbList","@id":"https:\/\/access-im-unternehmen.de\/Datensaetze_nach_Zahl_ausgeben\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/access-im-unternehmen.de\/"},{"@type":"ListItem","position":2,"name":"Datens&auml;tze nach Zahl ausgeben"}]},{"@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\/55001219","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=55001219"}],"version-history":[{"count":0,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55001219\/revisions"}],"wp:attachment":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/media?parent=55001219"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/categories?post=55001219"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/tags?post=55001219"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}