我在Access数据库中运行自定义函数时遇到问题。目前,有一个流程可以导入新数据,并为所有新行分配一个外键(ENTRY_ID)为-1。运行单独的进程以将增量序列中的-1更改为下一个数字。
这是功能:
Public Function GetNextEntry(table As String) As Double
Dim r As DAO.Recordset
Dim i As Double
Set r = CurrentDb.OpenRecordset("SELECT LAST_ENTRY_ID FROM LAST_ENTRY WHERE TABLE_NM='" & table & "';")
If r.EOF Then
GetNextEntry = -1
Exit Function
End If
i = r![LAST_ENTRY_ID] + 1
r.Edit
r![LAST_ENTRY_ID] = i
r.Update
GetNextEntry = i
Exit Function
GetNextEntry_ERROR:
GetNextEntry = -1
End Function
这是查询的极简化版本:
INSERT INTO DATA
SELECT GetNextEntry('DATA') AS ENTRY_ID, IMPORT.*
FROM IMPORT
我希望得到的回报看起来像
ENTRY_ID, NAME, NUMBER
1, 'account 1', '1234567'
2, 'account 1', '1234567'
3, 'account 1', '1234567'
4, 'account 1', '1234567'
5, 'account 1', '1234567'
但我实际上已经
了ENTRY_ID, NAME, NUMBER
1, 'account 1', '1234567'
1, 'account 1', '1234567'
1, 'account 1', '1234567'
1, 'account 1', '1234567'
1, 'account 1', '1234567'
似乎该功能如果仅对整个组运行一次。我可以通过从结果数据集中提供数据来强制它运行多次,但是如果我滚动数据,它会在每次将行重新绘制到屏幕时重新运行该函数。
这是我长篇大论,询问是否有更好的方法来完成我所追求的目标。我认为必须有,因为这看起来过于复杂。
答案 0 :(得分:2)
正如mwolfe02在他的评论中建议的那样,在DATA表上定义一个自动编号字段(Entry_ID),放弃该函数的使用,让Access在向表中插入数据时为Entry_ID分配一个唯一值。
此外,您应该明确定义要插入数据的字段以及您在语句中选择的相应字段。如果有人在任何一个表中更改了字段的顺序位置,那么如果不这样做,你将不可避免地遇到问题。
INSERT INTO DATA ([Name], [Number], [NextField], etc.)
SELECT ([Name], [Number], [NextField], etc.)
FROM IMPORT
答案 1 :(得分:1)
访问很聪明;它没有意识到你的函数返回一个不同的 每次都有价值。
尝试重新定义您的功能:
Public Function GetNextEntry(table As String, salt as integer) As Double
然后
INSERT INTO DATA
SELECT GetNextEntry('DATA', IMPORT.SOMEINTEGERFIELD) AS ENTRY_ID, IMPORT.*
FROM IMPORT
这样Access会认为GetNextEntry取决于导入的值,并且每次都会得到一个新值。