一尘不染

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

sql

我有一个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代码,因为问题被搁置了


阅读 242

收藏
2021-03-10

共1个答案

一尘不染

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

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失败。)

\

2021-03-10