我有一个涉及人类遗骸的复杂数据库,因此输入数据的访问表单也相当复杂。我有几个子窗体( backbone 索引、元素索引和其他一些)。我提到的两个子窗体名称将数据发送到未绑定主窗体上各自的字段(element\u link、skeleton\u link),其他窗体将从中使用数据。对于skeleton\u index,用户必须输入个人的姓名,它会立即显示在skeleton\u index字段中。我的问题是,我不希望用户必须输入元素索引的主键数据,因为它应该自动递增。这是一个问题,因为element\u id中的自动递增值不会立即显示在element\u link字段中。为了让它显示出来,用户必须创建一个新元素,然后返回到他们正在编辑的元素。我想避免这样。
我要做的是在获得焦点时将element\u id文本框更新为一个新的自动增量主键。vba代码应该从mysql(innodb)element\u index表中获取最后一个主键,向其中添加一个,然后更新element\u index表单中element\u id字段中的值。
这是我的尝试,但显然失败了。
Private Sub Element_id_GotFocus()
SQL = "SELECT LAST_INSERT_ID();"
lastID = DoCmd.RunSQL(SQL)
newID = Int(lastID) + 1
Element_id.Value = newID
End Sub
编辑:
数据库在第一个示例中将有一个用户,但将来可能会有更多用户。
解决方案:我添加了一个带有两个宏的按钮:一个保存插入的记录,另一个刷新窗体。不需要复杂的vba。
2条答案
按热度按时间vnzz0bqm1#
当id无效时,我依赖于错误。
首先获取max(id),然后递增,最后用递增的id执行insert query。如果没有错误,您就有fk的id,在错误处理时(例如,用下一个增量重试)
xeufq47z2#
你的尝试在很多方面都是错误的。主要有:
你不能使用
DoCmd.RunSQL
运行选择查询。它只运行操作查询。您需要使用passthrough查询来运行包含mysql特定函数的查询。
你不能使用
LAST_INSERTED_ID()
除非您在用于向感兴趣的表中插入行的同一连接上执行它。最好使用querydef执行passthrough查询,并使用information\u schema.tables表检索下一个自动编号: