{"id":55001197,"date":"2019-08-01T00:00:00","date_gmt":"2020-05-13T20:55:36","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=1197"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"Listenfeld_Reihenfolge_mehrerer_Eintraege_aendern","status":"publish","type":"post","link":"https:\/\/access-im-unternehmen.de\/Listenfeld_Reihenfolge_mehrerer_Eintraege_aendern\/","title":{"rendered":"Listenfeld: Reihenfolge mehrerer Eintr&auml;ge &auml;ndern"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/vg06.met.vgwort.de\/na\/cb90c41ca8ce412eb2ac0ada296b1bbf\" width=\"1\" height=\"1\" alt=\"\"><\/p>\n<p><b>Wir haben bereits in mehreren Beitr&auml;gen beschrieben, wie Sie die individuelle Reihenfolge von Elementen einer Tabelle &uuml;ber den Inhalt eines Feldes etwa namens &#8222;ReihenfolgeID&#8220; einstellen k&ouml;nnen &#8211; zum Beispiel in Listenfeldern oder Unterformularen in der Datenblattansicht. Dort haben wir die Reihenfolge dann durch Markieren der Eintr&auml;ge und anschlie&szlig;endes Bet&auml;tigen etwa von Schaltfl&auml;chen mit Beschriftungen wie &#8222;Ganz nach oben&#8220;, &#8222;Nach oben&#8220;, &#8222;Nach unten&#8220; oder &#8222;Ganz nach unten&#8220; ge&auml;ndert. Im vorliegenden Beitrag schauen wir uns nun an, wie wir im Listenfeld die Reihenfolge f&uuml;r mehrere Eintr&auml;ge gleichzeitig &auml;ndern k&ouml;nnen.<\/b><\/p>\n<h2>Mehrfach-Reihenfolge im Listenfeld<\/h2>\n<p>Listenfelder haben gegen&uuml;ber der Datenblattansicht den gro&szlig;en Vorteil, dass Sie damit nicht nur zusammenh&auml;ngende Eintr&auml;ge markieren k&ouml;nnen, sondern sogar Eintr&auml;ge, die beliebig im Listenfeld verteilt sind. Die einzige Voraussetzung daf&uuml;r ist, dass Sie f&uuml;r die Eigenschaft <b>Mehrfachauswahl <\/b>des Listenfeldes den Wert <b>Einzeln <\/b>oder <b>Erweitert <\/b>ausw&auml;hlen. Welchen Sie nutzen, h&auml;ngt von den Anforderungen und den Gewohnheiten der Benutzer ab &#8211; f&uuml;r die hier vorgestellte L&ouml;sung funktionieren beide gleich gut.<\/p>\n<h2>Entwurf des Beispielformulars<\/h2>\n<p>Das Beispielformular bauen wir wie in Bild 1 auf. Wir f&uuml;gen ein Listenfeld namens <b>lstKategorien <\/b>ein sowie vier Schaltfl&auml;chen namens <b>cmdTop<\/b>, <b>cmdUp<\/b>, <b>cmdDown <\/b>und <b>cmdBottom<\/b>.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2019_04\/pic_1197_001.png\" alt=\"Entwurf des Formulars frmMehrreihenfolgeListBox\" width=\"474,6776\" height=\"349,9448\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 1: Entwurf des Formulars frmMehrreihenfolgeListBox<\/span><\/b><\/p>\n<p>Au&szlig;erdem hinterlegen wir als <b>Datensatzherkunft <\/b>f&uuml;r das Listenfeld die Tabelle <b>tblKategorien<\/b>, deren Entwurf wie in Bild 2 aussieht. Genau genommen verwenden wir sogar eine Abfrage auf Basis dieser Tabelle, welche die Datens&auml;tze nach dem Feld <b>ReihenfolgeID<\/b> sortiert:<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2019_04\/pic_1197_002.png\" alt=\"Entwurf der Tabelle tblKategorien\" width=\"549,6265\" height=\"341,5942\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 2: Entwurf der Tabelle tblKategorien<\/span><\/b><\/p>\n<pre>SELECT tblKategorien.KategorieID, tblKategorien.Kategoriename, tblKategorien.ReihenfolgeID FROM tblKategorien ORDER BY tblKategorien.ReihenfolgeID;<\/pre>\n<p>Die Eigenschaft <b>Spaltenanzahl <\/b>des Listenfeldes stellen wir auf <b>3 <\/b>ein, die Eigenschaft <b>Spaltenbreiten <\/b>auf <b>0cm;5cm<\/b>. Dadurch erscheinen nur das zweite und das dritte Feld der Datensatzherkunft im Listenfeld, also die Felder <b>Kategoriename <\/b>und <b>ReihenfolgeID<\/b>.<\/p>\n<h2>Definition des &Auml;nderns der Reihenfolge<\/h2>\n<p>Bevor wir uns an die Programmierung begeben, m&uuml;ssen wir noch herausfinden, wie die Reihenfolge &uuml;berhaupt ge&auml;ndert werden soll. Bei einem einzelnen Element, dessen Reihenfolge verschoben werden soll, ist das kein Problem: Hier ermitteln wir die <b>ReihenfolgeID<\/b> des zu verschiebenden Elements und den des Zielelements und nehmen entsprechende &Auml;nderungen an den Inhalten dieses Felds f&uuml;r die betroffenen Datens&auml;tze vor.<\/p>\n<p>Bei mehreren gleichzeitig zu verschiebenden Datens&auml;tzen, die dar&uuml;berhinaus noch nicht einmal zusammenh&auml;ngen m&uuml;ssen, ist allerdings zuvor zu definieren, welcher Datensatz wo landet. Wenn Sie beispielsweise den zweiten und den dritten Eintrag markieren und die Schaltfl&auml;che <b>Ganz nach oben <\/b>bet&auml;tigen, ist die Aufgabe klar: Dann sollen der zweite und der dritte Datensatz die erste und die zweite Position einnehmen und der erste auf die dritte Position verschoben werden:<\/p>\n<pre>Vorher:      Nachher:\r\nEintrag 1    Eintrag 2\r\nEintrag 2    Eintrag 3\r\nEintrag 3    Eintrag 1\r\n...          ...<\/pre>\n<p>Gleiches gilt, wenn diese beiden Datens&auml;tze etwa mit der Schaltfl&auml;che <b>Nach unten <\/b>um eine Position nach unten verschoben werden sollen: Dann landen der zweite und der dritte Eintrag auf der dritten und vierten Position und der vierte Eintrag wird nach oben auf die zweite Position verschoben:<\/p>\n<pre>Vorher:      Nachher:\r\nEintrag 1    Eintrag 1\r\nEintrag 2    Eintrag 4\r\nEintrag 3    Eintrag 2\r\nEintrag 4    Eintrag 3\r\n...          ...<\/pre>\n<p>Was aber, wenn der Benutzer etwa den zweiten und den vierten Eintrag verschiebt Dann gibt es zwei M&ouml;glichkeiten:<\/p>\n<ul>\n<li>Die Eintr&auml;ge werden in dem Raster, in dem sie sich gerade befinden, nach oben verschoben.<\/li>\n<li>Die zu verschiebenden Eintr&auml;ge werden zu einem Block zusammengefasst und an die Zielposition verschoben.<\/li>\n<\/ul>\n<p>Beides l&auml;sst sich wieder besser am Beispiel erl&auml;utern. Angenommen, wir wollen den zweiten und den vierten Eintrag nach der ersten Methode um eine Position nach oben verschieben, sieht das so aus:<\/p>\n<pre>Vorher:      Nachher:\r\nEintrag 1    Eintrag 2\r\nEintrag 2    Eintrag 1\r\nEintrag 3    Eintrag 4\r\nEintrag 4    Eintrag 3<\/pre>\n<p>Die Eintr&auml;ge werden also nach oben verschoben, behalten aber die Abst&auml;nde zueinander bei. Oder wir verschieben einfach alle markierten Elemente an die Zielposition und alle verdr&auml;ngten Elemente nach unten:<\/p>\n<pre>Vorher:      Nachher:\r\nEintrag 1    Eintrag 2\r\nEintrag 2    Eintrag 4\r\nEintrag 3    Eintrag 1\r\nEintrag 4    Eintrag 3<\/pre>\n<p>Da die zweite Methode einfacher zu programmieren ist, werden wir diese verwenden. Auch, weil uns kein Anwendungsfall einf&auml;llt, bei dem man nach der erstgenannten Methode verfahren sollte.<\/p>\n<h2>Code f&uuml;r Formular und Listenfeld<\/h2>\n<p>Im Klassenmodul des Formulars legen wir zun&auml;chst drei Konstanten an, die wichtige Daten aufnehmen, die an vielen Stellen verwendet werden &#8211; zum Beispiel den Namen der Quelltabelle, des Prim&auml;rschl&uuml;sselfeldes dieser Tabelle und des Reihenfolge-Feldes.<\/p>\n<p>Auf diese Weise brauchen Sie diese Bezeichnungen nur an einer Stelle zu &auml;ndern, wenn Sie die Reihenfolge-Funktionen einmal in ein anderes Formular &uuml;bernehmen wollen:<\/p>\n<pre>Const m_Table<span style=\"color:blue;\"> As String<\/span> = \"tblKategorien\"\r\nConst m_PKField<span style=\"color:blue;\"> As String<\/span> = \"KategorieID\"\r\nConst m_Orderfield<span style=\"color:blue;\"> As String<\/span> = \"ReihenfolgeID\"<\/pre>\n<p>Au&szlig;erdem deklarieren wir eine Variable namens <b>m_ListBox<\/b>, in der wie einen Verweis auf das Listenfeld speichern, das die Datens&auml;tze in der Reihenfolge anzeigen soll:<\/p>\n<pre><span style=\"color:blue;\">Dim <\/span>m_ListBox<span style=\"color:blue;\"> As <\/span>ListBox<\/pre>\n<p>Diese Variable f&uuml;llen wir gleich beim Laden des Formulars in der folgenden Prozedur mit einem Verweis auf das gew&uuml;nschte Listenfeld:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>Form_Load()\r\n     <span style=\"color:blue;\">Set<\/span> m_ListBox = Me!lstKategorien\r\n     FillOrderID\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Hier rufen wir auch gleich die Prozedur <b>FillOrderID <\/b>auf. Diese sorgt daf&uuml;r, dass die Werte des Feldes <b>ReihenfolgeID <\/b>aktualisiert werden, so dass diese durchnummeriert sind.<\/p>\n<h2>ReihenfolgeID aktualisieren<\/h2>\n<p>Die Prozedur <b>FillOrder <\/b>sieht wie in Listing 1 aus. Diese Prozedur greift die Inhalte der Konstanten <b>m_PKField<\/b>, <b>m_Orderfield <\/b>und <b>m_Table <\/b>auf und stellt damit ein Recordset zusammen, das die Datens&auml;tze der angegebenen Tabelle, hier <b>tblKategorien<\/b>, mit den interessanten Feldern <b>KategorieID <\/b>und <b>ReihenfolgeID <\/b>enth&auml;lt. Dieses Recordset durchl&auml;uft die Prozedur in einer <b>Do While<\/b>-Schleife und aktualisiert dort den Wert des Feldes aus <b>m_Orderfield<\/b>, hier <b>ReihenfolgeID<\/b>, mit dem Wert der Eigenschaft <b>AbsolutePosition <\/b>des Recordsets und addiert noch den Wert <b>1 <\/b>hinzu. Dadurch werden die Datens&auml;tze der Tabelle mit Werten f&uuml;r das Feld <b>ReihenfolgeID <\/b>durchnummeriert.<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>FillOrderID()\r\n     <span style=\"color:blue;\">Dim <\/span>db<span style=\"color:blue;\"> As <\/span>DAO.Database\r\n     <span style=\"color:blue;\">Dim <\/span>rst<span style=\"color:blue;\"> As <\/span>DAO.Recordset\r\n     <span style=\"color:blue;\">Set<\/span> db = CodeDb\r\n     <span style=\"color:blue;\">Set<\/span> rst = db.OpenRecordset(\"SELECT \" & m_PKField & \", \" & m_Orderfield & \" FROM \" & m_Table & \" ORDER BY \" _\r\n         & m_Orderfield, dbOpenDynaset)\r\n     <span style=\"color:blue;\">Do While<\/span> <span style=\"color:blue;\">Not<\/span> rst.EOF\r\n         rst.Edit\r\n         rst(m_Orderfield) = rst.AbsolutePosition + 1\r\n         rst.Update\r\n         rst.Move<span style=\"color:blue;\">Next<\/span>\r\n     <span style=\"color:blue;\">Loop<\/span>\r\n     rst.Close\r\n     <span style=\"color:blue;\">Set<\/span> rst = Nothing\r\n     <span style=\"color:blue;\">Set<\/span> db = Nothing\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 1: Prozedur zum Wiederherstellen der Werte des Feldes ReihenfolgeID<\/span><\/b><\/p>\n<p>Das Ergebnis sieht dann wie in Bild 3 aus.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2019_04\/pic_1197_003.png\" alt=\"Die Tabelle tblKategorien mit Werten im Feld ReihenfolgeID\" width=\"499,6607\" height=\"242,7162\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 3: Die Tabelle tblKategorien mit Werten im Feld ReihenfolgeID<\/span><\/b><\/p>\n<h2>Schaltfl&auml;chen mit Code versehen<\/h2>\n<p>Die vier Schaltfl&auml;chen versehen wir mit jeweils einer Prozedur, welche die Reihenfolge der aktuell markierten Eintr&auml;ge aktualisiert. Die Prozedur f&uuml;r die oberste Schaltfl&auml;che <b>cmdTop <\/b>lautet wie folgt:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>cmdTop_Click()\r\n     <span style=\"color:blue;\">Dim <\/span>lngTarget<span style=\"color:blue;\"> As Long<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>lngMove()<span style=\"color:blue;\"> As Long<\/span>\r\n     lngMove = GetMove\r\n     lngTarget = DMin(m_Orderfield, m_Table)\r\n     InterchangeOrder lngTarget, lngMove\r\n     RequeryControls lngMove\r\n<span style=\"color:blue;\">End Sub<\/span> <\/pre>\n<p>Hier rufen wir als Erstes die Funktion <b>GetMove <\/b>auf. Diese ist daf&uuml;r verantwortlich, ein Array zusammenzustellen, dass alle Prim&auml;rschl&uuml;sselwerte der zu verschiebenden Eintr&auml;ge des Listenfeldes aufnimmt (siehe Listing 2). Die Funktion durchl&auml;uft dazu eine <b>For Each<\/b>-Schleife &uuml;ber alle ausgew&auml;hlten Elemente des Listenfeldes (<b>ItemsSelected<\/b>), das wir mit <b>m_ListBox <\/b>referenziert haben. Der 0-basierte Index des jeweils durchlaufenen Elements wird in der Variablen <b>var <\/b>gespeichert. Darin wird zuerst das Array <b>lngMove <\/b>auf eine Anzahl von Eintr&auml;gen entsprechend dem Wert der Variablen <b>i <\/b>erweitert. Dann weisen wir dem Element mit dem Index <b>i<\/b> den Wert der ersten Spalte des Listenfeldes zu (<b>ItemData(var)<\/b>). Schlie&szlig;lich erh&ouml;hen wir den Wert der Variablen <b>i <\/b>um eins, bevor wir den n&auml;chsten ausgew&auml;hlten Eintrag untersuchen.<\/p>\n<pre><span style=\"color:blue;\">Private Function <\/span>GetMove()<span style=\"color:blue;\"> As Long<\/span>()\r\n     <span style=\"color:blue;\">Dim <\/span>lngMove()<span style=\"color:blue;\"> As Long<\/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>var<span style=\"color:blue;\"> As Variant<\/span>\r\n     For Each var In m_ListBox.ItemsSelected\r\n         ReDim Preserve lngMove(i)\r\n         lngMove(i) = m_ListBox.ItemData(var)\r\n         i = i + 1\r\n     <span style=\"color:blue;\">Next<\/span> var\r\n     GetMove = lngMove\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 2: Die Prozedur GetMove<\/span><\/b><\/p>\n<p>Die n&auml;chste Anweisung ermittelt mit der <b>DMin<\/b>-Funktion den kleinsten Wert des Feldes aus <b>m_Orderfield <\/b>(hier <b>ReihenfolgeID<\/b>) der Tabelle aus <b>m_Table <\/b>(hier <b>tblKategorien<\/b>) und speichert diesen in der Variablen <b>lngTarget<\/b>. Das ist in diesem Fall das Ziel beim Verschieben des Elements. Danach folgt der Aufruf der Prozedur <b>InterchangeOrder <\/b>mit <b>lngTarget <\/b>und dem Array <b>lngMove <\/b>als Parameter. Diese schauen wir uns weiter unten an. Die Prozedur stellt die <b>ReihenfolgeID<\/b>-Werte f&uuml;r die betroffenen Elemente neu ein.<\/p>\n<p>Schlie&szlig;lich ruft die Prozedur noch eine weitere Routine namens <b>RequeryControls <\/b>auf. Diese aktualisiert zuerst den Inhalt des Listenfeldes, wodurch die Elemente nach dem &Auml;ndern der Werte des Feldes <b>ReihenfolgeID <\/b>durch die vorgegebene Sortierung gegebenenfalls neu angeordnet werden. Dann ruft sie die Prozedur <b>SelectEntries<\/b> auf, die daf&uuml;r sorgt, dass die vor dem Verschieben markierten Eintr&auml;ge erneut markiert werden. Durch das <b>Requery<\/b> gehen die Markierungen n&auml;mlich verloren. Schlie&szlig;lich sorgt die Prozedur <b>ActivateControls <\/b>daf&uuml;r, dass die Schaltfl&auml;chen entsprechend der aktuell ausgew&auml;hlten Elemente aktiviert oder deaktiviert werden. Wenn n&auml;mlich das erste Element markiert ist, sollen die Schaltfl&auml;chen <b>Ganz nach oben <\/b>und <b>Nach oben <\/b>deaktiviert werden. Wenn das letzte Element markiert ist, sollen die Schaltfl&auml;chen <b>Nach unten <\/b>und <b>Ganz nach unten <\/b>deaktiviert sein:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>RequeryControls(lngMove()<span style=\"color:blue;\"> As Long<\/span>)\r\n     m_ListBox.Requery\r\n     SelectEntries lngMove()\r\n     ActivateControls\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<h2>Schaltfl&auml;che &#8222;Nach oben&#8220;<\/h2>\n<p>Bevor wir uns die hier erw&auml;hnten Prozeduren ansehen, werfen wir noch einen Blick auf den Code der &uuml;brigen Schaltfl&auml;chen. Zun&auml;chst die Schaltfl&auml;che, mit der die aktuell markierten Eintr&auml;ge um eine Position nach oben verschoben werden sollen:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>cmdUp_Click()\r\n     <span style=\"color:blue;\">Dim <\/span>lngTarget<span style=\"color:blue;\"> As Long<\/span>, lngTargetMove<span style=\"color:blue;\"> As Long<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>lngMove()<span style=\"color:blue;\"> As Long<\/span>\r\n     lngMove = GetMove\r\n     lngTargetMove = DLookup(m_Orderfield, m_Table, _\r\n         m_PKField & \"=\" & lngMove(0))\r\n     lngTarget = DMax(m_Orderfield, m_Table, m_Orderfield _\r\n         & \"&lt;\" & lngTargetMove)\r\n     InterchangeOrder lngTarget, lngMove\r\n     RequeryControls lngMove\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><!--30percent--><\/p>\n<p>Der Unterschied ist, dass wir den Wert f&uuml;r <b>lngTarget<\/b>, also f&uuml;r die Zielposition, auf etwas aufwendigere Weise ermitteln, und zwar mit zwei Dom&auml;nenfunktionen. Die erste <b>DLookup<\/b>-Funktion ermittelt den Wert des Feldes <b>ReihenfolgeID <\/b>f&uuml;r den Datensatz der Tabelle <b>tblKategorien<\/b>, der dem ersten markierten Datensatz entspricht. Wenn also die Datens&auml;tze mit den Prim&auml;rschl&uuml;sselwerten <b>2 <\/b>und <b>3 <\/b>markiert sind, die in diesem Fall auch die Positionen <b>2 <\/b>und <b>3 <\/b>innehaben, dann ist der mit dem Prim&auml;rschl&uuml;sselwert <b>2 <\/b>der aus <b>lngMove(0)<\/b>, also der erste Wert des Arrays. F&uuml;r diesen ermittelt die <b>DLookup<\/b>-Funktion dann den Wert des Feldes <b>ReihenfolgeID<\/b>, hier auch <b>2<\/b>, und schreibt ihn in die Variable <b>lngTargetMove<\/b>. Die folgende <b>DMax<\/b>-Funktion ermittelt dann den gr&ouml;&szlig;ten Wert des Feldes <b>ReihenfolgeID<\/b>, der kleiner als der Wert aus <b>lngTargetMove <\/b>ist. Damit ist dann die Ziel-Reihenfolgenposition ermittelt und in der Variablen <b>lngTarget <\/b>gespeichert. Mit <b>lngTarget <\/b>und <b>lngMove() <\/b>wird dann wiederum die Prozedur <b>InterchangeOrder <\/b>aufgerufen und dann die Prozedur <b>RequeryControls<\/b>.<\/p>\n<h2>Schaltfl&auml;che &#8222;Ganz nach unten&#8220;<\/h2>\n<p>Die durch diese Schaltfl&auml;che ausgel&ouml;ste Prozedur ist wieder genauso einfach wie die f&uuml;r die Schaltfl&auml;che <b>Ganz nach oben<\/b>. Hier verwenden wir lediglich f&uuml;r die Variable <b>lngTarget <\/b>den maximalen Wert des Feldes <b>ReihenfolgeID <\/b>der Tabelle <b>tblKategorien<\/b>:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>cmdBottom_Click()\r\n     <span style=\"color:blue;\">Dim <\/span>lngTarget<span style=\"color:blue;\"> As Long<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>lngMove()<span style=\"color:blue;\"> As Long<\/span>\r\n     lngMove = GetMove\r\n     lngTarget = DMax(m_Orderfield, m_Table)\r\n     InterchangeOrder lngTarget, lngMove\r\n     RequeryControls lngMove\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<h2>Schaltfl&auml;che &#8222;Nach unten&#8220;<\/h2>\n<p>Etwas komplizierter ist dagegen die Schaltfl&auml;che mit der Beschriftung <b>Nach unten<\/b> (siehe Listing 3). Hier ermitteln wir wieder das Array mit den Prim&auml;rschl&uuml;sselwerten der markierten Elemente. Daraus berechnen wir dann &uuml;ber die Funktion <b>UBound <\/b>den gr&ouml;&szlig;ten Index-Wert und speichern ihn in <b>lngMax<\/b>. Diesen nutzen wir dann in einer <b>DLookup<\/b>-Funktion als Vergleichswert f&uuml;r das Kriterium, mit der wir den <b>ReihenfolgeID<\/b>-Wert f&uuml;r den untersten markierten Eintrag ermitteln. Die folgende <b>DMin<\/b>-Funktion liest dann den kleinsten <b>ReihenfolgeID<\/b>-Wert der Tabelle <b>tblKategorien <\/b>ein, der gr&ouml;&szlig;er ist als der <b>ReihenfolgeID<\/b>-Wert aus <b>lngTargetMove<\/b>. Der Rest entspricht der Vorgehensweise der vorherigen Prozeduren.<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>cmdDown_Click()\r\n     <span style=\"color:blue;\">Dim <\/span>lngTarget<span style=\"color:blue;\"> As Long<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>lngMove()<span style=\"color:blue;\"> As Long<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>lngTargetMove<span style=\"color:blue;\"> As Long<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>lngMax<span style=\"color:blue;\"> As Long<\/span>\r\n     lngMove = GetMove\r\n     lngMax = <span style=\"color:blue;\">UBound<\/span>(lngMove)\r\n     lngTargetMove = DLookup(m_Orderfield, m_Table, m_PKField & \"=\" & lngMove(lngMax))\r\n     lngTarget = DMin(m_Orderfield, m_Table, m_Orderfield & \"&gt;\" & lngTargetMove)\r\n     InterchangeOrder lngTarget, lngMove\r\n     RequeryControls lngMove\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 3: Prozedur zum Verschieben der markierten Eintr&auml;ge nach unten<\/span><\/b><\/p>\n<h2>Reihenfolge vertauschen<\/h2>\n<p>Diese Prozedur erwartet die <b>ReihenfolgeID <\/b>f&uuml;r das Element, vor oder hinter dem die zu verschiebenden Elemente landen sollen (<b>lngTargetOrderID<\/b>) und das Array mit den Prim&auml;rschl&uuml;sselwerten der zu verschiebenden Elemente als Parameter. Ob die Elemente vor oder hinter das Zielelement verschoben werden, h&auml;ngt von der Richtung ab: Wenn die Elemente nach oben verschoben werden, landen Sie vor dem Zielelement, wenn Sie nach unten verschoben werden, hinter dem Zielelement. Die Prozedur durchl&auml;uft im ersten Teil (siehe Listing 4) zuerst eine <b>For&#8230;Next<\/b>-Schleife, in der die einzelnen Elemente aus dem Array <b>lngMove <\/b>zu einer kommaseparierten Liste zusammengef&uuml;gt werden. Anschlie&szlig;end sieht der Inhalt etwa so aus:<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>InterchangeOrder(lngTargetOrderID<span style=\"color:blue;\"> As Long<\/span>, lngMove()<span style=\"color:blue;\"> As Long<\/span>)\r\n     <span style=\"color:blue;\">Dim <\/span>db<span style=\"color:blue;\"> As <\/span>DAO.Database\r\n     <span style=\"color:blue;\">Dim <\/span>rstVerschieben<span style=\"color:blue;\"> As <\/span>DAO.Recordset\r\n     <span style=\"color:blue;\">Dim <\/span>rstVerdraengen<span style=\"color:blue;\"> As <\/span>DAO.Recordset\r\n     <span style=\"color:blue;\">Dim <\/span>strVerschieben<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strVerdraengen<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>lngTargetMove<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>i<span style=\"color:blue;\"> As Integer<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>j<span style=\"color:blue;\"> As Integer<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>lngStartVerschieben<span style=\"color:blue;\"> As Long<\/span>\r\n     <span style=\"color:blue;\">Set<\/span> db = CodeDb\r\n     For i = <span style=\"color:blue;\">LBound<\/span>(lngMove) To <span style=\"color:blue;\">UBound<\/span>(lngMove)\r\n         strIn = strIn & \", \" & lngMove(i)\r\n     <span style=\"color:blue;\">Next<\/span> i\r\n     strIn = <span style=\"color:blue;\">Mid<\/span>(strIn, 3)\r\n     strIn = \" IN (\" & strIn & \")\"\r\n     lngTargetMove = DLookup(m_Orderfield, m_Table, m_PKField & \" = \" & lngMove(0))\r\n     <span style=\"color:blue;\">If <\/span>lngTargetOrderID &lt; lngTargetMove<span style=\"color:blue;\"> Then<\/span>\r\n         strVerschieben = \"SELECT \" & m_PKField & \", \" & m_Orderfield & \" FROM \" & m_Table & \" WHERE \" & m_PKField _\r\n             & strIn & \" ORDER BY \" & m_Orderfield\r\n         <span style=\"color:blue;\">Set<\/span> rstVerschieben = db.OpenRecordset(strVerschieben, dbOpenDynaset)\r\n         j = lngTargetOrderID\r\n         <span style=\"color:blue;\">Do While<\/span> <span style=\"color:blue;\">Not<\/span> rstVerschieben.EOF\r\n             rstVerschieben.Edit\r\n             rstVerschieben(m_Orderfield) = j\r\n             rstVerschieben.Update\r\n             rstVerschieben.Move<span style=\"color:blue;\">Next<\/span>\r\n             j = j + 1\r\n         <span style=\"color:blue;\">Loop<\/span>\r\n         strVerdraengen = \"SELECT \" & m_PKField & \", \" & m_Orderfield & \" FROM \" & m_Table _\r\n             & \" WHERE \" & m_PKField _\r\n             & \" NOT\" & strIn & \" AND \" & m_Orderfield & \" &gt;= \" & lngTargetOrderID & \" ORDER BY \" & m_Orderfield\r\n         <span style=\"color:blue;\">Set<\/span> rstVerdraengen = db.OpenRecordset(strVerdraengen, dbOpenDynaset)\r\n         <span style=\"color:blue;\">Do While<\/span> <span style=\"color:blue;\">Not<\/span> rstVerdraengen.EOF\r\n             rstVerdraengen.Edit\r\n             rstVerdraengen(m_Orderfield) = j\r\n             rstVerdraengen.Update\r\n             rstVerdraengen.Move<span style=\"color:blue;\">Next<\/span>\r\n             j = j + 1\r\n         <span style=\"color:blue;\">Loop<\/span>\r\n     ...<\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 4: Prozedur zum Vertauschen der Reihenfolge, Teil 1<\/span><\/b><\/p>\n<pre>, 1, 2, 3<\/pre>\n<p>Von dieser Zeichenkette trennt die folgende <b>Mid<\/b>-Funktion die ersten beiden Zeichen ab, also das Komma und das Leerzeichen. Die folgende Prozedur f&uuml;gt dann vorn die <b>IN<\/b>-Klausel an und fasst die Liste der Prim&auml;rschl&uuml;sselwerte in runde Klammern ein. Das Ergebnis sieht dann etwa so aus:<\/p>\n<pre>IN (1, 2, 3)<\/pre>\n<p>Danach ermitteln wir per <b>DLookup <\/b>den <b>ReihenfolgeID<\/b>-Wert f&uuml;r das erste markierte Element aus dem Array <b>lngMove<\/b> und speichern es in der Variablen <b>lngTargetMove<\/b>. Ist der Parameter <b>lngTargetOrderID<\/b>, der die <b>ReihenfolgeID <\/b>mit dem Ziel des Verschiebens angibt, kleiner als <b>lngTargetMove<\/b>, dann soll das Verschieben offensichtlich nach oben erfolgen. In diesem Fall kommt der erste Teil der nachfolgenden <b>If&#8230;Then<\/b>-Bedingung zum Einsatz, anderenfalls der <b>Else<\/b>-Teil. Im <b>If<\/b>-Teil stellen wir eine SQL-Abfrage zum Ermitteln der zu verschiebenden Elemente zusammen. Wenn wir etwa die Elemente mit den Prim&auml;rschl&uuml;sselwerten <b>4<\/b>, <b>6 <\/b>und <b>8 <\/b>um eine Position nach oben verschieben wollen, resultiert das in der folgenden SQL-Abfrage:<\/p>\n<pre>SELECT * FROM tblKategorien WHERE KategorieID IN (4, 6, 8) ORDER BY ReihenfolgeID<\/pre>\n<p>Auf Basis dieser Abfrage erstellt die Prozedur dann ein Recordset namens <b>rstVerschieben<\/b>. Vor dem Ausf&uuml;hren der <b>Do While<\/b>-Schleife &uuml;ber alle Datens&auml;tze des Recordsets tragen wir den Wert aus <b>lngTargetOrderID <\/b>in die Z&auml;hlervariable <b>j <\/b>ein. Danach beginnen wir in der Schleife mit dem Anpassen zun&auml;chst der <b>ReihenfolgeID<\/b>-Werte der zu verschiebenden Datens&auml;tze. Dazu versetzen wir den aktuellen Datensatz mit der <b>Edit<\/b>-Methode in den Bearbeiten-Zustand. Dann stellen wir den Wert des Feldes aus <b>m_Orderfield<\/b>, hier <b>ReihenfolgeID<\/b>, auf den Wert aus der Variablen <b>j <\/b>ein. F&uuml;r den ersten Datensatz, der im Beispiel den Wert <b>4 <\/b>f&uuml;r das Feld <b>ReihenfolgeID <\/b>aufweist, erh&auml;lt dieses Feld nun den Wert <b>3<\/b>. Nach dem Speichern der &Auml;nderungen erh&auml;lt der Datensatz mit dem Wert <b>6 <\/b>im Feld <b>ReihenfolgeID <\/b>den Wert <b>4<\/b>, also <b>j + 1<\/b>. Nach dem Einstellen der <b>ReihenfolgeID<\/b>-Werte f&uuml;r die zu verschiebenden Eintr&auml;ge m&uuml;ssen nat&uuml;rlich noch die f&uuml;r die &uuml;brigen Eintr&auml;ge angepasst werden. Diese Datens&auml;tze ermitteln wir mit einer zweiten SQL-Abfrage, die nach dem Zusammensetzen f&uuml;r unser Beispiel wie folgt aussieht:<\/p>\n<pre>SELECT * FROM tblKategorien WHERE KategorieID \r\nNOT IN (4, 6, 8) \r\nAND ReihenfolgeID &gt;= 3 ORDER BY ReihenfolgeID<\/pre>\n<p>Hier suchen wir also nach allen Datens&auml;tzen, die nicht zu den zu verschiebenden Datens&auml;tzen geh&ouml;ren (<b>NOT IN (4, 6, 8)<\/b>) und deren <b>ReihenfolgeID<\/b>-Wert gr&ouml;&szlig;er oder gleich <b>3 <\/b>ist &#8211; wir schlie&szlig;en also die Datens&auml;tze aus, die ohnehin vor dem Ziel des Verschiebevorgangs liegen und die nicht angepasst werden m&uuml;ssen. Diese Datens&auml;tze landen in einem Recordset namens <b>rstVerdraengen<\/b>.<\/p>\n<p>F&uuml;r diese Datens&auml;tze vergeben wir &uuml;ber die Z&auml;hlervariable <b>j<\/b>, die wir weiter mit jedem Datensatz um eins erh&ouml;hen, die neuen Werte f&uuml;r das Feld <b>ReihenfolgeID<\/b>.<\/p>\n<h2>Else-Teil der Prozedur InterchangeOrder<\/h2>\n<p>Im <b>Else<\/b>-Teil der Prozedur, den Sie in Listing 5 finden, ermitteln wir f&uuml;r die Variable <b>lngStartVerschieben <\/b>den Wert des Feldes <b>ReihenfolgeID <\/b>f&uuml;r das erste zu verschiebende Element aus dem Array <b>lngMove<\/b>.<\/p>\n<pre>     ...\r\n     <span style=\"color:blue;\">Else<\/span>\r\n         lngStartVerschieben = DLookup(m_Orderfield, m_Table, m_PKField & \"=\" & lngMove(0))\r\n         strVerdraengen = \"SELECT \" & m_PKField & \", \" & m_Orderfield & \" FROM \" & m_Table _\r\n             & \" WHERE \" & m_PKField _\r\n             & \" NOT\" & strIn & \" AND \" & m_Orderfield & \" &gt; \" & lngStartVerschieben _\r\n             & \" AND \" & m_Orderfield & \" &lt;= \" _\r\n             & lngTargetOrderID & \" ORDER BY \" & m_Orderfield\r\n         <span style=\"color:blue;\">Set<\/span> rstVerdraengen = db.OpenRecordset(strVerdraengen, dbOpenDynaset)\r\n         j = DLookup(m_Orderfield, m_Table, m_PKField & \"=\" & lngMove(0))\r\n         <span style=\"color:blue;\">Do While<\/span> <span style=\"color:blue;\">Not<\/span> rstVerdraengen.EOF\r\n             rstVerdraengen.Edit\r\n             rstVerdraengen(m_Orderfield) = j\r\n             rstVerdraengen.Update\r\n             rstVerdraengen.Move<span style=\"color:blue;\">Next<\/span>\r\n             j = j + 1\r\n         <span style=\"color:blue;\">Loop<\/span>\r\n         strVerschieben = \"SELECT \" & m_PKField & \", \" & m_Orderfield & \" FROM \" & m_Table _\r\n             & \" WHERE \" & m_PKField _\r\n             & strIn & \" ORDER BY \" & m_Orderfield\r\n         <span style=\"color:blue;\">Set<\/span> rstVerschieben = db.OpenRecordset(strVerschieben, dbOpenDynaset)\r\n         <span style=\"color:blue;\">Do While<\/span> <span style=\"color:blue;\">Not<\/span> rstVerschieben.EOF\r\n             rstVerschieben.Edit\r\n             rstVerschieben(m_Orderfield) = j\r\n             rstVerschieben.Update\r\n             rstVerschieben.Move<span style=\"color:blue;\">Next<\/span>\r\n             j = j + 1\r\n         <span style=\"color:blue;\">Loop<\/span>\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 5: Prozedur zum Vertauschen der Reihenfolge, Teil 2<\/span><\/b><\/p>\n<p>Diesen nutzen wir in diesem Beispiel, in dem wir die Datens&auml;tze mit den Prim&auml;rschl&uuml;sselwerten <b>2<\/b>, <b>4 <\/b>und <b>6 <\/b>nach unten verschieben wollen, um eine SQL-Anweisung wie die folgende zusammenzustellen:<\/p>\n<pre>SELECT * FROM tblKategorien WHERE KategorieID NOT IN (2, 4, 6) AND ReihenfolgeID &gt; 2 AND ReihenfolgeID &lt;= 7 ORDER BY ReihenfolgeID<\/pre>\n<p>Die erste Anweisung enth&auml;lt im Gegensatz zum <b>If<\/b>-Teil der Bedingung zuerst die Elemente, die nicht verschoben werden, sondern deren neue Position sich durch das Verschieben der anderen Elemente ergibt. Dementsprechend enth&auml;lt sie eine <b>NOT IN<\/b>-Klausel mit den zu verschiebenden Elementen, denn die werden nachher mit einer neuen <b>ReihenfolgeID <\/b>versehen. Die Bedingung <b>ReihenfolgeID > 2 <\/b>haben wir eingef&uuml;gt, damit nur die Elemente mit einer neuen <b>ReihenfolgeID <\/b>versehen werden, deren Wert f&uuml;r die <b>ReihenfolgeID <\/b>gr&ouml;&szlig;er ist als der des kleinsten zu verschiebenden Elements. Den Vergleichswert dieser Bedingung ermitteln wir f&uuml;r die oben beschriebene Variable <b>lngStartVerschieben<\/b>. Die dritte Bedingung <b>ReihenfolgeID <= 7 <\/b>legt fest, bis zu welchem Element &Auml;nderungen an der <b>ReihenfolgeID <\/b>n&ouml;tig sind.<\/p>\n<p>Wir ermitteln dann wieder den Wert der Z&auml;hlervariablen <b>j<\/b>, der diesmal dem Wert des Feldes <b>ReihenfolgeID <\/b>f&uuml;r das erste zu verschiebende Element entspricht, hier also <b>2<\/b>. Da die Elemente <b>2<\/b>, <b>4 <\/b>und <b>6 <\/b>nach hinten verschoben werden sollen, rutschen die Elemente <b>3<\/b>, <b>5 <\/b>und <b>7 <\/b>nach vorn und sollen f&uuml;r die <b>ReihenfolgeID <\/b>die Werte <b>2<\/b>, <b>3 <\/b>und <b>4 <\/b>erhalten. Die Elemente mit den bisherigen <b>ReihenfolgeID<\/b>-Werten <b>2<\/b>, <b>4 <\/b>und <b>6 <\/b>erhalten dann sp&auml;ter die Werte <b>5<\/b>, <b>6 <\/b>und <b>7<\/b>.<\/p>\n<p>Also starten wir mit den Wert <b>2 <\/b>f&uuml;r das erste nicht zu verschiebende Element in die <b>Do While<\/b>-Schleife &uuml;ber die Datens&auml;tze des Recordsets <b>rstVerschieben<\/b> und weisen diesen Wert dem Feld <b>ReihenfolgeID <\/b>zu. Auf diese Weise legen wir auch die <b>ReihenfolgeID <\/b>f&uuml;r die &uuml;brigen Elemente dieses Recordsets fest.<\/p>\n<p>Danach ermitteln wir wieder die Datens&auml;tze, die verschoben werden sollen. Dazu stellen wir die gleiche Abfrage wie schon im <b>If<\/b>-Teil der Bedingung zusammen und durchlaufen die Elemente, deren Feld <b>ReihenfolgeID<\/b> wir nun mit den folgenden Werten der Variablen <b>j <\/b>f&uuml;llen. Damit ist die Aktualisierung der Werte des Feldes <b>ReihenfolgeID <\/b>abgeschlossen.<\/p>\n<h2>Eintr&auml;ge wieder ausw&auml;hlen<\/h2>\n<p>Danach folgen die Anweisungen der weiter oben bereits vorgestellten Prozedur <b>RequeryControls<\/b>. Diese aktualisiert zun&auml;chst die Datensatzherkunft des Listenfeldes, wodurch die Markierung verloren geht. Deshalb ruft diese Prozedur danach die Routine <b>SelectEntries <\/b>auf, die wie folgt aussieht:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>SelectEntries(lngMove()<span style=\"color:blue;\"> As Long<\/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>j<span style=\"color:blue;\"> As Integer<\/span>\r\n     For j = 0 To m_ListBox.ListCount\r\n         m_ListBox.Selected(j) = <span style=\"color:blue;\">False<\/span>\r\n     <span style=\"color:blue;\">Next<\/span> j\r\n     For i = <span style=\"color:blue;\">LBound<\/span>(lngMove) To <span style=\"color:blue;\">UBound<\/span>(lngMove)\r\n         For j = 0 To m_ListBox.ListCount\r\n             <span style=\"color:blue;\">If <\/span>lngMove(i) = m_ListBox.ItemData(j)<span style=\"color:blue;\"> Then<\/span>\r\n                 m_ListBox.Selected(j) = <span style=\"color:blue;\">True<\/span>\r\n             <span style=\"color:blue;\">End If<\/span>\r\n         <span style=\"color:blue;\">Next<\/span> j\r\n     <span style=\"color:blue;\">Next<\/span> i\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Die Prozedur durchl&auml;uft zun&auml;chst alle selektierten Eintr&auml;ge, um die Auswahl eventuell noch ausgew&auml;hlter Elemente r&uuml;ckg&auml;ngig zu machen. Dazu stellt sie die Eigenschaft <b>Selected <\/b>f&uuml;r das Element mit dem Index aus der Laufvariablen <b>j <\/b>auf <b>False <\/b>ein.<\/p>\n<p>Die folgende Schleife durchl&auml;uft alle Elemente des Arrays <b>lngMove<\/b>, das der Routine als Parameter &uuml;bergeben wurde. Darin befindet sich eine weitere Schleife, die alle Elemente des Listenfelds durchl&auml;uft. Wir pr&uuml;fen darin f&uuml;r jedes Element der Listenfelds, ob sein Wert der ersten Spalte mit dem Wert des aktuellen Elements des Arrays <b>lngMove <\/b>&uuml;bereinstimmt. Sprich: Handelt es sich beim Listeneintrag um eines der zu verschiebenden Elemente, ist die Bedingung innerhalb der zweiten Schleife erf&uuml;llt.<\/p>\n<p>In diesem Fall stellen wir die Eigenschaft <b>Selected <\/b>f&uuml;r den Indexwert aus <b>j <\/b>auf <b>True <\/b>ein und markieren so die verschobenen Elemente erneut. Vor dem Verschieben sieht die Markierung in unserem Beispiel dann etwa wie in Bild 4 aus.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2019_04\/pic_1197_004.png\" alt=\"Die zu verschiebenden Elemente vor ...\" width=\"424,7115\" height=\"298,3578\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 4: Die zu verschiebenden Elemente vor &#8230;<\/span><\/b><\/p>\n<p>Nach dem Verschieben und dem Aufruf der Prozedur <b>SelectEntries <\/b>werden die verschobenen Elemente dann erneut markiert. F&uuml;r den Benutzer sieht es so aus, also ob die Markierung nie verloren gegangen w&auml;re (siehe Bild 5).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2019_04\/pic_1197_005.png\" alt=\"... und nach dem Verschieben.\" width=\"424,7115\" height=\"298,3578\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 5: &#8230; und nach dem Verschieben.<\/span><\/b><\/p>\n<h2>Steuer-elemente aktivieren<\/h2>\n<p>Die Prozedur <b>ActivateControls <\/b>soll pr&uuml;fen, welche Elemente im Listenfeld markiert sind und davon abh&auml;ngig die Schaltfl&auml;chen aktivieren oder deaktivieren. Das Ziel ist, die beiden Schaltfl&auml;chen <b>cmdUp <\/b>und <b>cmdTop <\/b>zu deaktivieren, wenn der erste Eintrag im Listenfeld markiert ist &#8211; dann kann man diesen nicht mehr weiter nach oben verschieben, was durch die Deaktivierung der Schaltfl&auml;chen angezeigt wird. Befindet sich das letzte Element unter den markierten Elementen im Listenfeld, sollen die beiden Schaltfl&auml;chen <b>btnBottom <\/b>und <b>btnDown <\/b>deaktiviert werden. Fehlt noch die Variante, dass gar kein Eintrag im Listenfeld markiert ist.<\/p>\n<p>In diesem Fall sollen auch die vier Schaltfl&auml;chen deaktiviert werden. Und, bereits in den ersten beiden Varianten enthalten: Wenn der erste und der letzte Eintrag im Listenfeld markiert sind, sollen nat&uuml;rlich auch alle Schaltfl&auml;chen deaktiviert werden (alle Varianten siehe Bild 6).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2019_04\/pic_1197_006.png\" alt=\"Aktivieren und deaktivieren der Schaltfl&auml;chen\" width=\"424,7115\" height=\"643,4065\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 6: Aktivieren und deaktivieren der Schaltfl&auml;chen<\/span><\/b><\/p>\n<p>Die Prozedur aktiviert zun&auml;chst alle vier Schaltfl&auml;chen:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>ActivateControls()\r\n     <span style=\"color:blue;\">Dim <\/span>lngListCount<span style=\"color:blue;\"> As Long<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>lngSelectedCount<span style=\"color:blue;\"> As Long<\/span>\r\n     Me!cmdUp.Enabled = <span style=\"color:blue;\">True<\/span>\r\n     Me!cmdDown.Enabled = <span style=\"color:blue;\">True<\/span>\r\n     Me!cmdTop.Enabled = <span style=\"color:blue;\">True<\/span>\r\n     Me!cmdBottom.Enabled = <span style=\"color:blue;\">True<\/span><\/pre>\n<p>Danach ermittelt sie die Anzahl der ausgew&auml;hlten Elemente im Listenfeld (<b>ItemsSelected.Count<\/b>) sowie die Gesamtanzahl der Listenfeldeintr&auml;ge (<b>ListCount<\/b>):<\/p>\n<pre>     lngSelectedCount = m_ListBox.ItemsSelected.Count\r\n     lngListCount = m_ListBox.ListCount<\/pre>\n<p>Ist kein Eintrag im Listenfeld markiert (<b>lngSelectedCount = 0<\/b>), sollen alle Schaltfl&auml;chen deaktiviert werden. Dazu rufen wir die beiden Prozeduren <b>DisableUp <\/b>und <b>DisableDown <\/b>auf, die wir uns weiter unten anschauen:<\/p>\n<pre>     <span style=\"color:blue;\">If <\/span>lngSelectedCount = 0<span style=\"color:blue;\"> Then<\/span>\r\n         DisableUp\r\n         DisableDown<\/pre>\n<p>Der <b>Else<\/b>-Teil der Bedingung behandelt die F&auml;lle, in denen mindestens ein Element markiert ist. Darin pr&uuml;fen wir zuerst, ob das erste Element markiert ist (<b>ItemsSelected(0) = 0<\/b>). In diesem Fall rufen wir die Prozedur <b>DisableUp <\/b>auf:<\/p>\n<pre>     <span style=\"color:blue;\">Else<\/span>\r\n         <span style=\"color:blue;\">If <\/span>m_ListBox.ItemsSelected(0) = 0<span style=\"color:blue;\"> Then<\/span>\r\n             DisableUp\r\n         <span style=\"color:blue;\">End If<\/span><\/pre>\n<p>Und falls das letzte Element markiert ist, sorgt die Prozedur <b>DisableDown <\/b>daf&uuml;r, dass die beiden Schaltfl&auml;chen <b>btnDown <\/b>und <b>btnBottom <\/b>deaktiviert werden. Die Bedingung daf&uuml;r ist etwas komplizierter. Sie pr&uuml;ft, ob das letzte selektierte Element (<b>ItemsSelected(lngSelected-Count &#8211; 1)<\/b>) dem Index des letzten Elements entspricht (<b>lngListCount &#8211; 1<\/b>):<\/p>\n<pre>         If m_ListBox.ItemsSelected(lngSelectedCount - 1) _\r\n                 = lngListCount - 1 Then\r\n             DisableDown\r\n         <span style=\"color:blue;\">End If<\/span>\r\n     <span style=\"color:blue;\">End If<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Es fehlen noch die beiden Prozeduren <b>DisableUp <\/b>und <b>DisableDown<\/b>, die wie folgt aussehen:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>DisableUp()\r\n     Me!cmdUp.Enabled = <span style=\"color:blue;\">False<\/span>\r\n     Me!cmdTop.Enabled = <span style=\"color:blue;\">False<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span>\r\n<span style=\"color:blue;\">Private Sub <\/span>DisableDown()\r\n     Me!cmdDown.Enabled = <span style=\"color:blue;\">False<\/span>\r\n     Me!cmdBottom.Enabled = <span style=\"color:blue;\">False<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<h2>Aktivieren und Deaktivieren der Steuer-elemente nach Auswahl im Listenfeld<\/h2>\n<p>Wenn der Benutzer die Auswahl im Listenfeld &auml;ndert, soll schlie&szlig;lich auch noch die Prozedur <b>ActivateControls <\/b>aufgerufen werden, damit die Schaltfl&auml;chen aktiviert oder deaktiviert werden:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>lstKategorien_AfterUpdate()\r\n     ActivateControls\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<h2>Zusammenfassung und Ausblick<\/h2>\n<p>Dieser Beitrag hat gezeigt, wie Sie gleich mehrere Eintr&auml;ge in einem Listenfeld markierten und diese dann per Schaltfl&auml;che verschieben k&ouml;nnen. Dabei bleiben die Markierungen erhalten, sodass Sie den markierten Eintrag durch wiederholtes Anklicken etwa der <b>Nach oben<\/b>-Taste Schritt f&uuml;r Schritt an die gew&uuml;nschte Position bringen k&ouml;nnen. In einem weiteren Beitrag namens <b>Listenfeld: Reihenfolge mehrerer Eintr&auml;ge &auml;ndern <\/b>(<b>www.access-im-unternehmen.de\/1197<\/b>) schauen wir uns an, wie Sie dies f&uuml;r die Datenblattansicht realisieren k&ouml;nnen.<\/p>\n<h3>Downloads zu diesem Beitrag<\/h3>\n<p>Enthaltene Beispieldateien:<\/p>\n<p>ReihenfolgeMehrereEintraege.accdb<\/p>\n<p><a href=\"..\/fileadmin\/beispiele\/75A25BD2-016A-44AA-ADA6-65FEAFDA3623\/aiu_1197.zip\">Download<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Wir haben bereits in mehreren Beitr&auml;gen beschrieben, wie Sie die individuelle Reihenfolge von Elementen einer Tabelle &uuml;ber den Inhalt eines Feldes etwa namens &#8222;ReihenfolgeID&#8220; einstellen k&ouml;nnen &#8211; zum Beispiel in Listenfeldern oder Unterformularen in der Datenblattansicht. Dort haben wir die Reihenfolge dann durch Markieren der Eintr&auml;ge und anschlie&szlig;endes Bet&auml;tigen etwa von Schaltfl&auml;chen mit Beschriftungen wie &#8222;Ganz nach oben&#8220;, &#8222;Nach oben&#8220;, &#8222;Nach unten&#8220; oder &#8222;Ganz nach unten&#8220; ge&auml;ndert. Im vorliegenden Beitrag schauen wir uns nun an, wie wir im Listenfeld die Reihenfolge f&uuml;r mehrere Eintr&auml;ge gleichzeitig &auml;ndern k&ouml;nnen.<\/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":[662019,66042019,44000023],"tags":[],"class_list":["post-55001197","post","type-post","status-publish","format-standard","hentry","category-662019","category-66042019","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>Listenfeld: Reihenfolge mehrerer Eintr&auml;ge &auml;ndern - 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\/Listenfeld_Reihenfolge_mehrerer_Eintraege_aendern\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Listenfeld: Reihenfolge mehrerer Eintr&auml;ge &auml;ndern\" \/>\n<meta property=\"og:description\" content=\"Wir haben bereits in mehreren Beitr&auml;gen beschrieben, wie Sie die individuelle Reihenfolge von Elementen einer Tabelle &uuml;ber den Inhalt eines Feldes etwa namens &quot;ReihenfolgeID&quot; einstellen k&ouml;nnen - zum Beispiel in Listenfeldern oder Unterformularen in der Datenblattansicht. Dort haben wir die Reihenfolge dann durch Markieren der Eintr&auml;ge und anschlie&szlig;endes Bet&auml;tigen etwa von Schaltfl&auml;chen mit Beschriftungen wie &quot;Ganz nach oben&quot;, &quot;Nach oben&quot;, &quot;Nach unten&quot; oder &quot;Ganz nach unten&quot; ge&auml;ndert. Im vorliegenden Beitrag schauen wir uns nun an, wie wir im Listenfeld die Reihenfolge f&uuml;r mehrere Eintr&auml;ge gleichzeitig &auml;ndern k&ouml;nnen.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/access-im-unternehmen.de\/Listenfeld_Reihenfolge_mehrerer_Eintraege_aendern\/\" \/>\n<meta property=\"og:site_name\" content=\"Access im Unternehmen\" \/>\n<meta property=\"article:published_time\" content=\"2020-05-13T20:55:36+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/vg06.met.vgwort.de\/na\/cb90c41ca8ce412eb2ac0ada296b1bbf\" \/>\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=\"16\u00a0Minuten\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Listenfeld_Reihenfolge_mehrerer_Eintraege_aendern\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Listenfeld_Reihenfolge_mehrerer_Eintraege_aendern\\\/\"},\"author\":{\"name\":\"Andr\u00e9 Minhorst\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\"},\"headline\":\"Listenfeld: Reihenfolge mehrerer Eintr&auml;ge &auml;ndern\",\"datePublished\":\"2020-05-13T20:55:36+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Listenfeld_Reihenfolge_mehrerer_Eintraege_aendern\\\/\"},\"wordCount\":2532,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Listenfeld_Reihenfolge_mehrerer_Eintraege_aendern\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg06.met.vgwort.de\\\/na\\\/cb90c41ca8ce412eb2ac0ada296b1bbf\",\"articleSection\":[\"2019\",\"4\\\/2019\",\"Mit Formularen arbeiten\"],\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Listenfeld_Reihenfolge_mehrerer_Eintraege_aendern\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Listenfeld_Reihenfolge_mehrerer_Eintraege_aendern\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Listenfeld_Reihenfolge_mehrerer_Eintraege_aendern\\\/\",\"name\":\"Listenfeld: Reihenfolge mehrerer Eintr&auml;ge &auml;ndern - Access im Unternehmen\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Listenfeld_Reihenfolge_mehrerer_Eintraege_aendern\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Listenfeld_Reihenfolge_mehrerer_Eintraege_aendern\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg06.met.vgwort.de\\\/na\\\/cb90c41ca8ce412eb2ac0ada296b1bbf\",\"datePublished\":\"2020-05-13T20:55:36+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Listenfeld_Reihenfolge_mehrerer_Eintraege_aendern\\\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Listenfeld_Reihenfolge_mehrerer_Eintraege_aendern\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Listenfeld_Reihenfolge_mehrerer_Eintraege_aendern\\\/#primaryimage\",\"url\":\"http:\\\/\\\/vg06.met.vgwort.de\\\/na\\\/cb90c41ca8ce412eb2ac0ada296b1bbf\",\"contentUrl\":\"http:\\\/\\\/vg06.met.vgwort.de\\\/na\\\/cb90c41ca8ce412eb2ac0ada296b1bbf\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Listenfeld_Reihenfolge_mehrerer_Eintraege_aendern\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Listenfeld: Reihenfolge mehrerer Eintr&auml;ge &auml;ndern\"}]},{\"@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":"Listenfeld: Reihenfolge mehrerer Eintr&auml;ge &auml;ndern - 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\/Listenfeld_Reihenfolge_mehrerer_Eintraege_aendern\/","og_locale":"de_DE","og_type":"article","og_title":"Listenfeld: Reihenfolge mehrerer Eintr&auml;ge &auml;ndern","og_description":"Wir haben bereits in mehreren Beitr&auml;gen beschrieben, wie Sie die individuelle Reihenfolge von Elementen einer Tabelle &uuml;ber den Inhalt eines Feldes etwa namens \"ReihenfolgeID\" einstellen k&ouml;nnen - zum Beispiel in Listenfeldern oder Unterformularen in der Datenblattansicht. Dort haben wir die Reihenfolge dann durch Markieren der Eintr&auml;ge und anschlie&szlig;endes Bet&auml;tigen etwa von Schaltfl&auml;chen mit Beschriftungen wie \"Ganz nach oben\", \"Nach oben\", \"Nach unten\" oder \"Ganz nach unten\" ge&auml;ndert. Im vorliegenden Beitrag schauen wir uns nun an, wie wir im Listenfeld die Reihenfolge f&uuml;r mehrere Eintr&auml;ge gleichzeitig &auml;ndern k&ouml;nnen.","og_url":"https:\/\/access-im-unternehmen.de\/Listenfeld_Reihenfolge_mehrerer_Eintraege_aendern\/","og_site_name":"Access im Unternehmen","article_published_time":"2020-05-13T20:55:36+00:00","og_image":[{"url":"http:\/\/vg06.met.vgwort.de\/na\/cb90c41ca8ce412eb2ac0ada296b1bbf","type":"","width":"","height":""}],"author":"Andr\u00e9 Minhorst","twitter_card":"summary_large_image","twitter_misc":{"Verfasst von":"Andr\u00e9 Minhorst","Gesch\u00e4tzte Lesezeit":"16\u00a0Minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/access-im-unternehmen.de\/Listenfeld_Reihenfolge_mehrerer_Eintraege_aendern\/#article","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/Listenfeld_Reihenfolge_mehrerer_Eintraege_aendern\/"},"author":{"name":"Andr\u00e9 Minhorst","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f"},"headline":"Listenfeld: Reihenfolge mehrerer Eintr&auml;ge &auml;ndern","datePublished":"2020-05-13T20:55:36+00:00","mainEntityOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Listenfeld_Reihenfolge_mehrerer_Eintraege_aendern\/"},"wordCount":2532,"commentCount":0,"publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Listenfeld_Reihenfolge_mehrerer_Eintraege_aendern\/#primaryimage"},"thumbnailUrl":"http:\/\/vg06.met.vgwort.de\/na\/cb90c41ca8ce412eb2ac0ada296b1bbf","articleSection":["2019","4\/2019","Mit Formularen arbeiten"],"inLanguage":"de","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/access-im-unternehmen.de\/Listenfeld_Reihenfolge_mehrerer_Eintraege_aendern\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/access-im-unternehmen.de\/Listenfeld_Reihenfolge_mehrerer_Eintraege_aendern\/","url":"https:\/\/access-im-unternehmen.de\/Listenfeld_Reihenfolge_mehrerer_Eintraege_aendern\/","name":"Listenfeld: Reihenfolge mehrerer Eintr&auml;ge &auml;ndern - Access im Unternehmen","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/#website"},"primaryImageOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Listenfeld_Reihenfolge_mehrerer_Eintraege_aendern\/#primaryimage"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Listenfeld_Reihenfolge_mehrerer_Eintraege_aendern\/#primaryimage"},"thumbnailUrl":"http:\/\/vg06.met.vgwort.de\/na\/cb90c41ca8ce412eb2ac0ada296b1bbf","datePublished":"2020-05-13T20:55:36+00:00","breadcrumb":{"@id":"https:\/\/access-im-unternehmen.de\/Listenfeld_Reihenfolge_mehrerer_Eintraege_aendern\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/access-im-unternehmen.de\/Listenfeld_Reihenfolge_mehrerer_Eintraege_aendern\/"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/access-im-unternehmen.de\/Listenfeld_Reihenfolge_mehrerer_Eintraege_aendern\/#primaryimage","url":"http:\/\/vg06.met.vgwort.de\/na\/cb90c41ca8ce412eb2ac0ada296b1bbf","contentUrl":"http:\/\/vg06.met.vgwort.de\/na\/cb90c41ca8ce412eb2ac0ada296b1bbf"},{"@type":"BreadcrumbList","@id":"https:\/\/access-im-unternehmen.de\/Listenfeld_Reihenfolge_mehrerer_Eintraege_aendern\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/access-im-unternehmen.de\/"},{"@type":"ListItem","position":2,"name":"Listenfeld: Reihenfolge mehrerer Eintr&auml;ge &auml;ndern"}]},{"@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\/55001197","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=55001197"}],"version-history":[{"count":0,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55001197\/revisions"}],"wp:attachment":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/media?parent=55001197"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/categories?post=55001197"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/tags?post=55001197"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}