{"id":55000656,"date":"2009-04-01T00:00:00","date_gmt":"2020-05-22T22:22:01","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=656"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"Reihenfolge_manuell_anpassen","status":"publish","type":"post","link":"https:\/\/access-im-unternehmen.de\/Reihenfolge_manuell_anpassen\/","title":{"rendered":"Reihenfolge manuell anpassen"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/vg01.met.vgwort.de\/na\/85693e01ce2a424e9b22f3afd27f6be0\" width=\"1\" height=\"1\" alt=\"\"><\/p>\n<p><b>Die Reihenfolge f&uuml;r die Anzeige von Daten legt man meist &uuml;ber Kriterien wie aufsteigend oder absteigend nach dem Alphabet eines Namens, nach Zeitangaben wie Uhrzeit oder Datum oder auch nach Zahlenwerten wie etwa Preisen oder Kilometerst&auml;nden fest. Das sind Gesch&auml;ftsdaten, die nicht prim&auml;r der Sortierung dienen. F&uuml;r manche Sortierkriterien gibt es allerdings keine passenden Felder: Hier m&uuml;ssen Sie selbst eines hinzuf&uuml;gen und f&uuml;r die richtige Reihenfolge Sorge tragen.<\/b><\/p>\n<p>Beispiele f&uuml;r ein solches Szenario gibt es genug. Nehmen wir ein typisches CMS (Content Management System) f&uuml;r eine Webanwendung, das einen Artikel aus mehreren Elementen wie normalen Abs&auml;tzen, Bildern und vielleicht noch interaktiven Elementen zusammensetzt. Irgendwo muss man hier festlegen, in welcher Reihenfolge die Elemente auf der Webseite angezeigt werden sollen &#8211; unabh&auml;ngig davon, in welcher Abfolge man diese angelegt hat. Oder schauen Sie sich das Beispiel aus dem Beitrag <b>Verkn&uuml;pfte Datenbanken updaten <\/b>(Shortlink 662) an: Die dort beschriebene L&ouml;sung f&uuml;hrt beim Update eines Datenbankbackends eine oder mehrere SQL-Operationen aus, die nat&uuml;rlich nicht in willk&uuml;rlicher Reihenfolge erfolgen k&ouml;nnen.<\/p>\n<p>Fazit: Auch hier muss die Reihenfolge in einem separaten Feld festgehalten werden. Und schlie&szlig;lich noch ein Beispiel: Wenn Sie Aufgaben mit einer Datenbank verwalten, vergeben Sie normalerweise eine Priorit&auml;t. Da aber meist mehr Aufgaben als Priorit&auml;tsstufen vorhanden sind und man dennoch eine Abfolge f&uuml;r die Abarbeitung festlegen m&ouml;chte, legt man auch hier ein zus&auml;tzliches Feld fest, das die Reihenfolge vorgibt.<\/p>\n<p>Wo ist aber nun der gravierende Unterschied zwischen Texten, Datums- oder Preisangaben und einem Reihenfolge-Feld, wie es in den zuvor beschriebenen Beispielen vorkommt Ganz einfach: Die Reihenfolge-Felder sind einzig und allein daf&uuml;r da, die Reihenfolge festzulegen. In der Darstellung der Daten sind sie gar nicht sichtbar &#8211; au&szlig;er durch die Reihenfolge, in der die Daten letztlich dargestellt werden.<\/p>\n<p><b>Reihenfolge-Feld<\/b><\/p>\n<p>Das manuelle Festlegen der Reihenfolge macht aber nur dort Sinn, wo die Menge der Datens&auml;tze deren &Uuml;bersichtlichkeit nicht allzusehr einschr&auml;nkt. Eine Tabelle mit 2.000.000 Datens&auml;tzen mit einem manuell einstellbaren Reihenfolge-Feld auszustatten ist nicht sinnvoll &#8211; uns ist jedenfalls kein Grund bekannt, warum man so etwas tun sollte. F&uuml;r alle anderen F&auml;lle verwenden Sie zum Einstellen der Reihenfolge ein Feld mit einem numerischen Datentyp, dessen Wertebereich von der Anzahl der zu erwartenden Daten abh&auml;ngt. Damit Sie aber nicht doch irgendwann dummerweise in Fehler laufen, weil das Reihenfolge-Feld zu klein ausgelegt ist, verwenden wir, wie auch beim Prim&auml;rschl&uuml;sselfeld &uuml;blich, den Datentyp <b>Long<\/b>.<\/p>\n<p>Die Tabelle, die uns in diesem Beitrag begleiten soll und die Daten zum Anpassen der Reihenfolge liefern wird, sieht wie in Bild 1 aus und enth&auml;lt neben dem Prim&auml;rschl&uuml;sselfeld nur ein Feld namens <b>Aufgabe <\/b>und das Feld <b>ReihenfolgeID<\/b>.<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2009_02\/Reihenfolge-web-images\/pic001_opt.jpeg\" alt=\"pic001.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 1: Beispieltabelle mit Reihenfolge-Feld<\/span><\/b><\/p>\n<p><b>Reihenfolge &auml;ndern<\/b><\/p>\n<p>Wenn Sie mal f&uuml;r interne Zwecke ein Reihenfolge-Feld ben&ouml;tigen und keine Lust haben, das &auml;ndern der Reihenfolge zu programmieren, k&ouml;nnen Sie das Reihenfolge-Feld nat&uuml;rlich auch genau wie die &uuml;brigen Felder anzeigen und die Reihenfolge von Hand eintragen &#8211; wenn Sie dann noch eine Sortierung f&uuml;r dieses Feld festlegen, reicht dies f&uuml;r rudiment&auml;re Anforderungen schon aus.<\/p>\n<p>Komfortabler ist es jedoch, wenn ein Formular Steuerelemente zum &auml;ndern der Reihenfolge vorsieht. Die wichtigsten Standardfunktionen sind folgende:<\/p>\n<ul>\n<li class=\"aufz-hlung\">Datensatz mit dem vorherigen Datensatz vertauschen<\/li>\n<li class=\"aufz-hlung\">Datensatz mit dem folgenden Datensatz vertauschen<\/li>\n<li class=\"aufz-hlung\">Datensatz an erster Stelle platzieren<\/li>\n<li class=\"aufz-hlung\">Datensatz an letzter Stelle platzieren<\/li>\n<\/ul>\n<p>Je nachdem, welches Steuerelement man zur Anzeige der Daten verwendet, kann man auch noch komfortablere Methoden einsetzen:<\/p>\n<ul>\n<li class=\"aufz-hlung\">Datensatz an Position x verschieben<\/li>\n<li class=\"aufz-hlung\">Mehrere Datens&auml;tze an Position x verschieben<\/li>\n<\/ul>\n<p class=\"zwischen-berschrift-oberer-spaltenrand\">Steuerelemente zum &auml;ndern der Reihenfolge<\/p>\n<p>Je nachdem, welche Steuerelemente Sie zur Anzeige der Daten verwenden, sind die oben aufgef&uuml;hrten Optionen zum &auml;ndern der Reihenfolge mehr oder weniger aufwendig.<\/p>\n<p>In der Datenblattansicht, der Endlosansicht oder im Listenfeld macht das &auml;ndern der Reihenfolge durch Verschieben eines Listenelements wenig Sinn, da man den Drag-and-Drop-Vorgang nur schlecht optisch darstellen kann. Dies funktioniert hingegen sehr gut im <b>ListView<\/b>-Steuerelement, das von Haus aus M&ouml;glichkeiten f&uuml;r Drag and Drop mitbringt, daf&uuml;r aber bez&uuml;glich der Datenbindung schlechter ausgestattet ist. Wir schauen uns im Folgenden aber alle M&ouml;glichkeiten an.<\/p>\n<p><b>Reihenfolge-Algorithmen<\/b><\/p>\n<p>Bevor wir loslegen, &uuml;berlegen wir uns allerdings erstmal ein paar schicke Funktionen, die wir sp&auml;ter dann nur unter die Haube der Benutzeroberfl&auml;che stecken m&uuml;ssen.<\/p>\n<p>Die Voraussetzungen f&uuml;r die nachfolgend vorgestellten Funktionen sind eigentlich immer gleich: Es sollen die Daten einer Tabelle mit einem Prim&auml;rschl&uuml;sselfeld nach einem Wert in einem Reihenfolge-Feld sortiert werden. Was sich unterscheiden kann, sind die Namen des Prim&auml;rschl&uuml;sselfelds und des Reihenfolge-Felds. Damit unsere Funktionen ihren Dienst unabh&auml;ngig von diesen Oberfl&auml;chlichkeiten verrichten und Sie nicht f&uuml;r jede neue Datenbank, in der Sie diese Funktionen einsetzen m&ouml;chten, im Code der Funktionen herumbasteln m&uuml;ssen, bauen wir uns einfach eine kleine Abfrage namens <b>qryOrder<\/b>, die als Datenherkunft die zu sortierende Tabelle enth&auml;lt &#8211; und davon auch nur das Prim&auml;rschl&uuml;ssel- und das Sortierfeld.<\/p>\n<p>Und wie verhindert diese Abfrage nun, dass wir die im Code verwendeten Feldnamen je nach Zielanwendung und -tabelle &auml;ndern m&uuml;ssen Wir verwenden ganz einfach Aliasnamen f&uuml;r die Felder, die unabh&auml;ngig von den Feldnamen immer gleich sind. Im Detail sieht das wie in Bild 2 aus &#8211; welche Gesch&auml;ftsdaten sich in den anderen Feldern der zugrunde liegenden Tabelle befinden, ist f&uuml;r unsere Belange v&ouml;llig uninteressant. Eine kleine Einschr&auml;nkung gibt es jedoch: Das Prim&auml;rschl&uuml;sselfeld muss einen numerischen Datentyp aufweisen. Wenn Sie einen String-Prim&auml;rschl&uuml;ssel verwenden, m&uuml;ssen Sie gegebenenfalls eine alternative Variante der hier vorgestellten Routinen erstellen.<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2009_02\/Reihenfolge-web-images\/pic002_opt.jpeg\" alt=\"pic002.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 2: Mit dieser Abfrage machen Sie alle zu sortierenden Tabellen gleich.<\/span><\/b><\/p>\n<p><b>Reihenfolge-Feld f&uuml;llen<\/b><\/p>\n<p>Nicht immer ist man sich von vornherein im Klaren dar&uuml;ber, dass man f&uuml;r die Datens&auml;tze einer Tabelle ein zus&auml;tzliches Reihenfolge-Feld ben&ouml;tigt. Dementsprechend legt man vielleicht auch erstmal ein paar Datens&auml;tze an und f&uuml;gt erst dann das Hilfsfeld f&uuml;r die Sortierung hinzu. Da dieses zu diesem Zeitpunkt noch leer ist, k&ouml;nnen Sie es entweder von Hand f&uuml;llen oder diese Aufgabe durch eine kleine Routine erledigen lassen. Die Prozedur <b>FillOrderID <\/b>durchl&auml;uft dazu eine Datensatzgruppe auf Basis der Abfrage <b>qryOrder<\/b>, wobei es diese nach dem Feld <b>OrderID <\/b>vorsortiert &#8211; damit k&ouml;nnen Sie diese Routine auch verwenden, um L&uuml;cken im Feld <b>OrderID <\/b>zu schlie&szlig;en. Um eine Z&auml;hlervariable zu sparen, erh&auml;lt das Feld <b>OrderID <\/b>eines jeden Datensatzes den Inhalt seiner Eigenschaft <b>AbsolutePosition<\/b>, der bei <b>0 <\/b>beginnt und deshalb jeweils um eins erh&ouml;ht wird.<\/p>\n<pre>Public Sub FillOrderID()\r\nDim db As DAO.Database\r\nDim rst As DAO.Recordset\r\nSet db = CurrentDb\r\nSet rst = db.OpenRecordset(&quot;SELECT * FROM &micro;\r\nqryOrder ORDER BY OrderID&quot;, dbOpenDynaset)\r\nDo While Not rst.EOF\r\n rst.Edit\r\n    rst!OrderID = rst.AbsolutePosition + 1\r\n    rst.Update\r\n    rst.MoveNext\r\nLoop\r\nEnd Sub<\/pre>\n<p><b>Reihenfolgewert f&uuml;r neue Datens&auml;tze<\/b><\/p>\n<p>Nachdem nun das Reihenfolge-Feld aller vorhandenen Datens&auml;tze gef&uuml;llt ist, m&uuml;ssen wir uns noch um neue Datens&auml;tze k&uuml;mmern. Daf&uuml;r legen wir am besten auch eine kleine Routine an, die Sie in der Ereignisprozedur, die beim Neuanlegen eines Datensatzes ausgel&ouml;st wird, aufrufen.<\/p>\n<p>Als Parameter braucht diese Funktion nur den Prim&auml;rschl&uuml;sselwert des neuen Datensatzes (s. Listing 1). Die Routine &ouml;ffnet dann zun&auml;chst eine Datensatzgruppe, die nur den Datensatz mit dem h&ouml;chsten Wert im Feld <b>OrderID <\/b>enth&auml;lt. Hier gibt es zwei M&ouml;glichkeiten:<\/p>\n<p class=\"kastentabelleheader\">Listing 1: F&uuml;llen der Reihenfolge-ID eines neuen Datensatzes<\/p>\n<pre>Public Sub FillNewOrderID(lngPKID As Long)\r\nDim db As DAO.Database\r\nDim rst As DAO.Recordset\r\nDim lngOrderMax As Long\r\nSet db = CurrentDb\r\nSet rst = db.OpenRecordset(&quot;SELECT TOP 1 OrderID &quot; _\r\n&amp; &quot;FROM qryOrder WHERE OrderID IS NOT NULL &quot; _\r\n&amp; &quot;ORDER BY OrderID DESC&quot;)\r\nIf Not rst.EOF Then\r\n lngOrderMax = rst.Fields(0)\r\nEnd If\r\nlngOrderMax = lngOrderMax + 1\r\ndb.Execute &quot;UPDATE qryORDER &quot; _\r\n&amp; &quot;SET OrderID = &quot; &amp; lngOrderMax _\r\n&amp; &quot; WHERE PKID = &quot; &amp; lngPKID, dbFailOnError\r\nSet db = Nothing\r\nEnd Sub<\/pre>\n<ul>\n<li class=\"aufz-hlung\">Es sind bereits Datens&auml;tze vorhanden: dann wird innerhalb der folgenden <b>If&#8230;Then<\/b>-Bedingung der h&ouml;chste Wert des Reihenfolge-Werts in die Variable <b>lngOrderMax <\/b>geschrieben.<\/li>\n<li class=\"aufz-hlung\">Die Tabelle ist noch leer: In diesem Fall wird der Inhalt der <b>If&#8230;Then<\/b>-Bedingung nicht ausgef&uuml;hrt und <b>lngOrderMax <\/b>beh&auml;lt den Standardwert <b>0<\/b>.<\/li>\n<\/ul>\n<p>In beiden F&auml;llen erh&ouml;ht die Routine den Wert von <b>lngOrderMax <\/b>um eins und schreibt diesen Wert dann in das Feld <b>OrderID <\/b>des neuen Datensatzes.<\/p>\n<p><b>Zwei Datens&auml;tze vertauschen<\/b><\/p>\n<p>Vertauschen h&ouml;rt sich in Zusammenhang mit der Reihenfolge von Datens&auml;tzen erstmal gut an. Schlie&szlig;lich vertauscht man gern mal einen Datensatz mit den dar&uuml;ber oder darunterliegenden Nachbarn oder auch mit dem ersten oder letzten Datensatz &#8230; oder Nein! Es gibt wohl kaum einen Einsatzzweck, der das Vertauschen etwa des ersten und eines irgendwo in der Mitte liegenden Datenatzes erforderlich machen w&uuml;rde. Eigentlich m&ouml;chten Sie ja einen oder mehrere Datens&auml;tze verschieben und nicht vertauschen.<\/p>\n<p>Wenn Sie einen Datensatz an die Stelle eines unmittelbaren Nachbarn, also des vorherigen oder nachfolgenden Datensatzes verschieben, sieht das so aus, als ob die beiden Datens&auml;tze vertauscht werden. Tats&auml;chlich ist hier aber vom &auml;ndern der Position eines Datensatzes, also vom Verschieben die Rede. Vergessen wir das Vertauschen also und sprechen fortan von Verschieben.<\/p>\n<p><!--30percent--><\/p>\n<p><b>Verschieben eines oder mehrerer Datens&auml;tze<\/b><\/p>\n<p>Und wenn wir schon von Verschieben sprechen, dann reden wir auch gleich vom Verschieben nicht nur eines, sondern auch mehrerer Datens&auml;tze. Immerhin m&ouml;chte man ja vielleicht auch mal ein paar Datens&auml;tze gleichzeitig in der Reihenfolge nach oben oder unten bewegen. Die Routine <b>InterchangeOrder <\/b>aus Listing 2 erledigt dies alles anhand dreier Parameter, welche die folgenden Informationen abfragen sollen:<\/p>\n<p class=\"kastentabelleheader\">Listing 3: Pr&uuml;fen des aktuellen Datensatzes und Aktivieren oder Deaktivieren der Schaltfl&auml;chen zum Verschieben von Datens&auml;tzen<\/p>\n<pre>Private Sub Form_Current()\r\n    Dim bolFirst As Boolean\r\n    Dim bolLast As Boolean\r\n    Dim bolNew As Boolean\r\n    bolFirst = Me.CurrentRecord = 1\r\n    bolLast = (Me.CurrentRecord = _\r\n    Me.RecordsetClone.RecordCount)\r\n    bolNew = Me.NewRecord\r\n    Me.Parent.cmdOK.SetFocus\r\n    Me.Parent.cmdUp.Enabled = Not (bolFirst Or bolNew)\r\n    Me.Parent.cmdTop.Enabled = Not (bolFirst Or bolNew)\r\n    Me.RecordsetClone.MoveLast\r\n    Me.Parent.cmdDown.Enabled = Not (bolLast Or bolNew)\r\n    Me.Parent.cmdBottom.Enabled = Not (bolLast Or bolNew)\r\n    End Sub<\/pre>\n<ul>\n<li class=\"aufz-hlung\"><b>lngTargetOrderID<\/b>: Reihenfolge-ID des Datensatzes, vor oder hinter dem die zu verschiebenden Datens&auml;tze landen sollen. Dabei wird vor den angegebenen Datensatz verschoben, wenn dieser sich in der Reihenfolge vor den zu verschiebenden Datens&auml;tzen befindet, sonst hinter den angegebenen Datensatz.<\/li>\n<li class=\"aufz-hlung\"><b>lngMoveFirstOrderID<\/b>: Reihenfolge-ID des zu verschiebenden Datensatzes mit der kleinsten Reihenfolge-ID<\/li>\n<li class=\"aufz-hlung\"><b>lngMoveLastOrderID<\/b>: Reihenfolge-ID des zu verschiebenden Datensatzes mit der gr&ouml;&szlig;ten Reihenfolge-ID. Dieser Parameter muss nur angegeben werden, wenn mehr als ein Datensatz verschoben werden soll.<\/li>\n<\/ul>\n<p>Wenn <b>lngMoveLastOrderID<\/b> nicht &uuml;bergeben w&uuml;rde, also nur ein Datensatz verschoben werden soll, stellt die Routine diesen Wert zun&auml;chst auf den von <b>lngMoveFirstOrderID <\/b>ein &#8211; das ist aus technischen Gr&uuml;nden wichtig, damit man die beiden F&auml;lle gleich behandeln kann (&quot;Verschiebe Datensatz 1 bis 3 hinter 5&quot; funktioniert dann genauso wie &quot;Verschiebe Datensatz 1 hinter 5&quot;). Die Variable <b>intCountMove <\/b>wird dann mit der Anzahl der zu verschiebenden Datens&auml;tze gef&uuml;llt.<\/p>\n<p>Anschlie&szlig;end folgt die wichtigste Fallunterscheidung dieser Prozedur: Sollen Datens&auml;tze nach vorne oder hinten verschoben werden In der Routine wird diese Frage so beantwortet: Ist die ID des ersten zu verschiebenden Datensatzes gr&ouml;&szlig;er als die des Zieldatensatzes, dann geht es nach vorne (siehe Bild 3), sonst nach hinten (siehe Bild 4).<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2009_02\/Reihenfolge-web-images\/NachOben_opt.jpeg\" alt=\"NachOben.emf\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 3: Verschieben von Datens&auml;tzen nach vorne vor einen anderen Datensatz<\/span><\/b><\/p>\n<p>Wenn der Zieldatensatz vor dem ersten zu verschiebenden Datensatz liegt, &ouml;ffnet die Routine eine Datensatzgruppe, die alle Datens&auml;tze vom Zieldatensatz bis zum letzten zu verschiebenden Datensatz enth&auml;lt (in Bild 3 w&auml;ren das die Datens&auml;tze 2 bis 5). Anschlie&szlig;end durchl&auml;uft die Routine alle Datens&auml;tze dieser Datensatzgruppe und f&uuml;hrt eine von zwei Aktionen an ihnen durch:<\/p>\n<ul>\n<li class=\"aufz-hlung\">Wenn die Reihenfolge-ID des aktuellen Datensatzes kleiner ist als die des ersten zu verschiebenden Datensatzes, dann wird dieser um die Anzahl der vorne einzuf&uuml;genden Datens&auml;tze nach hinten verschoben (in Bild 3 sind das die Datens&auml;tze 2 und 3).<\/li>\n<li class=\"aufz-hlung\">Deutet die Reihenfolge-ID darauf hin, dass der Datensatz einer der zu verschiebenden Datens&auml;tze ist, wird dieser entsprechend der Anzahl der zwischen dem Zieldatensatz und dem ersten zu verschiebenden Datensatz befindlichen Elemente nach vorne verschoben.<\/li>\n<\/ul>\n<p>Es kann auch sein, dass einer oder mehrere Datens&auml;tze nach hinten verschoben werden sollen, wie es in Bild 4 der Fall ist. Dies wird im zweiten Teil der &auml;u&szlig;eren <b>If&#8230;Then<\/b>-Bedingung ber&uuml;cksichtigt. Auch hier erzeugt die Routine eine Datensatzgruppe, die alle betroffenen Datens&auml;tze enth&auml;lt &#8211; in Bild 4 sind dies die Datens&auml;tze 2 bis 4.<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2009_02\/Reihenfolge-web-images\/NachUnten_opt.jpeg\" alt=\"NachUnten.emf\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 4: Verschieben eines Datensatzes nach hinten hinter einen anderen Datensatz<\/span><\/b><\/p>\n<p>Solange die <b>Do While<\/b>-Schleife Datens&auml;tze durchl&auml;uft, die verschoben werden sollen (hier Nummer 2), wird deren Reihenfolge-ID um einen Wert erh&ouml;ht, welcher der Anzahl der Elemente zwischen dem letzten zu verschiebenden und dem Zieldatensatz entspricht.<\/p>\n<p>Die Reihenfolge-ID aller weiteren (hier 3 und 4) wird um die Anzahl der zu verschiebenden Datens&auml;tze vermindert (hier 2). Das war&apos;s &#8211; mit dieser Routine k&ouml;nnen Sie alle m&ouml;glichen Verschiebungen auf den Datens&auml;tzen der Tabelle abbilden.<\/p>\n<p><b>Sortierung im Unterformular in der Datenblattansicht anpassen<\/b><\/p>\n<p>Schauen wir uns nun an, wie Sie diese Routine in der Praxis einsetzen k&ouml;nnen. Das erste Beispiel ist ein Hauptformular, dessen Unterformular die Datens&auml;tze unserer Beispieltabelle <b>tblAufgaben <\/b>anzeigt.<\/p>\n<p>Wir brauchen nun vier Steuerelemente, die ausgehend vom aktuell markierten Steuerelement die folgenden Aktionen aufrufen:<\/p>\n<ul>\n<li class=\"aufz-hlung\">ganz nach oben verschieben,<\/li>\n<li class=\"aufz-hlung\">um eine Position nach oben verschieben,<\/li>\n<li class=\"aufz-hlung\">um eine Position nach unten verschieben und<\/li>\n<li class=\"aufz-hlung\">ganz nach unten verschieben.<\/li>\n<\/ul>\n<p>Das Beispielformular haben wir bewusst einfach gehalten. Es besteht aus dem Hauptformular <b>frmDatenblatt <\/b>und dem Unterformular <b>sfmDatenblatt <\/b>sowie den vier Schaltfl&auml;chen <b>cmdTop<\/b>, <b>cmdUp<\/b>, <b>cmdDown <\/b>und <b>cmdBottom <\/b>und sieht im Entwurf wie in Bild 5 und in der Formularansicht wie in Bild 6 aus. Die Schaltfl&auml;chen sind mit entsprechenden Ereignisprozeduren ausgestattet. Die Schaltfl&auml;che <b>cmdUp <\/b>beispielsweise l&ouml;st beim Mausklick die folgende Routine aus. Sie schreibt einfach das Feld <b>ReihenfolgeID <\/b>des aktuell markierten Datensatzes in die Variable <b>lngMove <\/b>und ermittelt dann mit der <b>DMin<\/b>-Dom&auml;nenfunktion den Wert des Feldes <b>ReihenfolgeID <\/b>des ersten Datensatzes der Tabelle <b>tblAufgaben<\/b>.<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2009_02\/Reihenfolge-web-images\/pic003_opt.jpeg\" alt=\"pic003.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 5: Das Formular zum Verschieben von Datens&auml;tzen in der Entwurfs- &#8230;<\/span><\/b><\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2009_02\/Reihenfolge-web-images\/pic004_opt.jpeg\" alt=\"pic004.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 6: &#8230; und in der Formularansicht<\/span><\/b><\/p>\n<pre>Private Sub cmdTop_Click()\r\nDim lngTarget As Long\r\nDim lngMove As Long\r\nlngMove = Me.sfmDatenblatt.Form.ReihenfolgeID\r\nlngTarget = DMin(&quot;ReihenfolgeID&quot;, \r\n&quot;tblAufgaben&quot;)\r\nInterchangeOrder lngTarget, lngMove\r\nMe.sfmDatenblatt.Form.Requery\r\nEnd Sub<\/pre>\n<p>Der Aufruf der Routine <b>InterchangeOrder <\/b>sorgt dann daf&uuml;r, dass die Werte des Feldes <b>ReihenfolgeID <\/b>der betroffenen Datens&auml;tze in der zugrunde liegenden Tabelle ge&auml;ndert werden. Die <b>Requery<\/b>-Methode in der letzten Zeile aktualisiert dann die Anzeige der Daten im Unterformular. Beim Verschieben des aktuellen Datensatzes um eine Position nach oben kommt die Schaltfl&auml;che <b>cmdUp <\/b>ins Spiel. Die dadurch ausgel&ouml;ste Prozedur unterscheidet sich nur unwesentlich von der zuvor beschriebenen, indem sie nicht den Wert des Feldes <b>ReihenfolgeID <\/b>des ersten Datensatzes der Datenherkunft, sondern einfach vom Wert des aktuellen Datensatzes den Wert <b>1 <\/b>abzieht.<\/p>\n<pre>Private Sub cmdUp_Click()\r\nDim lngTarget As Long\r\nDim lngMove As Long\r\nlngMove = Me.sfmDatenblatt.Form.ReihenfolgeID\r\nlngTarget = lngMove - 1\r\nInterchangeOrder lngTarget, lngMove\r\nMe.sfmDatenblatt.Form.Requery\r\nEnd Sub<\/pre>\n<p>Die beiden &uuml;brigen Prozeduren verhalten sich analog.<\/p>\n<p>Leider zeigt sich das Unterformular in der Datenblattansicht nicht besonders kooperativ, was das Verhalten beim Requery angeht: Es springt anschlie&szlig;end n&auml;mlich immer zum ersten Datensatz der Datenherkunft. Um dies benutzerfreundlicher zu gestalten, k&ouml;nnen Sie die im Beitrag <b>Kein Datensatz- und Positionswechsel bei Requery <\/b>(Shortlink 602) vorgestellten Techniken verwenden.<\/p>\n<p><b>Schaltfl&auml;chen am Anfang und am Ende deaktivieren<\/b><\/p>\n<p>Wenn der Datensatzzeiger im Unterformular auf dem ersten oder letzten Datensatz steht, sollten die Schaltfl&auml;chen zum Springen auf den vorherigen beziehungsweise nachfolgenden Datensatz deaktiviert sein, weil deren Aufruf sonst einen Fehler ausl&ouml;sen w&uuml;rde. Dies erledigt die Routine aus Listing 3, die bei jedem Datensatzwechsel im Unterformular ausgel&ouml;st wird.<\/p>\n<p class=\"kastentabelleheader\">Listing 4: F&uuml;llen des ListView-Steuerelements<\/p>\n<pre>Dim WithEvents objAufgaben As MSComctlLib.ListView\r\nPrivate Sub Form_Load()\r\n    Set objAufgaben = Me.lvwAufgaben.Object\r\n    FillOrderID\r\n    ListViewFuellen\r\n    End Sub\r\nPrivate Sub ListViewFuellen()\r\n    Dim db As DAO.Database\r\n    Dim rst As DAO.Recordset\r\n    Dim objListitem As MSComctlLib.ListItem\r\n    Set db = CurrentDb\r\n    Set rst = db.OpenRecordset(&quot;SELECT * FROM tblAufgaben ORDER BY ReihenfolgeID&quot;, dbOpenDynaset)\r\n    objAufgaben.ListItems.Clear\r\n    Do While Not rst.EOF\r\n        Set objListitem = objAufgaben.ListItems.Add(rst!ReihenfolgeID, &quot;a&quot; &amp; rst!ID, rst!Aufgabe)\r\n        objListitem.ListSubItems.Add , &quot;a&quot; &amp; rst!ID, rst!ReihenfolgeID\r\n        rst.MoveNext\r\n    Loop\r\n    End Sub<\/pre>\n<p><b>L&ouml;schen von Datens&auml;tzen<\/b><\/p>\n<p>Die bisher vorgestellten Routinen sind bislang stillschweigend davon ausgegangen, dass die vorhandenen Datens&auml;tze im Feld <b>ReihenfolgeID <\/b>immer l&uuml;ckenlos durchnummeriert sind. Damit das auch so bleibt, wenn mal ein Datensatz gel&ouml;scht wird, m&uuml;ssen Sie die L&uuml;cke gleich nach dem L&ouml;schen wieder schlie&szlig;en. Abh&auml;ngig von der Anzahl der betroffenen Datens&auml;tze k&ouml;nnen Sie dies in einem Rutsch erledigen, indem Sie die weiter oben vorgestellte Prozedur <b>FillOrderID <\/b>aufrufen. Im Falle unseres Unterformulars f&uuml;llen Sie die Prozedur, die durch das Ereignis <b>Beim L&ouml;schen <\/b>ausgel&ouml;st wird, mit den folgenden beiden Anweisungen:<\/p>\n<pre>Private Sub Form_Delete(Cancel As Integer)\r\nFillOrderID\r\nEnd Sub<\/pre>\n<p><b>Sortierung im Listenfeld anpassen<\/b><\/p>\n<p>Das Listenfeld ist im Vergleich zu einem Unterformular in der Datenblattsicht insofern pflegeleichter, als dass ein Requery die aktuelle Ansicht kaum sichtbar beeinflusst. Alles weitere verl&auml;uft im Listenfeld prinzipiell genau so wie beim Unterformular, weshalb wir das in Bild 7 dargestellte Listenfeld mit den entsprechenden Schaltfl&auml;chen zum Verschieben des aktuell markierten Eintrags nicht detaillierter besprechen und direkt zum wesentlich spannenderen <b>ListView<\/b>-Steuerelement &uuml;bergehen.<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2009_02\/Reihenfolge-web-images\/pic005_opt.jpeg\" alt=\"pic005.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 7: Reihenfolge von Datens&auml;tzen im Listenfeld einstellen<\/span><\/b><\/p>\n<p><b>Sortierung im ListView-Steuerelement anpassen<\/b><\/p>\n<p>In diesem Zusammenhang m&uuml;ssen Sie vorab eine Sache mit sich selbst und den Anforderungen der Anwendung ausmachen: Man kann einen Datensatz auch in einem ListView-Steuerelement nur auf einen anderen Datensatz und in den Zwischenraum zwischen zwei Datens&auml;tzen ziehen, was schon wichtig w&auml;re, um die gew&uuml;nschte Position zu verdeutlichen. Im Beispielformular <b>frmListView <\/b>(siehe Bild 8) geschieht dies nun so, wie es uns am intuitivsten vorkam: Datens&auml;tze, die nach vorne gezogen werden, sollen vor dem Zieldatensatz eingef&uuml;gt werden, und solche, die nach hinten gezogen werden, sollen hinter dem Zieldatensatz landen.<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2009_02\/Reihenfolge-web-images\/pic006_opt.jpeg\" alt=\"pic006.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 8: Einstellen der Reihenfolge per Drag and Drop im ListView-Steuerelement<\/span><\/b><\/p>\n<p>Erstmal m&uuml;ssen wir das ListView mit den gew&uuml;nschten Daten f&uuml;llen, was die Routine <b>ListViewFuellen <\/b>erledigt, die durch die <b>Form_Load<\/b>-Ereignisprozedur aufgerufen wird &#8211; aber erst, nachdem diese &uuml;ber die Routine <b>FillOrderID <\/b>die Werte des Feldes <b>ReihenfolgeID <\/b>aktualisiert hat (s. Listing 4).<\/p>\n<p class=\"kastentabelleheader\">Listing 6: Markieren des jeweils &uuml;berfahrenen Elements<\/p>\n<pre>Private Sub objAufgaben_OLEDragOver(Data As MSComctlLib.DataObject, Effect As Long, Button As Integer, _\r\n    Shift As Integer, x As Single, y As Single, State As Integer)\r\n    Set objAufgaben.DropHighlight = objAufgaben.HitTest(x, y)\r\n    objAufgaben.HotTracking = True\r\n    End Sub<\/pre>\n<p><b>Reihenfolge festlegen per Drag and Drop<\/b><\/p>\n<p>Der Grund f&uuml;r den Einsatz des ListView-Steuerelements ist ja, dass Sie mit diesem auch Drag-and-Drop-Operationen durchf&uuml;hren k&ouml;nnen. Oft ist es viel weniger m&uuml;hselig, Daten auf diese Weise zu sortieren, als dies mit entsprechenden Schaltfl&auml;chen wie mit den bisherigen L&ouml;sungen zu erledigen.<\/p>\n<p>Der Drag-and-Drop-Vorgang startet nach dem Markieren von einem oder auch mehreren Elementen des ListView-Steuerelements und endet recht schnell, wenn die Routine aus Listing 5 feststellt, dass keine zusammenh&auml;ngenden Elemente markiert wurden. Anderenfalls kann es aber losgehen: Die Anweisungen aus Listing 5 durchlaufen alle Listenelemente und schreiben den Index des ersten und des letzten in das Data-Objekt, das von der Ereignisprozedur <b>OLEDragDrop <\/b>sp&auml;ter wieder ausgelesen werden kann.<\/p>\n<p>Die Routine aus Listing 6 stellt sicher, dass beim Ziehen der zu verschiebenden Elemente jeweils das &uuml;berfahrene Element markiert wird, damit der Benutzer wei&szlig;, wo der Packen landet, wenn er jetzt losl&auml;sst.<\/p>\n<p>Dies geschieht dann in Listing 7, wo zwei wesentliche Operationen stattfinden. Die einfachere (ganz am Ende) ruft einfach die bereits bekannte Routine <b>InterchangeOrder <\/b>mit den entsprechenden Parametern auf, damit die &auml;nderungen in der zugrunde liegenden Tabelle gespeichert werden. Die andere aktualisiert den Inhalt des ListView-Steuerelements. Man k&ouml;nnte zwar auch einfach alle Elemente l&ouml;schen und neu einlesen, aber wir wollen es ja richtig und ohne Seiteneffekte wie das Verschlagen des aktuellen Elements erledigen.<\/p>\n<p>Was die Routine hierzu beitr&auml;gt, ist Folgendes: Sie liest zun&auml;chst aus dem Objekt <b>Data <\/b>die Indexwerte des ersten und des letzten verschobenen Elements aus und ermittelt zus&auml;tzlich den Index des Elements, auf das der Benutzer die zu verschiebenden Elemente gezogen hat. In diesem Zusammenhang sei darauf verwiesen, dass der Index der ListView-Elemente den Werten des Feldes <b>ReihenfolgeID <\/b>der Tabelle <b>tblAufgaben <\/b>entspricht.<\/p>\n<p>Dann &ouml;ffnet sie eine Datensatzgruppe, die alle Datens&auml;tze der Tabelle <b>tblAufgaben <\/b>beinhaltet, die durch die &uuml;bergebenen Indexwerte eingeschlossen werden &#8211; aber in absteigender Reihenfolge bezogen auf das Feld <b>ReihenfolgeID<\/b>. Die Datens&auml;tze dieser Datensatzgruppe durchl&auml;uft sie im Anschluss und l&ouml;scht jeweils das Element aus dem <b>ListView<\/b>-Steuerelement, welches dem aktuellen Datensatz entspricht. Die Elemente m&uuml;ssen nat&uuml;rlich auch wieder angelegt werden, was eine Anweisung sp&auml;ter geschieht.<\/p>\n<p>Dort wird das aktuelle Element mit der Add-Methode zum ListView hinzugef&uuml;gt, allerdings nicht unter Ber&uuml;cksichtigung der im Datensatz gespeicherten ReihenfolgeID, sondern mit dem Index des Elements, auf das der Benutzer die zu verschiebenden Elemente gezogen hat. Warum das Nun: Legt man im ListView-Steuerelement ein Element mit dem Index eines vorhandenen Elements an, wird dieses genau wie alle folgenden Elemente nach hinten verschoben. Und deshalb werden die zu verschiebenden Elemente auch in umgekehrter Reihenfolge abgearbeitet: weil die ersten die letzten sein werden und die Reihenfolge somit wieder stimmt.<\/p>\n<p class=\"zwischen-berschrift-oberer-spaltenrand\">Zusammenfassung und Ausblick<\/p>\n<p>Wenn Sie einmal eine Sammlung von Techniken f&uuml;r das Sortieren von Datens&auml;tzen nach einem speziell daf&uuml;r vorgesehenen Sortierfeld besitzen, brauchen Sie sich um dieses Thema nicht mehr viele Gedanken zu machen. Wichtig ist, dass Sie durchgehend darauf achten, die Werte des betroffenen Feldes &#8211; hier <b>ReihenfolgeID <\/b>&#8211; immer l&uuml;ckenlos zu halten. Dazu k&ouml;nnen Sie bei Gelegenheit eine Aktualisierung der Werte dieses Feldes durchf&uuml;hren, was bei der zu erwartenden Anzahl der Datens&auml;tze einer Tabelle, die Sie manuell und individuell sortieren m&ouml;chten, vertretbar ist. Also: Sortieren Sie!<\/p>\n<p class=\"kastentabelleheader\">Listing 2: Die Universalfunktion zum Verschieben von Datens&auml;tzen anhand eines Reihenfolge-Felds<\/p>\n<pre>Public Sub InterchangeOrder(lngTargetOrderID As Long, lngMoveFirstOrderID As Long, _\r\nOptional lngMoveLastOrderID As Long)\r\nDim db As DAO.Database\r\nDim rst As DAO.Recordset\r\nDim intCountMove As Integer\r\nSet db = CurrentDb\r\nIf lngMoveLastOrderID = 0 Then\r\nlngMoveLastOrderID = lngMoveFirstOrderID\r\nEnd If\r\nintCountMove = lngMoveLastOrderID - lngMoveFirstOrderID + 1\r\nIf lngTargetOrderID &lt; lngMoveFirstOrderID Then\r\nSet rst = db.OpenRecordset(&quot;SELECT * FROM qryOrder WHERE OrderID &gt;= &quot; &amp; lngTargetOrderID _\r\n&amp; &quot; AND OrderID &lt;= &quot; &amp; lngMoveLastOrderID &amp; &quot; ORDER BY OrderID&quot;, dbOpenDynaset)\r\nDo While Not rst.EOF\r\n rst.Edit\r\n    If rst!OrderID &lt; lngMoveFirstOrderID Then\r\n        rst!OrderID = rst!OrderID + intCountMove\r\n    Else\r\n        rst!OrderID = rst!OrderID - (lngMoveFirstOrderID - lngTargetOrderID)\r\n    End If\r\n    rst.Update\r\n    rst.MoveNext\r\nLoop\r\nElse\r\nSet rst = db.OpenRecordset(&quot;SELECT * FROM qryOrder WHERE OrderID &gt;= &quot; _\r\n&amp; lngMoveFirstOrderID &amp; &quot; AND OrderID &lt;= &quot; &amp; lngTargetOrderID _\r\n&amp; &quot; ORDER BY OrderID&quot;, dbOpenDynaset)\r\nDo While Not rst.EOF\r\n rst.Edit\r\n    If rst!OrderID &lt;= lngMoveLastOrderID Then\r\n        rst!OrderID = rst!OrderID + (lngTargetOrderID - lngMoveLastOrderID)\r\n    Else\r\n        rst!OrderID = rst!OrderID - (lngMoveLastOrderID - lngMoveFirstOrderID + 1)\r\n    End If\r\n    rst.Update\r\n    rst.MoveNext\r\nLoop\r\nEnd If\r\nEnd Sub<\/pre>\n<p class=\"kastentabelleheader\">Listing 5: Start des Drag-and-Drop-Vorgangs<\/p>\n<pre>Private Sub objAufgaben_OLEStartDrag(Data As MSComctlLib.DataObject, AllowedEffects As Long)\r\nDim objListitem As MSComctlLib.ListItem\r\nDim strData As String\r\nDim lngFirstOrderID As Long\r\nDim lngLastOrderID As Long\r\nDim intCountSelected As Integer\r\nFor Each objListitem In objAufgaben.ListItems\r\nIf objListitem.Selected Then\r\n intCountSelected = intCountSelected + 1\r\n    If lngFirstOrderID = 0 Then lngFirstOrderID = objListitem.Index\r\n    lngLastOrderID = objListitem.Index\r\n    Data.SetData lngFirstOrderID &amp; &quot;|&quot; &amp; lngLastOrderID\r\nEnd If\r\nNext objListitem\r\nIf lngLastOrderID - lngFirstOrderID + 1 &gt; intCountSelected Then\r\nMsgBox &quot;Sie k&ouml;nnen nur zusammenh&auml;ngende Elemente verschieben.&quot;\r\nEnd If\r\nEnd Sub<\/pre>\n<p class=\"kastentabelleheader\">Listing 7: Ende des Drag-and-Drop-Vorgangs und Anpassen der Reihenfolge<\/p>\n<pre>Private Sub objAufgaben_OLEDragDrop(Data As MSComctlLib.DataObject, Effect As Long, Button As Integer, _\r\nShift As Integer, x As Single, y As Single)\r\nDim strSource As String\r\nDim lngFirstOrderID As Long\r\nDim lngLastOrderID As Long\r\nDim lngTargetOrderID As Long\r\nDim objListitem As MSComctlLib.ListItem\r\nDim db As DAO.Database\r\nDim rst As DAO.Recordset\r\nSet db = CurrentDb\r\nstrSource = Data.GetData(ccCFText)\r\nlngFirstOrderID = Split(strSource, &quot;|&quot;)(0)\r\nlngLastOrderID = Split(strSource, &quot;|&quot;)(1)\r\nSet rst = db.OpenRecordset(&quot;SELECT * FROM tblAufgaben WHERE ReihenfolgeID &gt;= &quot; &amp; lngFirstOrderID _\r\n&amp; &quot; AND ReihenfolgeID &lt;= &quot; &amp; lngLastOrderID &amp; &quot; ORDER BY ReihenfolgeID DESC&quot;, dbOpenDynaset)\r\nlngTargetOrderID = objAufgaben.HitTest(x, y).Index\r\nDo While Not rst.EOF\r\nobjAufgaben.ListItems.Remove &quot;a&quot; &amp; rst!ID\r\nSet objListitem = objAufgaben.ListItems.Add(lngTargetOrderID, &quot;a&quot; &amp; rst!ID, rst!Aufgabe)\r\nobjListitem.ListSubItems.Add , &quot;a&quot; &amp; rst!ID, rst!ReihenfolgeID\r\nrst.MoveNext\r\nLoop\r\nInterchangeOrder lngTargetOrderID, lngFirstOrderID, lngLastOrderID\r\nSet objAufgaben.DropHighlight = Nothing\r\nSet objAufgaben.SelectedItem = Nothing\r\nEnd Sub<\/pre>\n<h3>Downloads zu diesem Beitrag<\/h3>\n<p>Enthaltene Beispieldateien:<\/p>\n<p>Reihenfolge.mdb<\/p>\n<p><a href=\"..\/fileadmin\/beispiele\/{29FF70FB-C311-47E3-8C73-78CEC6F42036}\/aiu_656.zip\">Download<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Die Reihenfolge f&uuml;r die Anzeige von Daten legt man meist &uuml;ber Kriterien wie aufsteigend oder absteigend nach dem Alphabet eines Namens, nach Zeitangaben wie Uhrzeit oder Datum oder auch nach Zahlenwerten wie etwa Preisen oder Kilometerst&auml;nden fest. Das sind alles Gesch&auml;ftsdaten, die nicht prim&auml;r zur Sortierung dienen. F&uuml;r manche Sortierkriterien gibt es allerdings keine passenden Felder: Hier m&uuml;ssen Sie selbst eines hinzuf&uuml;gen und f&uuml;r die richtige Reihenfolge Sorge tragen.<\/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":[66022009,662009,44000028,44000023],"tags":[],"class_list":["post-55000656","post","type-post","status-publish","format-standard","hentry","category-66022009","category-662009","category-Ergonomie_und_Benutzeroberflaeche","category-Mit_Formularen_arbeiten"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.9 (Yoast SEO v27.3) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Reihenfolge manuell anpassen - 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\/Reihenfolge_manuell_anpassen\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Reihenfolge manuell anpassen\" \/>\n<meta property=\"og:description\" content=\"Die Reihenfolge f&uuml;r die Anzeige von Daten legt man meist &uuml;ber Kriterien wie aufsteigend oder absteigend nach dem Alphabet eines Namens, nach Zeitangaben wie Uhrzeit oder Datum oder auch nach Zahlenwerten wie etwa Preisen oder Kilometerst&auml;nden fest. Das sind alles Gesch&auml;ftsdaten, die nicht prim&auml;r zur Sortierung dienen. F&uuml;r manche Sortierkriterien gibt es allerdings keine passenden Felder: Hier m&uuml;ssen Sie selbst eines hinzuf&uuml;gen und f&uuml;r die richtige Reihenfolge Sorge tragen.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/access-im-unternehmen.de\/Reihenfolge_manuell_anpassen\/\" \/>\n<meta property=\"og:site_name\" content=\"Access im Unternehmen\" \/>\n<meta property=\"article:published_time\" content=\"2020-05-22T22:22:01+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/vg01.met.vgwort.de\/na\/85693e01ce2a424e9b22f3afd27f6be0\" \/>\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\\\/Reihenfolge_manuell_anpassen\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Reihenfolge_manuell_anpassen\\\/\"},\"author\":{\"name\":\"Andr\u00e9 Minhorst\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\"},\"headline\":\"Reihenfolge manuell anpassen\",\"datePublished\":\"2020-05-22T22:22:01+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Reihenfolge_manuell_anpassen\\\/\"},\"wordCount\":3565,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Reihenfolge_manuell_anpassen\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg01.met.vgwort.de\\\/na\\\/85693e01ce2a424e9b22f3afd27f6be0\",\"articleSection\":[\"2\\\/2009\",\"2009\",\"Ergonomie und Benutzeroberfl\u00e4che\",\"Mit Formularen arbeiten\"],\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Reihenfolge_manuell_anpassen\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Reihenfolge_manuell_anpassen\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Reihenfolge_manuell_anpassen\\\/\",\"name\":\"Reihenfolge manuell anpassen - Access im Unternehmen\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Reihenfolge_manuell_anpassen\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Reihenfolge_manuell_anpassen\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg01.met.vgwort.de\\\/na\\\/85693e01ce2a424e9b22f3afd27f6be0\",\"datePublished\":\"2020-05-22T22:22:01+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Reihenfolge_manuell_anpassen\\\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Reihenfolge_manuell_anpassen\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Reihenfolge_manuell_anpassen\\\/#primaryimage\",\"url\":\"http:\\\/\\\/vg01.met.vgwort.de\\\/na\\\/85693e01ce2a424e9b22f3afd27f6be0\",\"contentUrl\":\"http:\\\/\\\/vg01.met.vgwort.de\\\/na\\\/85693e01ce2a424e9b22f3afd27f6be0\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Reihenfolge_manuell_anpassen\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Reihenfolge manuell anpassen\"}]},{\"@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":"Reihenfolge manuell anpassen - 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\/Reihenfolge_manuell_anpassen\/","og_locale":"de_DE","og_type":"article","og_title":"Reihenfolge manuell anpassen","og_description":"Die Reihenfolge f&uuml;r die Anzeige von Daten legt man meist &uuml;ber Kriterien wie aufsteigend oder absteigend nach dem Alphabet eines Namens, nach Zeitangaben wie Uhrzeit oder Datum oder auch nach Zahlenwerten wie etwa Preisen oder Kilometerst&auml;nden fest. Das sind alles Gesch&auml;ftsdaten, die nicht prim&auml;r zur Sortierung dienen. F&uuml;r manche Sortierkriterien gibt es allerdings keine passenden Felder: Hier m&uuml;ssen Sie selbst eines hinzuf&uuml;gen und f&uuml;r die richtige Reihenfolge Sorge tragen.","og_url":"https:\/\/access-im-unternehmen.de\/Reihenfolge_manuell_anpassen\/","og_site_name":"Access im Unternehmen","article_published_time":"2020-05-22T22:22:01+00:00","og_image":[{"url":"http:\/\/vg01.met.vgwort.de\/na\/85693e01ce2a424e9b22f3afd27f6be0","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\/Reihenfolge_manuell_anpassen\/#article","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/Reihenfolge_manuell_anpassen\/"},"author":{"name":"Andr\u00e9 Minhorst","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f"},"headline":"Reihenfolge manuell anpassen","datePublished":"2020-05-22T22:22:01+00:00","mainEntityOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Reihenfolge_manuell_anpassen\/"},"wordCount":3565,"commentCount":0,"publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Reihenfolge_manuell_anpassen\/#primaryimage"},"thumbnailUrl":"http:\/\/vg01.met.vgwort.de\/na\/85693e01ce2a424e9b22f3afd27f6be0","articleSection":["2\/2009","2009","Ergonomie und Benutzeroberfl\u00e4che","Mit Formularen arbeiten"],"inLanguage":"de","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/access-im-unternehmen.de\/Reihenfolge_manuell_anpassen\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/access-im-unternehmen.de\/Reihenfolge_manuell_anpassen\/","url":"https:\/\/access-im-unternehmen.de\/Reihenfolge_manuell_anpassen\/","name":"Reihenfolge manuell anpassen - Access im Unternehmen","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/#website"},"primaryImageOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Reihenfolge_manuell_anpassen\/#primaryimage"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Reihenfolge_manuell_anpassen\/#primaryimage"},"thumbnailUrl":"http:\/\/vg01.met.vgwort.de\/na\/85693e01ce2a424e9b22f3afd27f6be0","datePublished":"2020-05-22T22:22:01+00:00","breadcrumb":{"@id":"https:\/\/access-im-unternehmen.de\/Reihenfolge_manuell_anpassen\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/access-im-unternehmen.de\/Reihenfolge_manuell_anpassen\/"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/access-im-unternehmen.de\/Reihenfolge_manuell_anpassen\/#primaryimage","url":"http:\/\/vg01.met.vgwort.de\/na\/85693e01ce2a424e9b22f3afd27f6be0","contentUrl":"http:\/\/vg01.met.vgwort.de\/na\/85693e01ce2a424e9b22f3afd27f6be0"},{"@type":"BreadcrumbList","@id":"https:\/\/access-im-unternehmen.de\/Reihenfolge_manuell_anpassen\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/access-im-unternehmen.de\/"},{"@type":"ListItem","position":2,"name":"Reihenfolge manuell anpassen"}]},{"@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\/55000656","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=55000656"}],"version-history":[{"count":0,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55000656\/revisions"}],"wp:attachment":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/media?parent=55000656"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/categories?post=55000656"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/tags?post=55000656"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}