2011-11-29 36 views
0

我遇到了在Access數據庫中運行自定義函數的問題。目前,有一個過程用於導入新數據,併爲所有新行分配一個外鍵(ENTRY_ID)爲-1。一個單獨的進程運行,以遞增順序將-1更改爲下一個數字。Access中的用戶自定義函數,只運行一次,而不是每行

這是函數:

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

是否有某些原因您不僅僅使用自動編號字段? – mwolfe02

回答

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 

這種方式訪問​​會認爲他們GetNextEntry依賴於進口值,每次將獲得一個新的價值。

+0

這是真的,但我不認爲它會解決問題,因爲函數還取決於表的*內容*來計算其返回值。當INSERT INTO查詢調用該函數時,它所打開的記錄集不會看到由INSERT INTO查詢引起的任何更改。 – phoog

+0

實際上這是一個有效的點。我沒有看過這個功能。 – Eljakim

+0

因此,內部功能也應該改變。這引出了問題,這不是什麼自動編號字段是在Access中? – Eljakim

2

由於mwolfe02在他的評論中建議,在數據表中定義一個自動編號字段(Entry_ID),放棄使用該函數,並在向表中插入數據時讓Access爲Entry_ID指定一個唯一值。

另外,您應該明確定義您要插入數據的字段以及您在語句中選擇的相應字段。如果沒有這樣做,如果有人在任何一個表中改變了字段的序號位置,你將來不可避免地會遇到問題。

INSERT INTO DATA ([Name], [Number], [NextField], etc.) 
SELECT ([Name], [Number], [NextField], etc.) 
FROM IMPORT