【问题标题】:Saving data to a table then retrieving the autonumber to save to another table将数据保存到表中,然后检索自动编号以保存到另一个表
【发布时间】:2013-07-24 02:33:29
【问题描述】:

我目前正在尝试从已插入一些数据的表中检索 AutoNumbered 值,以便可以使用 AutoNumber 插入另一个表。

我有两个表:一个存储客户信息 (CustMaster),另一个存储 RMA 信息 (RMAMaster)。这两个表中的 CustNbr 字段通过关系链接。当我将数据插入 CustMaster 表时,CustNbr 字段是一个自动编号,递增一。当我将数据插入 RMAMaster 表时,RMANbr 字段作为自动编号递增 1。

我有一个表单,用户在其中输入新客户的信息(如果客户是“新客户”,即不在数据库中),然后单击一个名为“生成 RMA”的按钮,将新客户保存到CustMaster 表(公司名称、地址、城市、州、邮编、国家/地区)并将 RMA 信息保存到 RMAMaster 表(生成日期、生成 RMA 的人的姓名首字母、任何注释和 CustMaster 表中的 CustNbr) .

如果客户是新客户,我必须从我创建的 CustMaster 条目中获取 AutoNumber CustNbr 并将其插入 RMAMaster 表以链接两者,但我不知道如何成功地做到这一点。我尝试了以下代码但没有成功:

DoCmd.RunSQL ("INSERT INTO [CustMaster] (fcompany,fmstreet,fcity,fstate,fzip,fcountry) VALUES ('" & Me.CustName & "','" & Me.CustAddr & "','" & Me.CustCity & "','" & Me.CustState & "','" & Me.CustZip & "','" & Me.CustCountry & "')") 'Insert the customer information into the CustMaster table
RetCustNbr = oConn.Execute("SELECT @@Identity")(0) ' (hopefully) grab the last autonumber from the CustMaster table so that we can insert it into the RMAMaster table
DoCmd.RunSQL ("INSERT INTO [RMAMaster] (Initials,DateIssued,CustNbr,ContactFirst,ContactLast,ContactEmail,Notes) VALUES ('" & Me.Initials & "','" & Today & "','" & RetCustNbr & "','" & Me.ContactFirst & "','" & Me.ContactLast & "','" & Me.ContactEmail & "','" & Me.RMANotes & "')") ' Insert data into the RMAMaster table
RetRMANbr = oConn.Execute("SELECT @@Identity")(0) ' (hopefully) grab the last AutoNumber RMANbr so that I can display it to the user
Me.RMANbr = RetRMANbr ' Set the Retrieved AutoNumber RMANbr from the table and query above and set a field on the form to it so that the user can see it and give it to the customer

我从How to retrieve autonumbered field via ADODB 中找到了“SELECT @@Identity”查询,但该答案中没有关于如何将其成功应用于我的情况的真正上下文。

在我的“生成 RMA”的 OnClick 事件中使用上面的代码会给我一个错误“需要对象”,但没有提及错误可能在哪里。数据会保存到 CustMaster 表中,但 RMAMaster 表中不会出现新数据。

我在 Windows XP 机器上使用 Access 2003。我没有更改任何默认引用,它在 ActiveX 数据对象库之前列出了 DAO 对象库。

任何人都可以就我可能缺少的东西或在哪里提供帮助吗?希望我说的有点道理。

提前谢谢你。

【问题讨论】:

  • Access 疑难解答中的第 1 步;在您的代码中放置一个断点。打开 VBA 窗口并单击 VBA 左侧的灰色列。它应该在列中放置一个红点。这是一个断点。现在,再次单击您的按钮,代码将在断点处停止(因此,将其放在 VBA 正在执行的第一行代码上)。按 F8 键逐行逐行。然后,当您收到错误时,请告诉我们它发生在哪一行。我们可以通过这种方式更好地帮助您。
  • 感谢您的指导。在RetCustNbr = oConn.Execute("SELECT @@Identity")(0) 之后失败了,我会记住这个断点,谢谢!

标签: sql vba ms-access


【解决方案1】:

您可以使用如下代码通过 DAO 调用 SELECT @@IDENTITY

Option Compare Database
Option Explicit

Sub test()
Dim cdb As DAO.Database, rst As DAO.Recordset, newID As Long
Set cdb = CurrentDb
cdb.Execute "INSERT INTO Users (Email) VALUES (""gord@example.com"")", dbFailOnError
Set rst = cdb.OpenRecordset("SELECT @@IDENTITY", dbOpenSnapshot)
newID = rst(0).Value
rst.Close
Set rst = Nothing
Set cdb = Nothing
Debug.Print newID
End Sub

【讨论】:

  • 我想我对 DAO 的内容不够具体。这运作良好。谢谢!
【解决方案2】:

有 3 种方法可以检索最后插入的 Id

1)SELECT IDENT_CURRENT('Table_Name') 检索最后一个身份

2) 插入 Table_Name 值('ABC'...);选择@@Identity

3)SELECT SCOPE_IDENTITY() -- 给出last Last插入表中最后插入行的ID

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-04
    • 2018-10-29
    • 1970-01-01
    • 2017-12-01
    • 1970-01-01
    相关资源
    最近更新 更多