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

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

【问题讨论】:

    标签: sql vba ms-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
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多