2013-06-26 28 views
3

注意:請耐心等待,因爲我對Access相對來說比較陌生......我學到的一切都是通過在必要時搜索Google來實現的。如何顯示Access查詢結果而不必創建臨時查詢?

所以我正在創建一個表單,其唯一目的是通過數據庫進行搜索。在一個用例中,用戶可以選擇多個選項來過濾搜索,出於隱私的原因,我們可以說「藍色,綠色,紅色,棕色」。用戶可以選擇這些顏色的任意組合,包括全部或無。在數據庫表中,有一個主鍵(在我們的例子中是一個ItemID)。表中的其他列是上面的顏色(藍色,綠色,紅色,棕色)。由於這些數據的結構(注意:由於多種原因無法更改),我必須在VBA中創建此SQL查詢,而不是使用Access提供的。

這裏是我用來創建和運行時的「搜索」按鈕被按下的查詢代碼:

Set qdf = Nothing 

*Logic to create SQL query... variable to hold query is called sqlStr* 

Set qdf = CurrentDb.CreateQueryDef("TemporaryQuery", sqlStr) 
DoCmd.OpenQuery qdf.Name 

儘可能多的搜索的結果,這是我發現的唯一途徑,除了從使用ADO開始,我可以創建一個SQL查詢IN VBA,然後在VBA中運行它。這種方法的缺點在於它創建了一個查詢,該查詢在查詢再次運行之前必須關閉並刪除。這對於將使用此功能的用戶來說是不可接受的。

我發現的所有例子(請與我一起)使用ADO,我一直無法工作。我有兩個數據庫,一個用於查詢和表單,另一個用於數據本身。包含數據的數據庫具有使用查詢和表單鏈接到數據庫的表格。我不確定ADO是否可以在該設置下工作,但如果可以的話,我一直無法弄清楚。

使用Access來自Java/Webdev背景對我來說有點令人沮喪,因爲它似乎讓事情變得更加複雜(在我看來)它應該是。任何人都可以幫助我正確地工作嗎?

謝謝你的時間...這是非常感謝!

+0

如果結果總是包含根據您的過濾相同的字段,但不同的數據,你可以使用一個子形式設立數據表視圖。 – Zaider

+0

@Zaider你碰巧有一個很好的教程來處理子表單? –

+0

@MikeRinehart用戶只需要查看這些數據,或者具有編輯功能,如果僅僅是從視圖角度來看,那麼你可以在表單上使用一個簡單的「列表框」,你可以設置「列表框」的「Rowsource」屬性到一個SQL字符串 –

回答

4

我對這些說法不解......

「這樣做的缺點的方法,而它的工作原理是,它創建了一個查詢,它必須被關閉,並刪除之前的查詢可以跑這對於那些將要使用它的用戶來說是不可接受的。「

我不明白爲什麼這是用戶關心的問題。他們不應該手動刪除查詢---您可以使用DoCmd.DeleteObject通過VBA爲他們執行此操作。實際上,這聽起來像你可能只需要修改查詢。如果是這樣,您不需要先刪除舊版本,然後創建一個新的查詢。您可以簡單地更改查詢的.SQL屬性。

如果用戶的問題是,他們不希望看到甚至TemporaryQuery在導航面板(太混亂?),更名爲USysTemporaryQuery。這樣他們只會看到它,如果他們的面板屬性設置爲顯示系統對象。

我會提供一個代碼示例,但它可能不是您想要的。但也許別人會覺得它有用。

Const cstrQueryName As String = "TemporaryQuery" 
Dim db As DAO.Database 
Dim qdf As DAO.QueryDef 
Dim sqlStr As String 

'*Logic to create SQL query... variable to hold query is called sqlStr* 
' Apparently you have that piece worked out. I'll use a simple query ... 
sqlStr = "SELECT * FROM Dual;" 

Set db = CurrentDb 
If Not QueryExists(cstrQueryName) Then 
    Set qdf = db.CreateQueryDef(cstrQueryName) 
Else 
    Set qdf = db.QueryDefs(cstrQueryName) 
End If 
qdf.sql = sqlStr 
Set qdf = Nothing 
Set db = Nothing 
DoCmd.OpenQuery cstrQueryName 

如果你還是想後放棄保存查詢,做到這一點?

If QueryExists(cstrQueryName) Then 
    DoCmd.DeleteObject acQuery, cstrQueryName 
End If 

這是上面的代碼輔助功能......

Public Function QueryExists(ByVal pName As String) As Boolean 
    Dim db As DAO.Database 
    Dim qdf As DAO.QueryDef 
    Dim blnReturn As Boolean 
    Dim strMsg As String 

On Error GoTo ErrorHandler 

    blnReturn = False ' make it explicit 
    Set db = CurrentDb 
    Set qdf = db.QueryDefs(pName) 
    blnReturn = True 

ExitHere: 
    Set qdf = Nothing 
    Set db = Nothing 
    QueryExists = blnReturn 
    Exit Function 

ErrorHandler: 
    Select Case Err.Number 
    Case 3265 ' Item not found in this collection. 
    Case Else 
     strMsg = "Error " & Err.Number & " (" & Err.Description _ 
      & ") in procedure QueryExists" 
     MsgBox strMsg 
    End Select 
    GoTo ExitHere 

End Function