我有一个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代码,因为问题被搁置了
我怀疑您正在寻找这样的东西:
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失败。)
rst.Update
\