Autorem prezentowanego rozwiązania jest Krzysztof Naworyta:
Function GetNextCounter(tbName as String) as Long
Dim db As DAO.Database
Dim rst As DAO.Recordset
Dim Klucz As Long
Set db = CurrentDb
Set rst = db.OpenRecordset(tbName,,dbAppendOnly)
With rst
.AddNew
Klucz = .Fields(0) 'zakładam, że autonumer jest pierwszym polem ...
.Close 'zamiast .Update !
End With
GetNextCounter = Klucz
End Function
Wykorzystanie w innym miejscu kodu:
'(...)retVal = GetNextCounter("Tabela1") db.Execute "INSERT INTO Tabela1 (ID, Pole1) SELECT " & retVal & ", ..." db.Execute "INSERT INTO PodTabela (kluczObcy, Pole1) SELECT " & retVal & ", ..."'(...)
Pomyslowe! Rezerwacja numeru i INSERT INTO... Warto zapamietac ten trik.
Istota rozwiązania polega na tym, że Access za każdym razem rezerwuje nowy numer, nawet jeśli wycofamy sie z zapisu. Gwarantuje to bezkonfliktowe przydzielanie wartości ID także w środowisku sieciowym, gdy jednocześnie kilku użytkowników chce dodawać rekordy do tabeli. Także, jeśli nie zaistnieje jakaś sytuacja awaryjna - uzyskujemy numeracje bez 'dziur'.
A oto kilka słów pomysłodawcy: