我如何确定下一个记录号(PK)是什么?

时间:2011-08-02 01:01:33

标签: ms-access primary-key ms-access-2010

我试图以编程方式获取主键的自动编号序列中的下一个数字。例如,如果表中的最后一个数字是10,我需要它返回11.之前,我会使用类似的东西:

docmd.RunCommand acCmdRecordsGoToNew

为了告诉数据库转到下一条记录,然后我将其分配给表单上的控件,以向用户显示他们当前正在输入的记录。问题是,当我通过在属性窗口中将其属性设置为“否”来禁用导航按钮时,此功能停止工作。如何在没有启用导航栏的情况下获取vba中的下一条记录?

2 个答案:

答案 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")