[Eine Seite zurück] [Übersicht] [Eine Seite vor]

Benutzung auf eigene Gefahr !
Keine Garantie für garnichts !

Spalte neu nummerieren (Renumber)

Sprache / Programm: Access ab Version 95
Beschreibung

Die Funktion numeriert eine Spalte mit Zahlen neu. Dadurch können Felder, die eine fortlaufende Numerierung enthalten, automatisch neu nummeriert werden, wenn Werte gelöscht wurden.

Die Spalte selbst wird dabei nicht gelöscht, so dass Beziehungen und Indizes erhalten bleiben.

VBA-Quelltext
Public Sub ReNumber(NameTabelle As String, NameSpalte As String, Optional StartWert = 1)
    Dim Tabelle As DAO.Recordset, Feld As Field
    Dim Zeile As Long, Minimum As Long, SQL As String, WHERE As String
   
    ' Snapshot mit den vorhandenen Werten der Tabelle öffnen
    SQL = "SELECT [" & NameSpalte & "] FROM [" & NameTabelle & "] GROUP BY [" &
                    NameSpalte & "] ORDER BY [" & NameSpalte & "]"
    Set Tabelle = CurrentDb.OpenRecordset(SQL, dbOpenSnapshot)
    Set Feld = Tabelle("Zahl")
    DoCmd.SetWarnings False
   
    Minimum = IIf(Feld.Value < StartWert, Feld.Value, StartWert)
    Zeile = Minimum
   
    On Error GoTo AusstiegBeiFehler
    DBEngine(0).BeginTrans      ' Transaktionsschutz aktivieren
   
''' Werte 'zusammenschieben'
    SQL = "UPDATE [" & NameTabelle & "] Set [" & NameSpalte & "]="
    WHERE = " WHERE [" & NameSpalte & "]="
   
    For Zeile = Minimum To Zeile + Tabelle.RecordCount - 1
        If Feld > Zeile Then DoCmd.RunSQL SQL & Zeile & WHERE & Feld
        Tabelle.MoveNext
    Next Zeile
    Tabelle.Close

''' Startpunkt verlegen
    If Minimum <> StartWert Then
        SQL = "SELECT [" & NameSpalte & "] FROM [" & NameTabelle & "] ORDER BY [" & NameSpalte & "]" & IIf(Minimum < StartWert, " DESC;", ";")
        Minimum = Minimum - StartWert
       
        With CurrentDb.OpenRecordset(SQL, dbOpenDynaset)
            While Not .EOF
                .Edit
                .Fields(0) = .Fields(0) - Minimum
                .Update
                .MoveNext
            Wend
            .Close
        End With
    End If
    DBEngine.CommitTrans
Exit Sub

AusstiegBeiFehler:
    DBEngine.Rollback
   
End Sub
Argumente der Funktion/Prozedur

NameTabelle

String der den Namen der zu überarbeitenden Tabelle angibt.

NameSpalte

Name der Spalte, die überarbeitet werden soll. Die Spalte muß einen numerischen Datentyp haben

StartWert

Startwert für die Nummerierung
Anwendungsgebiete, Fehler und Warnungen

Die Funktion überprüft nicht, ob der Gültigkeitsbereich der Zahlen nach der Numerierung überschritten wird. So tritt z.B. ein Fehler auf, wenn eine Spalte vom Typ 'Byte' mit dem Startwert 260 neu numeriert wird. Es können auch Felder neu numeriert werden, die mit einem eindeutigen Einfeldindex belegt wurden, jedoch ist hier die Bearbeitung wegen der permanenten Überarbeitung des Index langsamer. Bei eindeutigen Mehrfeldindizes kann es dagegen zu Fehlern kommen. Verwendet die DAO Objektbibliothek. Ab Access 2000 muss diese explizit im VBA-Editor über 'Extras' -> 'Verweise' als 'Microsoft DAO 3.6' (oder höher) eingebunden werden und vor die 'Microsoft ADO 2.1' (oder höher) Bibliothek gesetzt werden.