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.
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).
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).
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.
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.
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.
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).
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