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: