2015-06-03 27 views
1

我繼承了離開的那個人的數據庫,並且一直試圖運行維護並根據需要添加功能。我應該說,當我三週前盯着這份工作時,我完全沒有編碼經驗,但是已經在這裏和那裏找到了一些東西。對問題:SearchFilters和代碼執行:從一個noob

主窗體有一個嵌套在那裏的表,並且過濾器基本上設置過濾出來並與表中的數據一起玩。我會嘗試在imugr上添加圖片並添加鏈接(編輯:http://imgur.com/nHUsCdX

左側有許多過濾器和搜索框。這包括:

  1. 的文本搜索框(通過A欄搜索)

  2. 日期搜索框

  3. 組過濾器 - 搜索組列,並且基於選擇的值過濾掉。

  4. 趨勢 - 基本填滿日期搜索框(2)的過濾器,具有預設收入季度日期。

  5. 區域過濾器 - 與組過濾器(3)的工作方式相同,除了在區域列中搜索。

以下幾行代碼或多或少地控制着這些過濾器和搜索框,我將整個發佈它。

Private Sub frmFieldPresets_AfterUpdate() 

Dim fieldPreset As String 
Select Case Me.frmFieldPresets 

    Case 1 
     fieldPreset = "Audit" 
     DoCmd.OpenForm "frm_Fields" 
     Call Forms.frm_Fields.cmd_De_SelectAllFields_Click 
     Forms.frm_Fields.chk_EN.Value = True 
     Forms.frm_Fields.chk_BLI.Value = True 
     Forms.frm_Fields.chk_AN.Value = True 
     Forms.frm_Fields.chk_EDD.Value = True 
     Forms.frm_Fields.chk_GIIC.Value = True 
     Forms.frm_Fields.chk_NILGIC.Value = True 
     Forms.frm_Fields.chk_RDTTO.Value = True 
     Forms.frm_Fields.chk_ESB.Value = True 
     Call Forms.frm_Fields.refreshFields 
     DoCmd.Close acForm, "frm_Fields" 

    Case 2 
     fieldPreset = "CMRM" 
     DoCmd.OpenForm "frm_Fields" 
     Call Forms.frm_Fields.cmd_De_SelectAllFields_Click 
     Forms.frm_Fields.chk_BLI.Value = True 
     Forms.frm_Fields.chk_AN.Value = True 
     Forms.frm_Fields.chk_OID.Value = True 
     Forms.frm_Fields.chk_EN.Value = True 
     Forms.frm_Fields.chk_GIIC.Value = True 
     Forms.frm_Fields.chk_NILGIC.Value = True 
     Forms.frm_Fields.chk_RDTTO.Value = True 
     Forms.frm_Fields.chk_EDD.Value = True 
     Call Forms.frm_Fields.refreshFields 
     DoCmd.Close acForm, "frm_Fields" 

    Case 3 
     fieldPreset = "Finance" 
     DoCmd.OpenForm "frm_Fields" 
     Call Forms.frm_Fields.cmd_De_SelectAllFields_Click 
     Forms.frm_Fields.chk_EN.Value = True 
     Forms.frm_Fields.chk_RDTTO.Value = True 
     Forms.frm_Fields.chk_BLI.Value = True 
     Forms.frm_Fields.chk_GIIC.Value = True 
     Forms.frm_Fields.chk_NILGIC.Value = True 
     Call Forms.frm_Fields.refreshFields 
     DoCmd.Close acForm, "frm_Fields" 

    Case 4 
     fieldPreset = "TBM" 
     DoCmd.OpenForm "frm_Fields" 
     Call Forms.frm_Fields.cmd_De_SelectAllFields_Click 
     Forms.frm_Fields.chk_EN.Value = True 
     Forms.frm_Fields.chk_BLI.Value = True 
     Forms.frm_Fields.chk_AN.Value = True 
     Forms.frm_Fields.chk_RDTTO.Value = True 
     Forms.frm_Fields.chk_GIIC.Value = True 
     Forms.frm_Fields.chk_NILGIC.Value = True 
     Forms.frm_Fields.chk_EDD.Value = True 
     Call Forms.frm_Fields.refreshFields 
     DoCmd.Close acForm, "frm_Fields" 

     Exit Sub 
End Select 

End Sub 

Private Sub frmRegions_AfterUpdate() 
Call refresh_Filters 
End Sub 


Private Function regionselection() 
Select Case Me.frmRegions 

    Case 1 
     regionselection = "Canada" 

    Case 2 
     regionselection = "USA" 

    Case 3 
     regionselection = "Singapore" 

    Case 4 
     regionselection = "Europe & Asia Pacific" 

    Case 5 
     regionselection = "Global" 

End Select 

End Function 

Private Sub frmTrendingQuarters_AfterUpdate() 


Dim fieldPreset As String 
Select Case Me.frmTrendingQuarters 

    Case 1 
     txtDate1.Value = "11/1/2014" 
     txtDate2.Value = "1/31/2015" 
     fieldPreset = "Q1" 

    Case 2 
     txtDate1.Value = "2/1/2015" 
     txtDate2.Value = "4/30/2015" 
     fieldPreset = "Q2" 

    Case 3 
     txtDate1.Value = "5/1/2015" 
     txtDate2.Value = "7/31/2015" 
     fieldPreset = "Q3" 

    Case 4 
     txtDate1.Value = "8/1/2015" 
     txtDate2.Value = "10/30/2015" 
     fieldPreset = "Q4" 

     Exit Sub 
End Select 

DoCmd.OpenForm "frm_Fields" 
Call Forms.frm_Fields.cmd_De_SelectAllFields_Click 
Forms.frm_Fields.chk_OID.Value = True 
Forms.frm_Fields.chk_EN.Value = True 
Forms.frm_Fields.chk_FWCO.Value = True 
Forms.frm_Fields.chk_Reg.Value = True 
Forms.frm_Fields.chk_RC.Value = True 
Forms.frm_Fields.chk_Rem1.Value = True 
Forms.frm_Fields.chk_Rem2.Value = True 
Forms.frm_Fields.chk_RDTTO.Value = True 
Call Forms.frm_Fields.refreshFields 
DoCmd.Close acForm, "frm_Fields" 

Call refresh_Filters 


End Sub 

Private Sub txtDate1_AfterUpdate() 
Call refresh_Filters 
End Sub 

Private Sub txtDate2_AfterUpdate() 
Call refresh_Filters 
End Sub 

Private Sub txtSearch_AfterUpdate() 
Call refresh_Filters 
End Sub 


Private Sub refresh_Filters() 


Dim searchFilter, dateFilter, allFilter As String 
Dim searchString, date1String, date2String As String 

Me.Refresh 

If IsNull(Me.txtSearch) Then 
    searchString = "*" 
Else 
    searchString = Me.txtSearch 
End If 


If IsNull(Me.txtDate1) Then 
    date1String = "1/1/2000" 
Else 
    date1String = Me.txtDate1 
End If 


If IsNull(Me.txtDate2) Then 
    date2String = "1/1/2020" 
Else 
    date2String = Me.txtDate2 
End If 


searchFilter = "(" & "[Event Name] Like '*" & searchString & "*'" & ")" 
regionFilter = "(" & "[Region] Like '*" & regionselection & "*'" & ")" 
dateFilter = "(" & "[OpERA Create Date] Between " & "#" & date1String & "#" & " AND " & "#" & date2String & "#" & ")" 
allFilter = searchFilter & " And " & dateFilter & " And " & regionFilter 

    Me.frm_ORE_All.Form.Filter = allFilter 
    Me.frm_ORE_All.Form.FilterOn = True 

End Sub 

現在我需要幫助的部分是最後幾行代碼。在某些時候,我被告知textSearch的參數(僅在一列中查看)需要擴展以包含其他列。因此,搜索將擴大以查看更多列。所以我改變了searchFilter的代碼,並添加了更多的列。

這是最新的代碼,最後幾行。

'searchFilter = "(" & "[Event Name] Like '*" & searchString & "*'" & ")" 
searchFilter = "(" & "[Event Name] Like '*" & searchString & "*'" & ") OR (" & "[Event Submitted By] Like '*" & searchString & "*'" & ") OR (" & "[Organizational Business Unit] Like '*" & searchString & "*'" & ") OR (" & "[Business Line Impacted] Like '*" & searchString & "*'" & ") OR (" & "[Attester Name] Like '*" & searchString & "*'" & ") OR (" & "[Comments] Like '*" & searchString & "*'" & ") OR (" & "[Function Where Cause Occurred] Like '*" & searchString & "*'" & ") OR (" & "[Root Cause] Like '*" & searchString & "*'" & ") OR (" & "[Remedy 1] Like '*" & searchString & "*'" & ") OR (" & "[Remedy 2] Like '*" & searchString & "*'" & ")" 
regionFilter = "(" & "[Region] Like '*" & regionselection & "*'" & ")" 
dateFilter = "(" & "[OpERA Create Date] Between " & "#" & date1String & "#" & " AND " & "#" & date2String & "#" & ")" 
allFilter = searchFilter & " And " & dateFilter & " And " & regionFilter 


    Me.frm_ORE_All.Form.Filter = allFilter 
    Me.frm_ORE_All.Form.FilterOn = True 

End Sub 

一旦我插入這一新的searchFilter代碼行,並停用原來的代碼,它就完美了。除其他過濾器因任何原因停止工作外。所以雖然GroupFilters仍然有效,但Trending和RegionFilter完全停止工作。

如果我切換回原來的代碼行,並停止使用新代碼,則所有事情都會再次正常工作(除了textboxsearch只返回搜索一列的事實)。

我敢肯定,這只是我的代碼效率低下,或明顯的事情,當我不知道的時候你會發現。有小費嗎?

回答

0

這是關於話務員優先級以及計算機如何組合您的各種OrAnd語句。嘗試將新的searchFilter放在一組括號內。所以, searchFilter = "((" & "[Event Name] ... [Remedy 2] Like '*" & searchString & "*'" & "))"

這將確保你的新的測試得到的待遇作爲一個單元與單元然後加入到使用And運營商的其他測試的結果。

+0

This Works!謝謝! 解決。已驗證解 – echelon99

0

表單上的過濾器基本上是SQL語句的WHERE子句。

問題是您的搜索字符串SQL中缺少圓括號。

您正在運行的代碼是這樣的:

Filter = ([Event Name] Like '*SEARCH*') 
     OR ([Event Submitted By] Like '*SEARCH*') 
     OR ([Organizational Business Unit] Like '*SEARCH*') 
     OR ([Business Line Impacted] Like '*SEARCH*') 

     ... 

     OR ([Remedy 2] Like '*SEARCH*') 

     AND ([Region] Like '*REGIONSEARCH*') 
     AND ([OpERA Create Date] Between #DATE1# AND #DATE2#) 

你打算做什麼都的「OR」語句決定在一起,然後也有和聲明,但什麼代碼實際上做是這樣的:

Filter = ([Event Name] Like '*SEARCH*') 
     OR ([Event Submitted By] Like '*SEARCH*') 
     OR ([Organizational Business Unit] Like '*SEARCH*') 
     OR ([Business Line Impacted] Like '*SEARCH*') 

     ... 

     OR **(** ([Remedy 2] Like '*SEARCH*') 

     AND ([Region] Like '*REGIONSEARCH*') 
     AND ([OpERA Create Date] Between #DATE1# AND #DATE2#) **)** 

添加括號來搜索字符串以獲得適當的過濾器:

Filter = **(** ([Event Name] Like '*SEARCH*') 
     OR ([Event Submitted By] Like '*SEARCH*') 
     OR ([Organizational Business Unit] Like '*SEARCH*') 
     OR ([Business Line Impacted] Like '*SEARCH*') 

     ... 

     OR ([Remedy 2] Like '*SEARCH*') **)** 

     AND ([Region] Like '*REGIONSEARCH*') 
     AND ([OpERA Create Date] Between #DATE1# AND #DATE2#) 

將搜索條款括在括號內,這應該可以解決問題。