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

Ms access 如何确定下一个记录编号(PK)是什么?,ms-access,primary-key,ms-access-2010,Ms Access,Primary Key,Ms Access 2010,我正试图通过编程方式获取主键自动编号序列中的下一个编号。例如,如果表中的最后一个数字是10,我需要它返回11。在此之前,我会使用类似于: docmd.RunCommand acCmdRecordsGoToNew 为了告诉数据库转到下一条记录,然后我将它分配给表单上的一个控件,以向用户显示他们当前输入的记录。问题是,当我在属性窗口中将导航按钮的属性设置为“否”时,该功能停止工作。如何在不启用导航栏的情况下在vba中获取下一条记录?结果表明,有一个vba函数将与数据库交互并实际返回一个值。这就是我

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

docmd.RunCommand acCmdRecordsGoToNew

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

结果表明,有一个vba函数将与数据库交互并实际返回一个值。这就是我为了获得下一个记录号码而做的事情:

Dim nextRecord As Integer
nextRecord = DMax("ID", "my_table") + 1
草率,但对我的单一客户情况有效。还有一个where条款可以适用:

Dim nextRecord As Integer
nextRecord = DMax("ID", "my_table", "field =  value")

要知道真正的下一个值是什么,您必须查找“自动编号”列的种子值。该代码的作用是:

  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可能具有的自动编号值的问题


但是,请记住,如果您关心下一个“自动编号”值,则表示您使用了错误的值。自动编号值是代理键,您永远不应该关心这些值是什么。

您可以使用ADOX确定下一个自动编号值(请参阅),如果这是您真正想要的。然而,你的问题表明,你真正想要的可能是进入“新”记录。这是另一个问题。仅仅删除控件通常是不够的,因为用户可以按Ctrl和+,或向下翻页,但仍然可以添加记录。您是否也禁用了“允许添加”属性?这就解释了为什么您的RunCommand不再工作了。@hans,实际上没有必要移动到新记录。在这种情况下,简单地执行insert命令也会执行相同的操作。@iDev No我没有禁用“允许添加”属性。它实际上不会生成正确的值。考虑最后一个值是否为10。插入新记录11,然后将其删除。如果您现在添加一个新记录,它的值将是12,而不是11,因为您的DMax()将返回。我知道在oracle中,这非常简单,因为您可以在序列对象上使用nexval。我不知道为什么我很难找到访问的答案……有一个解决方案——你查找SeedValue。我将发布一个带有代码的答案。