2013-05-15 57 views
25

我有一個相當大的查詢,加入了十多個表格,並且我想根據id字段取回記錄(,例如between nStartID and nEndID)。是否可以在Microsoft Access更新查詢中以編程方式傳遞參數?

我創建了兩個參數,並將它們作爲條件進行測試,它們工作正常。

問題是,我需要從主查詢運行一個插入查詢,並且在主查詢中需要它們所在的參數。所以,我需要以編程方式將參數傳遞給它。

任何人都知道如何做到這一點?

謝謝。

+0

我有我的需求的解決方案,但不知道它是否是最好的。我爲nStartID和nEndID創建了全局變量,然後爲每個創建一個函數,如getStartID()和getEndID(),它們讀取這些值。然後我只是在原始查詢的where子句中使用這些函數。不是最優雅的解決方案,但它的工作原理。 如果其他人有他們想分享的經驗,爲了他人的利益,我會離開這裏。感謝您的有益幫助。 – Jav

回答

47

我只是測試這一點,它在Access 2010年工作

假設你有一個帶參數的SELECT查詢:

PARAMETERS startID Long, endID Long; 
SELECT Members.* 
FROM Members 
WHERE (((Members.memberID) Between [startID] And [endID])); 

您運行查詢交互,它會提示您輸入[startID]和[ endID所。這是有效的,所以你把這個查詢保存爲[MemberSubset]。

現在你創建基於查詢的更新查詢:

UPDATE Members SET Members.age = [age]+1 
WHERE (((Members.memberID) In (SELECT memberID FROM [MemberSubset]))); 

你交互式運行查詢,並再次提示您輸入[startID]和[endID所]和它工作得很好,所以你將它保存爲[MemberSubsetUpdate]。

通過將[startID]和[endID]值指定爲[MemberSubsetUpdate]的參數,即使它們實際上是[MemberSubset]的參數,您也可以從VBA代碼運行[MemberSubsetUpdate]。這些參數值「涓滴」到需要的地方,且查詢並無需人工干預工作:

Sub paramTest() 
    Dim qdf As DAO.QueryDef 
    Set qdf = CurrentDb.QueryDefs("MemberSubsetUpdate") 
    qdf!startID = 1 ' specify 
    qdf!endID = 2 '  parameters 
    qdf.Execute 
    Set qdf = Nothing 
End Sub 
+0

感謝分享,我找到了類似的代碼,但沒有解釋。 – Jav

4

非常感謝有關使用QueryDefs收集的信息!我一直在想這件事。

我通過使用包含查詢參數的表,以不同的方式使用VBA。

如: SELECT a_table.a_field FROM QueryParameters,a_table WHERE a_table.a_field BETWEEN QueryParameters.a_field_min和QueryParameters.a_field_max

凡QueryParameters是一個表有兩個字段,a_field_min和a_field_max

它甚至可以與GROUP BY一起使用,如果在GROUP BY子句中包含查詢參數字段,並且在HAVING子句中的參數字段中包含FIRST運算符。

16

嘗試使用QueryDefs。使用參數創建查詢。然後使用類似這樣的東西:

Dim dbs As DAO.Database 
Dim qdf As DAO.QueryDef 

Set dbs = CurrentDb 
Set qdf = dbs.QueryDefs("Your Query Name") 

qdf.Parameters("Parameter 1").Value = "Parameter Value" 
qdf.Parameters("Parameter 2").Value = "Parameter Value" 
qdf.Execute 
qdf.Close 

Set qdf = Nothing 
Set dbs = Nothing 
+2

我想你也可以通過編號引用'.Parameters',比如'qdf.Parameters(1).Value =「Parameter Value」'。不確定它是否基於零。 –

+1

這是對的,我確認它是基於零的。 –

1

您也可以使用TempVars - note'!'語法是必不可少的 You can also use TempVars - note '!' syntax is essential

相關問題