VBA访问需要在保存新记录之前获取自动编号

Posted

技术标签:

【中文标题】VBA访问需要在保存新记录之前获取自动编号【英文标题】:VBA Access Need to obtain autonumber before saving new record 【发布时间】:2014-11-14 04:17:23 【问题描述】:

我有一个带有 SQLServer 后端的数据库,该后端是从 Access 和一个 Access 前端迁移而来的。迁移后,我一直遇到的一个问题是,在保存记录之前不会生成自动编号(很明显,但 Access 似乎并不关心)。我有一个打开表格以在表格中创建新记录,但该表格的元素需要该新记录的自动编号(身份)字段的值来计算事物。我想在表单加载时以某种方式获得这个数字,而不是为了获得这个数字而必须保存并重新打开它。解决这个问题的最佳方法是什么?提前致谢。

【问题讨论】:

【参考方案1】:

Access 数据库在记录脏时返回 + 生成自动编号。在 SQL server + Access 的情况下,您不能使用也不显示自动编号 UNTIL 记录保存时间。 简单的解决方案是强制保存表单数据,然后您拥有的任何后续/现有代码将继续工作。

所以你的代码可以是这样的:

If Me.NewRecord = True Then
  Me.Dirty = False
End If

只要进行了一些编辑,上述操作就会起作用。请注意,如果没有进行任何编辑,上述将不会生成自动编号 ID(但是即使在非 SQL 服务器数据库中,当没有进行任何编辑时,自动编号也不可用)。

以上适用于绑定表单。如果您有 reocrdset 代码,那么您可以像这样更改典型代码:

Set rstRecords = CurrentDb.OpenRecordset("tblmain")
rstRecords.AddNew

在您的 VBA 代码上方可以/可以获取自动编号。但是上面的 sql sever 代码必须强制保存。

事实上,适用于 ACE 或 SQL 服务器的代码如下:

将变为: 暗淡 rstRecords 作为 DAO.Recordset 将 lngNext 调暗

Set rstRecords = CurrentDb.OpenRecordset("tblmain", dbOpenDynaset, dbSeeChanges))
rstRecords.AddNew

  ' code here does whatever
rstRecords.Update
rstRecords.Bookmark = rstRecords.LastModified
lngNext = rstRecords!ID
rstRecords.Close

所以简单的“问题”是您需要写出记录以强制 SQL 服务器生成自动编号。完成此记录保存后,您的表单和大多数 VBA 代码应该“按原样”运行。除非您使用 SQL 插入命令而不是上述表单或记录集代码,否则您不需要“求助”其他代码,例如 select @@identity。

【讨论】:

所以澄清一下,您的解决方案将依赖于使用 DAO 而不是 ADODB? 正确。然而,原始帖子谈论的是绑定表单,因此您使用的是 DAO。然而,在对 JET/ACE 数据库使用 ADO 时存在同样的问题 - 自动编号立即可用,而使用 sql server 则不可用。唯一真正的区别是 ADO 不会像 DAO 那样在添加记录后移动 reocrdset 指针,因此使用 ADO 您可以转储书签代码的要求,但其思想和概念与 ADO 或 DAO 完全相同。由于 SQL Server 正在放弃对 oleDB 的支持,因此几乎没有理由将 ADO 与 Access 一起使用。 谢谢。这很有帮助,我忘记了 Me.Dirty = False 如果没有进行编辑就不会生成。 您可以使用仅在用户开始输入数据时触发的表单插入事件。如果他们决定关闭表单,则不会创建空白记录。因此,人们可以考虑在他们开始输入的那一刻强制保存当前记录。但是,如果您在表格中有必填字段,这可能会带来一些挑战。【参考方案2】:

您指的是 Access 中的 AutoNumber 列,它是 SQL 中的 Identity 字段。

在 SQL 中完成此功能的唯一方法是在打开表单时插入记录,然后使用 SQL 中的@@Identity 检索最新值。

当您的 Access 应用程序与数据库结合在一起时,Access 实质上就是在为您做这件事。您可以查看以下链接了解更多详情。

http://bytes.com/topic/sql-server/answers/143378-identity-sql-vs-autonumber-access

【讨论】:

他正在使用绑定表单,因此没有运行任何代码来插入记录。作为表单记录源的一部分,身份可用,但仅在保存记录之后。因此不需要@@identity,实际上通常不知道何时保存表单的数据(Access 表单中没有保存按钮)。【参考方案3】:

如果它在一个绑定的表单上,给出一个保存按钮,它将记录保存到主表的数据库。它除了标识字段的值之外什么都没有。然后启用或显示需要此主表/表单中的 ID 的子表单。

看起来@@identity 代码可能对您来说是不可能的,因为它是绑定的形式。为了说服用户为什么在向表单添加任何数据之前需要保存,我将按钮命名为“显示详细信息”或“将数据添加到详细信息”,这会在表单上使用 docmd 保存记录,并使详细信息部分可见。

DoCmd.RunCommand acCmdSaveRecord

'或者一个不同的代码sn-p,只需更新表单的脏状态

If Me.Dirty = True then
   Me.Dirty = False
End If

'您可以编写代码来显示/可见的详细信息部分/子表单

【讨论】:

以上是关于VBA访问需要在保存新记录之前获取自动编号的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 VBA 在 ms 访问表单中创建自定义自动编号? [关闭]

Access 2010 VBA - 打开新记录集 - 打开之前意外保存的值

在保存数据之前是不是有可能获得访问权限?

访问 VBA 从月份数获取季度

MS Access ADP 自动编号

自动表格填写 ms 访问