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

时间:2013-11-04 05:39:05

标签: sql excel vba ms-access

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

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

每次我将数据附加到表格时,我希望该数字对于该位置是唯一的。 我通过MS Excel VBA访问此表 - 我想创建一个新记录(我在代码中指定位置)并创建一个唯一的序列号。 有没有办法设置表格,以便在添加记录时自动执行此操作? 我应该写一些描述的查询并确定每个位置的下一个数字,然后指定位置和放大器。我创建记录时的数字?

我写信给表格如下:

    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代码,因为问题已暂停

3 个答案:

答案 0 :(得分:0)

您需要在数据类型AutoNumber的表格中添加新列。

office.microsoft.com: Fields that generate numbers automatically in Access

您可能还应该将此列设置为主键。

答案 1 :(得分:0)

对于Access 2010及更高版本,这是一种更好的方法。它使用表的Before Change数据宏来导出下一个序列号,并将其放在新记录的[Number]字段中:

BeforeChange.png

这种方法的优点是:

  • 无论 如何
  • ,都会在添加新记录时应用序列号。
  • Excel VBA代码不必担心创建序列号;它“刚刚发生”。
  • 由于此代码位于表级别,因此 对多用户环境来说是安全的。

有关数据宏的详细信息,请参阅

Create a data macro

答案 2 :(得分:0)

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

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

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

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

修改

对于Access 2010及更高版本,请考虑使用事件驱动的数据宏并显示在我的other answer to this question中。