我有一个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代码,因为问题已暂停
答案 0 :(得分:0)
您需要在数据类型AutoNumber
的表格中添加新列。
office.microsoft.com: Fields that generate numbers automatically in Access
您可能还应该将此列设置为主键。
答案 1 :(得分:0)
对于Access 2010及更高版本,这是一种更好的方法。它使用表的Before Change
数据宏来导出下一个序列号,并将其放在新记录的[Number]字段中:
这种方法的优点是:
有关数据宏的详细信息,请参阅
答案 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中。