向Access表中添加一行时,生成一个序列号(每个组)

我有一个MS Access(.accdb)表,数据如下所示:

Location Number -------- ------ ABC 1 DEF 1 DEF 2 GHI 1 ABC 2 ABC 3 

每次我将数据附加到表格中,我都希望该数字对于位置是唯一的。 我通过MS Excel VBA访问这个表 – 我想创build一个新的logging(我指定了代码中的位置),并创build了一个唯一的序列号。 有没有办法来设置表,所以这是自动发生的logging添加? 我应该写一些描述的查询,并确定每个位置的下一个数字,然后在创buildlogging时同时指定位置和数量?

我正在写下如下表格:

  Set rst = New ADODB.Recordset rst.CursorLocation = adUseServer rst.Open Source:="Articles", _ ActiveConnection:=cnn, _ CursorType:=adOpenDynamic, _ LockType:=adLockOptimistic, _ Options:=adCmdTable rst.AddNew rst("Location") = fLabel.Location 'fLabel is an object contained within a collection called manifest rst("Number") = 'Determine Unique number per location rst.Update 

任何帮助,将不胜感激。

编辑 – 添加了我正在努力的VBA代码,因为问题被搁置

我怀疑你正在寻找这样的东西:

 Dim con As ADODB.Connection, cmd As ADODB.Command, rst As ADODB.Recordset Dim newNum As Variant Const fLabel_Location = "O'Hare" ' test data Set con = New ADODB.Connection con.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Users\Public\Database1.accdb;" Set cmd = New ADODB.Command cmd.ActiveConnection = con cmd.CommandText = "SELECT MAX(Number) AS maxNum FROM Articles WHERE Location = ?" cmd.CreateParameter "?", adVarWChar, adParamInput, 255 cmd.Parameters(0).Value = fLabel_Location Set rst = cmd.Execute newNum = IIf(IsNull(rst("maxNum").Value), 0, rst("maxNum").Value) + 1 rst.Close rst.Open "Articles", con, adOpenDynamic, adLockOptimistic, adCmdTable rst.AddNew rst("Location").Value = fLabel_Location rst("Number").Value = newNum rst.Update rst.Close Set rst = Nothing Set cmd = Nothing con.Close Set con = Nothing 

但请注意,此代码不是多用户安全的。 如果有多个用户同时运行这个代码的可能性,那么你可以结束重复的[数字]值。

(要使代码具有多用户安全性,您需要在([Location],[Number])上创build唯一索引,并在rst.Update失败的情况下添加一些错误捕获。

编辑

对于Access 2010和更高版本,请考虑使用事件驱动的数据macros,并在此问题的其他答案中显示。

您需要将新列添加到您的数据types为AutoNumber表中。

office.microsoft.com:在Access中自动生成数字的字段

您应该也可以将此列设置为您的主键。

对于Access 2010和更新版本,这是一个更好的方法来做到这一点。 它使用表Before Change数据macros来派生下一个连续的数字,并将其放在新logging的[Number]字段中:

BeforeChange.png

这种方法的优点是:

  • 无论添加新logging,每当添加新logging时都会应用序列号。
  • Excel VBA代码不必担心创build序列号; 它“刚刚发生”。
  • 由于此代码驻留在表级别,因此对于多用户环境应该是安全的。

有关数据macros的更多信息,请参阅

创build一个数据macros