Individuelle Nummerierungen

Manche Anwendungsfälle erfordern jedoch eine individuelle Nummerierung in einem Feld. Dafür kann es verschiedene Wege geben – zum Beispiel, wenn eine Nummerierung nach einer bestimmten Sortierung eines anderen Feldes erfolgen soll oder nach dem Entfernen oder Hinzufügen von Datensätzen eine neue Nummerierung erforderlich ist. Daher stellen wir in diesem Beitrag Wege vor, um die Nummerierung ganz nach Wunsch zu gestalten.

Gründe für durchnummerierte Felder

In den meisten Fällen ist die Darstellung der Daten Auslöser für den Wunsch nach einer durchgehenden Nummerierung. Dies lässt sich natürlich auch über eine entsprechende Abfrage regeln.

Je nach Datenmenge kostet dies jedoch Performance, und gerade wenn die neu zu nummerierenden Daten selten oder gar nicht mehr geändert werden, ist das Hinzufügen eines Nummerierungsfeldes oder auch die Anpassung des Primärschlüsselfeldes sinnvoll. In allen anderen Fällen sollte die Nummerierung dynamisch per Abfrage erfolgen.

Unabhängig davon, ob Sie nun ein Primärschlüsselfeld oder ein separates Zahlenfeld für die Nummerierung verwenden, sind meist die folgenden zwei Gründe verantwortlich für den Wunsch nach einer neuen Nummerierung:

  • Die Sortierkriterien als Grundlage für die Nummerierung haben sich geändert.
  • Es wurden Datensätze entfernt, sodass die Nummerierung wieder durchgehend gestaltet werden soll.

Ein dritter Grund ist, dass möglicherweise eine Menge aktuell gefilterter Daten nummeriert werden soll. Da dies jedoch meist mehrmals geschieht, sollte man hier grundsätzlich eine dynamische Nummerierung per Abfrage vornehmen.

Primärschlüsselfeld oder zusätzliches Feld nummerieren

In manchen Fällen soll das Primärschlüsselfeld selbst nummeriert werden. Dies führt erstens dazu, dass man die Aktualisierung der Fremdschlüsselfelder verknüpfter Datensätze für die Beziehung aktivieren muss.

Zweitens muss man sich hier einen kleinen Algorithmus einfallen lassen, da man ja nicht einfach neu nummerieren kann – eine Neunummerierung nach einer anderen Reihenfolge zum Beispiel würde dazu führen, dass ein Datensatz die Nummer 1 erhalten soll, während ein anderer Datensatz, der nach unten sortiert wurde, diesen Wert ebenfalls enthält.

Und in Primärschlüsselfeldern darf nun einmal jeder Wert nur einmal vorkommen. Man müsste in diesem Fall also zunächst den größten Wert für das Primärschlüsselfeld ermitteln und alle Datensätze mit einem Wert im Primärschlüsselfeld füllen, der größer ist als dieser Wert. Erst dann könnte man die Datensätze in der gewünschten Sortierung mit 1 beginnend durchnummerieren.

Deutlich einfacher ist es, wenn Sie für die Nummerierung ein eigenes Feld vorsehen. Dies kostet zwar etwas Speicherplatz, aber das sollte in der heutigen Zeit keine übergeordnete Rolle mehr spielen.

Nummerieren zusätzlicher Felder

Beginnen wir mit den Techniken zum Nummerieren zusätzlicher Felder, die nicht mit einem eindeutigen Index versehen sind (in diesem Fall würde man diese auch erst mit höheren Zahlen nummerieren, bevor man diese beginnend mit dem Wert 1 nummerieren könnte).

Zu Beispielzwecken haben wir der Tabelle tblArtikel ein Feld namens Artikelnummer hinzugefügt, welches wir durchnummerieren wollen (s. Bild 1).

Zusätzliches Feld für eine Nummerierung

Bild 1: Zusätzliches Feld für eine Nummerierung

Die Füllung des Feldes Artikelnummer übernimmt die Prozedur aus Listing 1. Sie öffnet ein Recordset auf Basis der Tabelle tblArtikel, sortiert nach dem Feld ArtikelID.

Public Sub Sortierung()
     Dim db As DAO.Database
     Dim rst As DAO.Recordset
     Dim i As Integer
     Set db = CurrentDb
     Set rst = db.OpenRecordset("SELECT * FROM tblArtikel ORDER BY ArtikelID", dbOpenDynaset)
     Do While Not rst.EOF
         rst.Edit
         i = i + 1
         rst!Artikelnummer = i
         rst.Update
         rst.MoveNext
     Loop
End Sub

Listing 1: Einfache Sortierung im Feld Artikelnummer der Tabelle tblArtikel

Dann durchläuft sie alle Datensätze und erhöht dabei jeweils den Wert der Variablen i, der dann im Feld Artikelnummer landet.

Diese Prozedur lässt sich noch etwas vereinfachen, denn eigentlich benötigen wir die Variable i in diesem Fall gar nicht: Wenn mit dem Wert 1 beginnend durchgehend nummeriert werden soll, können wir dazu auch den Wert der Eigenschaft AbsolutePosition nutzen. Dies liefert die Position des Datensatzzeigers. Da dieser Wert für den ersten Datensatz den Wert 0 enthält, müssen wir nur noch den Wert 1 hinzuaddieren (s. Listing 2).

Public Sub SortierungMitAbsolutePosition()
     Dim db As DAO.Database
     Dim rst As DAO.Recordset
     Set db = CurrentDb
     Set rst = db.OpenRecordset("SELECT * FROM tblArtikel ORDER BY ArtikelID", dbOpenDynaset)
     Do While Not rst.EOF
         rst.Edit
         rst!Artikelnummer = rst.AbsolutePosition + 1
         rst.Update
         rst.MoveNext
     Loop
End Sub

Listing 2: Nummer für die Nummerierung aus AbsolutePosition entnehmen

Nummerierung mit anderem Startwert oder Intervall

Wenn die Nummerierung gar nicht mit 1 beginnen soll oder wenn ein anderes Intervall als 1 gefragt ist, können Sie die nachfolgende beschriebene Prozedur verwenden.

Ein anderes Intervall mit einer Nummerierung wie 1, 4, 7, … könnte beispielsweise interessant sein, wenn man nicht häufig eine neue Nummerierung benötigt, aber dennoch neue Datensätze zwischen den vorhandenen Datensätzen einfügen möchte.

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

den kompletten Artikel im PDF-Format mit Beispieldatenbank

diesen und alle anderen Artikel mit dem Jahresabo

Schreibe einen Kommentar