2016-05-24 92 views
0

我需要大量的數據從Access數據庫中篩選。我正在構建一個程序來完成此任務,但遇到了在過濾器中使用多個條件的問題。例如,下面是使用特定的月份和顏色供選擇的測試代碼:過濾一個數據集與多個條件

If RadioButton1.Checked Then 
    If RadioButton4.Checked Then 
     Me.BindingSource.Filter = "[January] = 'True' AND [Red] = 'True'" 
    ElseIf RadioButton5.Checked Then 
     Me.BindingSource.Filter = "[January] = 'True' AND [Yellow] = 'True'" 
    ElseIf RadioButton6.Checked Then 
     Me.BindingSource.Filter = "[January] = 'True' AND [Blue] = 'True'" 
    Else Me.BindingSource.Filter = "[January] = 'True'" 
    End If 
ElseIf RadioButton2.Checked Then 
    If RadioButton4.Checked Then 
     Me.BindingSource.Filter = "[February] = 'True' AND [Red] = 'True'" 
    ElseIf RadioButton5.Checked Then 
     Me.BindingSource.Filter = "[February] = 'True' AND [Yellow] = 'True'" 
    ElseIf RadioButton6.Checked Then 
     Me.BindingSource.Filter = "[February] = 'True' AND [Blue] = 'True'" 
    Else Me.BindingSource.Filter = "[February] = 'True'" 
    End If 
ElseIf RadioButton3.Checked Then 
    If RadioButton4.Checked Then 
     Me.BindingSource.Filter = "[March] = 'True' AND [Red] = 'True'" 
    ElseIf RadioButton5.Checked Then 
     Me.BindingSource.Filter = "[March] = 'True' AND [Yellow] = 'True'" 
    ElseIf RadioButton6.Checked Then 
     Me.BindingSource.Filter = "[March] = 'True' AND [Blue] = 'True'" 
    Else Me.BindingSource.Filter = "[March] = 'True'" 
    End If 
End If 

現在,這是連三個月,色彩大量的代碼。必須有更好的方法來做到這一點,對吧?有了表格中的很多字段,我需要對其進行排序,這需要花費我幾年時間才能完成。

+2

如果你有12分佈爾列了好幾個月,而不是一個字符串列,我會重溫數據庫設計。相同的一堆顏色。 – Plutonix

+0

其原因是,項目可以有多個月,多色彩等 – MoNoGoAt

+1

這僅僅是一個不同的設計缺陷:你錯過了一個1:M的關係。它不需要12列來描述一個屬性。 – Plutonix

回答

0

您需要從顏色的按鈕打出月份按鈕,沿着線:

Dim wc as string 
'months 
    if RadioButto1.Checked then wc = "January = true" 
elseif radiobutton2.checked then wc = "February = true" 
. . . . 

end if 
'colours 
If radiobutton4.checked then 
wc &= " AND Red = true" 
elseif radiobutton5.checked then 
wc &= " AND Yellow = true" 
. . . . . 
end if 


me.bindingsource.filter = wc 
+0

好吧,我試圖在過濾器命令中使用變量,但我的語法必須是錯誤,因爲它只是甩了我,我會配合你的語法,看看會發生什麼。 – MoNoGoAt

+0

這是工作很好,只需要添加一個添加如果組的情況下,其中顏色,但不是月份被選中。一旦完成一些功能,我可以擴展代碼來覆蓋整個數據庫。萬分感謝! – MoNoGoAt

0

對於代碼這個簡單,你可以使用switch語句:

Dim sMonth As String 
Dim sColor As String 

sMonth = Switch(RadioButton1.Checked, "[January]", RadioButton2.Checked, "[February]", RadioButton3.Checked, "[March]") 
sColor = Switch(RadioButton4.Checked, "[Red]", RadioButton5.Checked, "[Yellow]", RadioButton6.Checked, "[Blue]") 

Me.BindingSource.Filter = sMonth & " = 'True' AND " & sColor & " = 'True'" 

這仍然是可讀的。你也可以使用Select Case語句,訣竅是將它分成兩部分。

+0

VB.NET沒有'Switch'功能。我認爲MSAccess標記僅僅意味着OP使用訪問作爲數據存儲庫。 – Plutonix

+0

或者OP錯誤地標記了他的問題。原始代碼是有效的VBA。 – kismert

+0

對不起,我爲它標記了ms-access,因爲它使用的是訪問數據庫而不是sql或其他東西。 – MoNoGoAt