Reihenfolge einfach festlegen

Lies diesen Artikel und viele weitere mit einem kostenlosen, einwöchigen Testzugang.

Wenn Sie Daten mit individueller Reihenfolge anlegen wollen, können Sie das mit sehr wenig Aufwand anstellen, indem Sie dafür einfach ein Zahlenfeld anlegen. Für dieses kann der Benutzer dann einen eigenen Wert festlegen, der zwischen dem zweier vorhandener Felder liegt und die Reihenfolge-Werte dann per Mausklick aktualisieren. Wie das genau aussieht und wie einfach die Programmierung hierfür ist, lesen Sie im vorliegenden Beitrag.

Warum die Reihenfolge festlegen

Gründe, um die Reihenfolge von Datensätzen in einer Tabelle festzulegen, gibt es genügend. In unserem Beispiel der Tabelle tblArtikel gehen wir zum Beispiel davon aus, dass der Benutzer die Artikel in einer bestimmten Reihenfolge für einen Katalog ausgeben möchte.

Feld zum Speichern der Reihenfolge hinzufügen

Um die Reihenfolge für Datensätze festzulegen, benötigen wir natürlich ein entsprechendes Feld. Dieses nennen wir Position und fügen es einfach der betroffenen Tabelle, in diesem Fall tblArtikel, als Feld mit dem Datentyp Zahl hinzu (siehe Bild 1). Hier passen wir allerdings noch die Feldgröße auf Single an, damit wir auch Dezimalzahlen eingeben können.

Feld für das Einstellen der Reihenfolge

Bild 1: Feld für das Einstellen der Reihenfolge

Haupt- und Unterformular

Die Daten wollen wie in einem Unterformular in der Datenblattansicht anzeigen. Dazu erstellen wir zunächst ein neues Unterformular und fügen diesem eine Abfrage als Datenherkunft hinzu, welche alle Felder der Tabelle tblArtikel liefert, und zwar sortiert nach dem Feld Position (siehe Bild 2).

Datenherkunft für das Unterformular

Bild 2: Datenherkunft für das Unterformular

Danach können wir dem Unterformular die Felder der Datenherkunft zuweisen, allerdings in einer ganz bestimmten Reihenfolge: Das Feld Position greifen wir zuerst aus der Feldliste heraus und fügen es oben im Formularentwurf ein.

Erst danach ziehen wir die übrigen Felder aus der Feldliste unterhalb des Feldes Position in das Zielformular (siehe Bild 3).

Hinzufügen der Felder zum Unterformular

Bild 3: Hinzufügen der Felder zum Unterformular

Dadurch werden die Felder in der Datenblattansicht gleich in der gewünschten Reihenfolge angezeigt, nämlich mit dem Feld Position an erster Stelle.

Legen Sie nun noch die Eigenschaft Standardansicht auf den Wert Datenblatt fest und speichern Sie das Formular unter dem Namen sfmArtikelMitReihenfolge. Schließen Sie das Formular anschließend.

Danach erstellen Sie das Hauptformular und speichern es unter dem Namen frmArtikelMitReihenfolge. Ziehen Sie dann das Unterformular aus dem Navigationsbereich von Access in den Entwurf des neu angelegten Hauptformulars.

Richten Sie das Unterformular so aus, dass das Ergebnis wie in Bild 4 aussieht. Nun können Sie noch die Eigenschaften Horizontaler Anker und Vertikaler Anker des Unterformular-Steuerelements auf die Werte Beide einstellen, damit dieses seine Größe gemeinsam mit dem Hauptformular ändert.

Unterformular zum Hauptformular hinzufügen

Bild 4: Unterformular zum Hauptformular hinzufügen

Reihenfolge ohne Reihenfolge

Interessant ist, was geschieht, wenn Sie das Formular nun in der Formularansicht öffnen, ohne zuvor die Werte des Feldes Position zu füllen. Die Datensätze werden willkürlich sortiert – und zwar noch nicht einmal nach dem Feld mit dem Primärindex (ArtikelID). Das Ergebnis sieht dann zunächst wie in Bild 5 aus.

Ohne Werte liefert das Feld Position eine willkürliche Sortierung.

Bild 5: Ohne Werte liefert das Feld Position eine willkürliche Sortierung.

Schaltfläche zum Aktualisieren der Reihenfolge

Nun fügen wir dem Hauptformular eine Schaltfläche hinzu, mit der wir die Reihenfolge der Datensätze aktualisieren können. Diese Schaltfläche nennen wir cmdReihenfolgeAktualisieren.

Für die das Ereignis Beim Klicken der Schaltfläche hinterlegen wir die Prozedur aus Listing 1. Diese Prozedur erstellt zunächst ein Recordset auf Basis der Tabelle tblArtikel, wobei diese die Datensätze aufsteigend nach den Feldern Position und ArtikelID sortiert. Danach durchläuft sie alle Datensätze der Tabelle in einer Do While-Schleife.

Private Sub cmdReihenfolgeAktualisieren_Click()
     Dim db As DAO.Database
     Dim rst As DAO.Recordset
     Set db = CurrentDb
     Set rst = db.OpenRecordset("SELECT * FROM tblArtikel ORDER BY Position, ArtikelID", dbOpenDynaset)
     Do While Not rst.EOF
         rst.Edit
         rst!Position = rst.AbsolutePosition + 1
         rst.Update
         rst.MoveNext
     Loop
     rst.Close
     Set rst = Nothing
     Set db = Nothing
     Me!sfmArtikelMitReihenfolge.Form.Requery
End Sub

Listing 1: Initiales Einstellen der Reihenfolge

Hier versetzt sie den aktuellen Datensatz zunächst mit der Edit-Methode in den Bearbeitungszustand, stellt dann das Feld Position auf den Wert der Eigenschaft AbsolutePosition des Datensatzzeigers plus ein ein (AbsolutePosition ist 0-basiert) und speichert den Datensatz mit der Update-Methode. Danach werden die übrigen Datensätze in der Do While-Schleife auf die gleiche Weise bearbeitet. Die letzte Anweisung der Prozedur aktualisiert die im Unterformular angezeigten Daten, die dann in der soeben festgelegten Sortierung erscheinen. Da das Feld Position zuvor noch keine Werte aufwies, erfolgt die Sortierung in diesem Fall ausschließlich nach den Werten des Primärschlüsselfeldes ArtikelID.

Benutzer gibt Reihenfolge vor

Nun soll der Benutzer eine einfache Möglichkeit erhalten, für einen neuen Datensatz direkt über das Feld Position an der gewünschten Stelle einzufügen. Nun ist es unter Access ja nicht möglich, neue Datensätze an beliebiger Stelle einzufügen, denn der neue, leere Datensatz ist immer der letzte ganz unten.

Durch unsere Vorbereitung kann der Benutzer jedoch nun einen neuen Datensatz eingeben und für diesen durch einen geeigneten Wert für das Feld Position nach dem Speichern an der richtigen Stelle einsortieren. Im Beispiel aus Bild 6 geben wir beispielsweise den Wert 1,5 für das Feld Position ein, weil wir den Datensatz zwischen dem ersten und zweiten vorhandenen Datensatz einsortieren wollen.

Der neue Datensatz mit Position 1,5 ...

Bild 6: Der neue Datensatz mit Position 1,5 …

Nach dem Speichern des Datensatzes und dem anschließenden Betätigen der Schaltfläche Reihenfolge aktualisieren landet der Datensatz tatsächlich an der gewünschten Stelle (siehe Bild 7).

... landet zwischen dem vorherigen ersten und zweiten Datensatz.

Bild 7: … landet zwischen dem vorherigen ersten und zweiten Datensatz.

Reihenfolge ohne Schaltfläche

Nun wollen wir diese Lösung noch so verfeinern, dass der Benutzer den Datensatz nur noch speichern muss und der Datensatz dann automatisch an die gewünschte Stelle verschoben wird. Dazu fügen wir die Anweisungen, die sich bisher in der Prozedur cmdReihenfolgeAktualisieren_Click befanden, in der Ereignisprozedur ein, die durch das Ereignis Nach Aktualisierung des Unterformulars ausgelöst wird.

Die Ereignisprozedur sieht dann wie in Listing 2 aus. Sie führt grundsätzlich die gleichen Schritte durch wie die zuvor beschriebene Ereignisprozedur – mit dem Unterschied, dass sie gleich nach der Eingabe des neuen Datensatzes ausgeführt wird.

Private Sub Form_AfterUpdate()
     Dim db As DAO.Database
     Dim rst As DAO.Recordset
     Dim lngArtikelID As Long
     Set db = CurrentDb
     Set rst = db.OpenRecordset("SELECT * FROM tblArtikel ORDER BY Position, ArtikelID", dbOpenDynaset)
     Do While Not rst.EOF
         rst.Edit
         rst!Position = rst.AbsolutePosition + 1
         rst.Update
         rst.MoveNext
     Loop
     rst.Close
     Set rst = Nothing
     Set db = Nothing
End Sub

Ende des frei verfügbaren Teil. Wenn Du mehr lesen möchtest, hole Dir ...

Testzugang

eine Woche kostenlosen Zugriff auf diesen und mehr als 1.000 weitere Artikel

diesen und alle anderen Artikel mit dem Jahresabo

Schreibe einen Kommentar