Translate

Donnerstag, 2. Mai 2013

MS Access: Autowert zurücksetzen



Aufgabenstellung:
Das Autowert-Feld einer Tabelle soll wieder auf 1 oder den nächsthöheren freien Wert zurückgesetzt werden, nachdem Datensätze eingegeben und wieder gelöscht wurden.

Dafür gibt es 3 Lösungen die jede für sich Vor- und Nachteile hat.

Lösung 1:
Komprimierung der Datenbank-Datei. Dies sollte die Autowerte aller Tabellen auf den nächsthöheren freien Wert zurück setzen.
Nachteil: Ab Version Access 2000 funktioniert das oft nicht mehr.

Lösung 2: 
Erstellen Sie eine Abfrage und kopieren Sie den folgenden SQL-Statment in die sql-Ansicht rein und ersetzen Sie die Platzhalter Tabellenname und AutowertFeldname mit den entsprechenden:
ALTER TABLE [Tabellenname] ALTER COLUMN [AutowertFeldname] COUNTER(1,1)
Nachteil: Die Aktionsabfrage schlägt fehl, wenn bestehenden Beziehungen auf das Feld AutowertFeldname vorhanden sind. Somit muss zunächst diese Beziehungen entfernt werden und anschließend können diese wieder gesetzt werden.

Lösung 3:

Public Function SetSeed(strTbl As String, Optional lngID As Long) As Boolean
    'Purpose: Reset / Set the Seed of the AutoNumber-Field from a table
    'Condition: Reference on Microsoft ADO Ext. 2.8 for DLL (msADOX.dll)

    Dim cat As New ADOX.Catalog, col As ADOX.Column
   
    Set cat.ActiveConnection = CurrentProject.Connection
    Set col = GetTheAutoNumberColumn(cat.Tables(strTbl))
    If col Is Nothing Then
        MsgBox "In der Tabelle '" & strTbl & "' wurde kein Autowert-Feld gefunden!", vbCritical
    Else
        If lngID = 0 Then lngID = Nz(DMax(col.Name, strTbl), 0) + 1
        If Not col.Properties("Seed") = lngID Then col.Properties("Seed") = lngID
        SetSeed = True
    End If
    Set cat = Nothing
    Set col = Nothing
End Function

Public Function GetTheAutoNumberColumn(tbl As ADOX.Table) As Object
    'Purpose: Find the AutoNumber-Field from a table and if found then return the Column-Object
    Dim col As Object
   
    For Each col In tbl.Columns
        If col.Properties("Autoincrement") Then
            Set GetTheAutoNumberColumn = col
            Exit For
        End If
    Next
End Function

Nachteil: Keiner, außer das dieser VBA-Code hinterlegt werden muss und ein Verweis auf die ADO bestehen muss.

Zu diesem Thema gibt es noch den folgenden interessanten Link! 

Keine Kommentare:

Kommentar veröffentlichen