afterupdate在主键中留下空白

Cod*_*Med 2 ms-access vba access-vba ms-access-2010

我正在开发一个访问数据库,其中包含一些仅用于数据输入的表单.问题是,当我打开任何这些表单时,访问会在基础表中创建一个新条目,包括递增基础表的自动编号主键,并且即使用户选择不创建记录,自动编号也会保持递增数据库.这意味着由于用户在不提交更改的情况下打开和关闭表单的所有时间,实际表中的自动编号序列中存在间隙.

我在beforeupdate方法中使用以下代码以允许用户丢弃错误数据:

Private Sub Form_BeforeUpdate(Cancel As Integer)
    'Provide the user with the option to save/undo
    'changes made to the record in the form
    If MsgBox("Data has been entered into this form." _
        & vbCrLf & vbCrLf & "Do you want to save this data?" _
        , vbYesNo, "Changes Made...") = vbYes Then
            DoCmd.Save
    Else
        DoCmd.RunCommand acCmdUndo
    End If
End Sub  
Run Code Online (Sandbox Code Playgroud)

我曾想过使用beforeinsert事件,但是在使用beforeinsert时打开表单时遇到了问题.

有人可以告诉我如何进行设置,以便不会在自动编号值的序列中创建这些间隙吗?该数据库可能由10个并发用户使用.

Con*_*rew 6

您不应该为自动编号字段的值赋值.自动编号允许您为每一行定义唯一值,并且这样做不保证它们是顺序的.我强烈建议您仅使用自动编号字段来识别唯一记录,而不是某种计数器或人类可读的值.

现在,如果你需要每个记录确实有一个顺序值,那么你需要做的就是这样

  1. 创建一个单独的表,该表只有一行,一列保存序列中的下一个值.
  2. 每当从数据输入表单保存记录时,您将独占锁定该计数器表,从而阻止任何其他用户读取或写入该表.
  3. 从计数器表中检索当前值,并在新的dataentry记录中使用它.
  4. 更新计数器表中的值以增加到下一个值.

Microsoft提供了一个可以轻松独占锁定表的函数:DAOOpenTableExclusive()可在此处找到.

您可以使用此处的代码创建计数器表.