2014-01-23 77 views
0

我有一個搜索表單,其中包含與表,四個條件搜索框以及從搜索框中獲取輸入,搜索表和填充在窗體的空白字段上的結果。具有多條件搜索的表單 - 使用字符串和過濾器

截至目前,只要所有四個標準框不爲空,它就會工作。
我用過濾器來實現這一點,只要所有四個盒子都不是空的,這裏就是代碼。 (我的標準框如下:名爲「Keyword」的文本框和名爲HRCombo,BuildingCombo和RoomCombo的三個組合框,它們綁定的字段如下:「項目描述」「HR Holder」「Building」「房間「)我的第一行」Me.Filter = ...「被分解以便於查看。

Me.Filter = "[Item Description] Like " & Chr(34) & Me.Keyword & "*" & Chr(34) & " 
AND [HR Holder] = '" & Me.HRCombo & "'" & " AND [Building] = '" & Me.BuildingCombo 
& "'" & " AND [Room] = '" & Me.RoomCombo & "'" 
Me.FilterOn = True 
Me.Requery 

我需要它能夠執行搜索,無論標準框有哪些輸入組合。有人建議使用if語句來執行以下操作: 創建四個字符串,每個標準框一個。使用4 if語句來檢查框是否爲空 - 如果爲空,則爲其字符串分配一個星號,如果它不爲空,則將用於上述Me.Filter語句的值分配給每個框的字符串。然後,使用Me.Filter並在最後連接四個字符串。

下面是我用於此的代碼,並且,由於我的知識有限,我無法使其工作。

Dim StrA as String, StrB as String, StrC as String, StrD as String 

If Me.Keyword is null then 
StrA = "*" 
else 
StrA = [Item Description] Like " & Chr(34) & Me.Keyword & "*" & Chr(34) 
End If 

If Me.HRCombo is null then 
StrB = "*" 
else 
StrB = [HR Holder] = '" & Me.HRCombo & "'" 
End If 

If Me.BuildingCombo is null then 
StrC = "*" 
else 
StrC = [Building] = '" & Me.BuildingCombo & "'" 
End If 

If Me.RoomCombo is null then 
StrD = "*" 
else 
StrD = [Room] = '" & Me.RoomCombo & "'" 
End If 

Me.Filter = "StrA & " AND "StrB & " AND "StrC &" AND "StrD" 
Me.FilterOn = True 
Me.Requery 

就像我說的,我的知識有限,所以我確信可能缺少引號和逗號,或者其中有太多。有任何想法嗎?

回答

1

您錯過了一些重要的引號,您的邏輯檢查null對於SQL是正確的,但對於VBA不正確。我在這裏張貼我認爲這是一個更乾淨的方式。請注意,你不是逃避可能在你的控件中輸入的單引號,我也不是在這個代碼中(除了第一個,你可以看到如何使用替換功能)。這是一個非常重要的事情,任何時候單引號都可能出現在搜索/過濾控件之一中。

Dim strWhere as String 

If Nz(Me.Keyword, "") <> "" Then 
    strWhere = strWhere & "[Item Description] Like '*" & Replace(Me.Keyword, "'", "''") & "*' AND " 
End If 

If Nz(Me.HRCombo, "") <> "" Then 
    strWhere = strWhere & "[HR Holder] = '" & Me.HRCombo & "' AND " 
End If 

If Nz(Me.BuildingCombo, "") <> "" Then 
    strWhere = strWhere & "[Building] = '" & Me.BuildingCombo & "' AND " 
End If 

If Nz(Me.RoomCombo, "") <> "" Then 
    strWhere = strWhere & "[Room] = '" & Me.RoomCombo & "' AND " 
End If 

If strWhere <> "" Then 
    strWhere = Left(strWhere, Len(strWhere)-5) 'Remove the extra AND 
    Me.Filter = strWhere 
    Me.FilterOn = True 
Else 
    Me.Filter = "" 
    Me.FilterOn = False 
End If 
+0

太棒了!謝謝你的幫助! – user3229229

+0

另一個問題......在第一個strWhere語句的末尾有一個星號......我最初用它來告訴在字段中查找具有用戶鍵入關鍵字的任何內容,但它只顯示關鍵字是該領域的第一個詞。它之前也是這樣做的。所以我的問題是如何在開始時添加一個星號,以便訪問將查找任何包含關鍵字的字段。基本上,如果它處於查詢模式,它將...像*關鍵字&*我無法弄清楚如何以正確的方式得到它......抨擊引號和雙引號:) – user3229229

+0

我已添加星號開頭,所以你可以看到它的外觀。 – HK1

相關問題