我试图以编程方式获取主键的自动编号序列中的下一个数字。例如,如果表中的最后一个数字是10,我需要它返回11.之前,我会使用类似的东西:
docmd.RunCommand acCmdRecordsGoToNew
为了告诉数据库转到下一条记录,然后我将其分配给表单上的控件,以向用户显示他们当前正在输入的记录。问题是,当我通过在属性窗口中将其属性设置为“否”来禁用导航按钮时,此功能停止工作。如何在没有启用导航栏的情况下获取vba中的下一条记录?
答案 0 :(得分:1)
要知道真正的下一个值是什么,您必须查找Autonumber列的SeedValue。这段代码可以做到:
Public Function GetSeedValue(strTable As String, strColumn As String) As Long
Dim cnn As Object 'ADODB.Connection
Dim cat As Object ' New ADOX.Catalog
Dim col As Object ' ADOX.Column
Set cnn = CurrentProject.Connection
Set cat = CreateObject("ADOX.Catalog")
cat.ActiveConnection = cnn
Set col = cat.Tables(strTable).Columns(strColumn)
GetSeedValue = col.Properties("Seed")
Set col = Nothing
Set cat = Nothing
Set cnn = Nothing
End Function
如果您要调用它,您可能希望缓存ADOX Catalog对象变量,而不是每次调用此函数时重新初始化它。
请注意,在多用户环境中,这可能是准确的,也可能不准确,因为在您使用它时,它可能已被其他用户更新。但是,跳过Max()+ 1可以拥有的自动编号值没有问题。
但请记住,如果您关心下一个自动编号值,则表示您使用的是错误的。自动编号值是代理键,您永远不应该关心值是什么。
答案 1 :(得分:0)
事实证明,有一个VBA函数将与数据库交互并实际返回一个值。这就是我最终为获得下一个记录号而做的事情:
Dim nextRecord As Integer
nextRecord = DMax("ID", "my_table") + 1
邋,,但对我的单一客户情况有效。还有一个可以应用的where子句:
Dim nextRecord As Integer
nextRecord = DMax("ID", "my_table", "field = value")