Access中的用户定义函数,仅运行一次,而不是每行

时间:2011-11-29 16:40:09

标签: function ms-access vba

我在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'

似乎该功能如果仅对整个组运行一次​​。我可以通过从结果数据集中提供数据来强制它运行多次,但是如果我滚动数据,它会在每次将行重新绘制到屏幕时重新运行该函数。

这是我长篇大论,询问是否有更好的方法来完成我所追求的目标。我认为必须有,因为这看起来过于复杂。

2 个答案:

答案 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取决于导入的值,并且每次都会得到一个新值。