非常によくある質問ですが、最後に挿入されたレコードの ID を取得できません。ODBC リンク テーブルで DAO を使用して、レコードと子レコードを複製しています。私のテーブルは SQL Server 2008 にあり、ID フィールドの ID フィールドがあります。
これが私がこれまでに試したことです。ここでのコードの最初のビットは、エラー 3167、レコードが削除されたという結果になります。debug.Print を実行すると、レコードセットには実際に 3 つのレコードが含まれます。
Dim r as DAO.Recordset, db as DAO.Database
Set db = CurrentDb
Set r = db.OpenRecordset("SELECT TOP 2 * FROM item ORDER BY DateTimeModified DESC", dbOpenDynaset, dbSeeChanges)
r.AddNew
'Set field values here
r.Update 'Completes without error
r.Bookmark = r.LastModified
Debug.Print r("ItemID") 'Error 3167, Record is deleted
次に試したことは次のとおりです。
Debug.Print db.OpenRecordset("SELECT @@identity FROM item")(0)
この最後のものは問題なく完了しますが、返される値は正しくありません。実際の新しい ItemID が 321 の場合、これは値 614 を返します。返される値は増分のように見えます (これをテストし続けると変化します) が、テーブルとはまったく関係がないようです。値が 614 のフィールドはありません。正しいテーブルを検索していることを再確認しました。
DLookup や DMax などを使用できることはわかっていますが、マルチユーザー環境では防弾とは見なされません。
この問題を回避するには、ADO でストアド プロシージャを使用できると思います。それが私の唯一の選択肢かどうか疑問に思っていますか?
Edit1:
現在、次のコードを使用していますが、必要な/したいことを実行しています。これは基本的に DMax を使用する場合と同じだと思います。
Dim r as DAO.Recordset, db as DAO.Database
Set db = CurrentDb
Set r = db.OpenRecordset("SELECT TOP 1 * FROM item ORDER BY ItemID DESC", dbOpenDynaset, dbSeeChanges)
r.AddNew
'Set field values here
r.Update
r.Requery
r.MoveFirst
Debug.Print r("ItemID")