我如何确定下一个记录号 (PK) 是啥?
Posted
技术标签:
【中文标题】我如何确定下一个记录号 (PK) 是啥?【英文标题】:how do i determine what the next record number (PK) is?我如何确定下一个记录号 (PK) 是什么? 【发布时间】:2011-08-02 01:01:33 【问题描述】:我试图以编程方式获取主键的自动编号序列中的下一个数字。例如,如果表中的最后一个数字是 10,我需要它返回 11。之前,我会使用类似:
docmd.RunCommand acCmdRecordsGoToNew
为了告诉数据库转到下一条记录,然后我将其分配给表单上的控件以向用户显示他们当前正在输入的记录。问题是,当我通过在属性窗口中将其属性设置为“否”来禁用导航按钮时,此功能停止工作。如何在不启用导航栏的情况下获取 vba 中的下一条记录?
【问题讨论】:
您可以使用 ADOX 确定下一个自动编号值(请参阅***.com/questions/6498221/…)如果那是您真正想要的。但是,您的问题表明您可能真正想要的是移至“新”记录。这是一个不同的问题。 仅仅删除控件通常是不够的,因为用户可以按 Ctrl 和 + ,或向下翻页,仍然添加记录。您是否还禁用了 Allow Addition 属性?这可以解释为什么你的 RunCommand 不再工作了。 @hans,实际上没有必要移动到新记录。在这种情况下,只需执行插入命令即可完成相同的操作。 @iDev 不,我没有禁用允许添加属性。 【参考方案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 可以具有的自动编号值没有问题。
但请记住,如果您关心下一个自动编号值,则表示您使用错误。自动编号值是代理键,您永远不应该关心值是什么。
【讨论】:
【参考方案2】:原来有一个 VBA 函数将与数据库交互并实际返回一个值。这就是我最终为获得下一个记录号所做的事情:
Dim nextRecord As Integer
nextRecord = DMax("ID", "my_table") + 1
草率,但对我的单一客户情况有效。还有一个 where 子句可以应用:
Dim nextRecord As Integer
nextRecord = DMax("ID", "my_table", "field = value")
【讨论】:
它实际上不会产生正确的值。考虑您的最后一个值是否为 10。您插入一条新记录 11,然后将其删除。如果您现在添加一条新记录,它的值将是 12,而不是 11,因为您的 DMax() 会返回。 好吧,我还没有看到另一个解决方案。我知道在 oracle 中,这真的很容易,因为您可以在序列对象上使用 nexval。我不知道为什么我很难找到访问的答案... 有一个解决方案——你查看 SeedValue。我会用代码发布答案。以上是关于我如何确定下一个记录号 (PK) 是啥?的主要内容,如果未能解决你的问题,请参考以下文章