אני עושה את זה כך: (באמצעות VBA)
Dim sSQL As String Dim Cntr As Integer On Error Resume Next DoCmd.SetWarnings False For Cntr = 1 To DMax("[id]", "tbl") sSQL = " INSERT INTO TBL ( ID, Field1, Field2, Field3 ) " _ & " SELECT " & DMax("[id]", "tbl") + 1 & " AS NewID, TBL.Field1, TBL.Field2, TBL.Field3 " _ & " FROM TBL " _ & " WHERE (((TBL.Id)= " & Cntr & "));" DoCmd.RunSQL (sSQL) Next DoCmd.SetWarnings True
ועכשיו להסברים: אני משתמש במונה (Cntr) על מנת לרוץ על כל הרשומות בטבלה. הוספתי שורת On Error בגלל שאם אין רצף בשדה המפתח ID אני מונע שגיאה שתעצור את הפרוצדורה. קטע הקוד הזה -
DMax("[id]", "tbl") + 1 ממספר לי את ה - ID לערך גבוה יותר ב - 1 מהערך הגבוה ביותר בטבלה. אם רוצים להכניס ערך ידני אז יש שתי דרכים לעשות זאת: 1) הוספת שדה בטבלה שישמש את מקור ה - ID ואז במקום הקטע DMax("[id]", "tbl") + 1 נכתוב [Me![FieldID. דבר זה יקח את הערך מהשדה בטופס ויכניס אותו לשאילתת ההוספה. 2) ניתן להשתמש בפרמטר בשאילתה ואז בכל פעם תתבצע שאלה לערך ה-ID. דבר זה מתבצע בצורה הבאה - במקום קטע הקוד הזה:
SELECT " & DMax("[id]", "tbl") + 1 & " AS NewID
נכניס את קטע הקוד הזה:
SELECT NewId AS NewID
פעולה זאת תבקש את NewId בכל פעם שתרוץ השאילתה.
הערה אחת בהוספה של מספר ID דרך שדה בטופס, תתוסף רק רשומה אחת, אם ID מוגדר כמפתח וזאת בגלל שערך ה - ID יכול להופיע רק פעם אחת, ואין כאן מנגנון שישנה אוטומטית את הערך המופיע בשדה בטופס.