Benutzung auf eigene Gefahr ! |
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 |
|
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. |