2011-06-17 40 views
3

我在做一個搜索表單。最重要的是,有幾個組合框供用戶選擇一個標準組合。然後我構造一個Where字符串來篩選顯示結果的子表單。表單加載和過濾器問題

Me.sub.SourceObject = "subResultType_1" 
Me.sub.Form.Filter = strWhere 
Me.sub.Form.FilterOn = True 

此代碼位於「搜索」按鈕的單擊事件中。

問題是,當執行Me.sub.SourceObject = "subResultType_1"時,子窗體將顯示所有記錄。然後它被過濾。但是我想要的是子窗體在被過濾之前什麼都不顯示。這是因爲我的程序將在相當慢的網絡上用作前端/後端。 PS:我認爲當WHERE部分的SQL子句或帶有過濾器的表單過濾時,它會在後端被過濾。所以只有少量的數據會在網絡上傳輸到前端。如果我錯了,告訴我...

回答

3

另一種方法是我經常使用的一種方法,即使用記錄源保存子窗體,從而生成一個空白的不可編輯記錄。我通常使用的SQL是這樣的:

SELECT TOP 1 Null As Field1, Null As Field2, 0 As Field3 
    FROM MyTable; 

這顯示與空值的某些字段,0爲別人一個空白記錄(如適用)。我覺得它在美觀方面比替代品更有吸引力。

當我準備好顯示篩選集時,我更改記錄源而不是設置篩選器。

+0

我現在所做的最像你的解決方案:我向子表單添加了一個「空白」過濾器:id ='',而不是空白記錄源。 – darkjh 2011-06-20 07:23:55

+0

與我的不同之處在於你的回報沒有行,而我的回報是在不可編輯的空行上。我認爲最好是顯示行,因爲它可以幫助用戶瞭解他們在執行搜索時看到的內容,而空行不會(也不會顯示空子表單控件,這就是爲什麼我不使用它方法)。 – 2011-06-20 18:55:38

+0

另一個問題是,當我這樣做時,設置一個'空白'過濾器或記錄源,下次我使用這個表單時,它會記住上次的過濾器,而不是空白的過濾器......如何防止它記住它? – darkjh 2011-06-21 06:59:19

2

如果您希望強制用戶在顯示任何結果之前過濾窗體,請不要將子窗體綁定到查詢(將窗體的RecordSource留空)並執行它的代碼,而不是:你可以簡單的設置,在您的搜索按鈕單擊事件:

Me.Sub.RecordSource = "subResultType_1" 

一些好的是,使子窗體不可見(設置在設計模式下其Visible = No屬性),並顯示它一旦用戶點擊搜索:

Private Sub btSearch_Click() 
    Me.Sub.RecordSource = "subResultType_1" 
    Me.Sub.Visible = True 
End Sub 

如果您想要做更多複雜的過濾器,你也可以這樣做:

Private Sub btSearch_Click() 
    Me.Sub.RecordSource = "SELECT * FROM subResultType_1 WHERE " + strWhere 
    Me.Sub.Visible = True 
End Sub 

像這樣將允許你構建複雜的代碼WHERE查詢基於來自用戶的一串輸入。
例如,您可以有多個文本框,用戶可以輸入相對於特定字段的信息來縮小搜索範圍。

然後,從這些文本框的內容構建WHERE子句,像這樣:

變成這樣,一旦用戶輸入一些過濾條件:

+0

如果事情很慢,您甚至不必將窗體加載到子窗體控件中,直到需要爲止。 – Fionnuala 2011-06-17 10:25:24

+0

謝謝..我喜歡你的主題。你做的名單是一個連續的形式嗎? – darkjh 2011-06-20 06:22:34

+0

@darkjh:謝謝。主要形式是帶有標題的單個表單。數據以數據表的形式顯示。我使用的是Access 2010,所以主題很不錯。 – 2011-06-20 07:02:48

0

我想你在那裏回答了你自己的問題。 where子句將過濾SQL服務器上的查詢。

Access SQL: WHERE clause

+0

我的後端也是一個accdb文件..所以我徘徊在查詢被過濾的地方。但似乎我認爲是正確的。 – darkjh 2011-06-20 07:21:56

+0

如果後端是ACCDB/MDB,則過濾發生在本地工作站上,因爲在另一端沒有服務器。儘管如此,這並不意味着它很慢或效率低下 - 緩存對於加快速度可能會做很多事情。 – 2011-06-23 01:42:06

2

你說:「我的程序將被用作前/後端相當緩慢的網絡上」。

什麼是您的後端存儲數據庫?它是一個Access(Jet/ACE)數據庫文件嗎?

如果是的話,您應該知道,網絡訪問數據庫實際上只適用於快速,可靠的硬連線局域網。如果以下任何一種情況屬實,則應將數據存儲更改爲Access以外的其他內容。

  1. 廣域網(WAN)
  2. 無線網絡連接
  3. 有線連接不可靠的局域網(LAN)

共同危險在這些情況下是被丟棄的連接可以損壞您的Access數據庫。它可能不會發生在每一個下降的連接,但最終你損壞你的Access數據庫。

+0

它是有線網絡。但這裏的工廠沒有服務員。所有的網絡都位於300千米外的總部...... – darkjh 2011-06-20 06:18:41

+1

@darkjh聽起來像一個廣域網,這不適合訪問。但是如果將數據存儲移動到客戶端 - 服務器數據庫並將錶鏈接更改爲ODBC到服務器,則Access應用程序可以正常工作。如果您的組織不允許進行此更改,請確保您具有可靠的備份策略,以便在由於連接斷開而導致Access後端損壞時將數據丟失風險降至最低。 – HansUp 2011-06-20 06:32:57

+1

好吧,備份計劃,嗯..聽起來像是我會舉辦的另一個問題... – darkjh 2011-06-20 06:58:28