台灣最大程式設計社群網站
線上人數
6264
 
會員總數:246136
討論主題:189720
歡迎您免費加入會員
討論區列表 >> ACCESS >> 內有程式碼,麻煩各位高手。Me.Form.Filter 的多條件查詢
[]  
[我要回覆]
1
回應主題 加入我的關注話題 檢舉此篇討論 將提問者加入個人黑名單
內有程式碼,麻煩各位高手。Me.Form.Filter 的多條件查詢
價值 : 100 QP  點閱數:678 回應數:11
樓主

show73
門外漢
0 1
55 5
發送站內信

各位大神好!小弟剛學access不久,目前遇到了一個問題想不通。
這是小弟用目前所學寫出來的程式碼,程式碼可以正常運行,只是現在遇到的問題就是...
每當多一個判斷,程式碼就要倍數成長,有爬了許多文章跟看了一些書籍...
有看到相關的,但是試來試去還是弄不好。麻煩各位大神提點提點,以下程式碼有沒有更好的方式。


Private Sub 查詢_Click()

Dim 查詢是否空白
查詢是否空白 = Array("選門市", "選人員", "選日期", "選生日禮")

Dim j As Integer
Dim i As Integer

For j = 0 To 3

Select Case 查詢是否空白(j)

Case 查詢是否空白(0)
If Nz(Me![選門市]) = "" Or IsNull(Me![選門市]) Then
i = i + 1
Else
a = a + 1
End If

Case 查詢是否空白(1)
If Nz(Me![選人員]) = "" Or IsNull(Me![選人員]) Then
i = i + 1
Else
b = b + 1
End If

Case 查詢是否空白(2)
If Nz(Me![開始日期]) = "" Or IsNull(Me![開始日期]) Then
i = i + 1
Else
c = c + 1
End If

Case 查詢是否空白(3)
If Nz(Me![選生日禮]) = False Then
i = i + 1
Else
d = d + 1
End If

End Select

Next
If i = 4 Then
警告 "沒輸入任何資料無法查詢", ""
Exit Sub
End If

If a = 1 Then '1
If b = 1 Then
If c = 1 Then
If d = 1 Then
'1234
Me.Form.Filter = "[辦卡門市] = '" & [選門市] & "' " & " and [辦卡人員] = '" & [選人員] & "' " & " and [辦卡日期] >= #" & 開始日期 & "# and [辦卡日期] <= # " & 結束日期 & "# " & " and CBool([生日禮]) = '" & [選生日禮] & "' "
Else
'123
Me.Form.Filter = "[辦卡門市] = '" & [選門市] & "' " & " and [辦卡人員] = '" & [選人員] & "' " & " and [辦卡日期] >= #" & 開始日期 & "# and [辦卡日期] <= # " & 結束日期 & "# "
End If
Else
If d = 1 Then
'124
Me.Form.Filter = "[辦卡門市] = '" & [選門市] & "' " & " and [辦卡人員] = '" & [選人員] & "' " & " and CBool([生日禮]) = '" & [選生日禮] & "' "
Else
'12
Me.Form.Filter = "[辦卡門市] = '" & [選門市] & "' " & " and [辦卡人員] = '" & [選人員] & "' "
End If
End If
Else
If c = 1 Then
If d = 1 Then
'134
Me.Form.Filter = "[辦卡門市] = '" & [選門市] & "' " & " and [辦卡日期] >= #" & 開始日期 & "# and [辦卡日期] <= # " & 結束日期 & "# " & " and CBool([生日禮]) = '" & [選生日禮] & "' "
Else
'13
Me.Form.Filter = "[辦卡門市] = '" & [選門市] & "' " & " and [辦卡日期] >= #" & 開始日期 & "# and [辦卡日期] <= # " & 結束日期 & "# "
End If
Else
If d = 1 Then
'14
Me.Form.Filter = "[辦卡門市] = '" & [選門市] & "' " & " and CBool([生日禮]) = '" & [選生日禮] & "' "
Else
'1
Me.Form.Filter = "[辦卡門市] = '" & [選門市] & "' "
End If
End If
End If
Else
If b = 1 Then
If c = 1 Then
If d = 1 Then
'234
Me.Form.Filter = "[辦卡人員] = '" & [選人員] & "' " & " and [辦卡日期] >= #" & 開始日期 & "# and [辦卡日期] <= # " & 結束日期 & "# " & " and CBool([生日禮]) = '" & [選生日禮] & "' "
Else
'23
Me.Form.Filter = "[辦卡人員] = '" & [選人員] & "' " & " and[辦卡日期] >= #" & 開始日期 & "# and [辦卡日期] <= # " & 結束日期 & "# " & ""
End If
Else
If d = 1 Then
'24
Me.Form.Filter = "[辦卡人員] = '" & [選人員] & "' " & " andCBool([生日禮]) = '" & [選生日禮] & "' "
Else
'2
Me.Form.Filter = "[辦卡人員] = '" & [選人員] & "' "
End If
End If
Else
If c = 1 Then
If d = 1 Then
'34
Me.Form.Filter = " [辦卡日期] >= #" & 開始日期 & "# and [辦卡日期] <= # " & 結束日期 & "# " & " and CBool([生日禮]) = '" & [選生日禮] & "' "
Else
'3
Me.Form.Filter = " [辦卡日期] >= #" & 開始日期 & "# and [辦卡日期] <= # " & 結束日期 & "# "
End If
Else
If d = 1 Then
'4
Me.Form.Filter = " CBool([生日禮]) = '" & [選生日禮] & "' "
Else
Exit Sub
End If
End If
End If
End If
Me.Form.FilterOn = True
Me.Requery
門市筆數.ControlSource = "=Count([辦卡人員])"

End Sub





搜尋相關Tags的文章: [ Me.Form.Filter ] , [ 查詢 ] , [ Me.Form.FilterOn ] , [ Me.Requery ] ,
本篇文章發表於2019-06-22 15:45
1樓
回應

roar
檢舉此回應
i think 4D array may help,it can't reduce the code line, but it looks clear
dim array(1,1,1,1) as integer
every dimension 0 means null , 1 means has value
If Nz(Me![選門市]) = "" Or IsNull(Me![選門市]) Then
a = 0
Else
a = 1 'means has value
End If
Repeat 3 times to get b ,c ,d ----- a,b,c,d all is 0 or 1
and array(a,b,c,d) has 16 conditions
for example
case(0,0,0,0) means choose nothing
msgbox("Nothing select")
case(1,0,0,0) means choose [選門市] only
Me.Form.Filter = "[辦卡門市] = '" & [選門市] & "' "
so
Select Case array(a,b,c,d)
Case Is (0,0,0,0)
MsgBox "Nothing select"
Case is (1,0,0,0)
Me.Form.Filter = "[辦卡門市] = '" & [選門市] & "' "
Case is (0,1,0,0) 'only "選人員" has value
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;
;
;
end select
本篇文章回覆於2019-06-22 16:43
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
2樓
作者回應

show73
檢舉此回應
感謝回復..剛剛理解了一下發現似乎好像是一樣的方法,程式編寫不一樣!!再麻煩大神們再提點提點 謝謝
本篇文章回覆於2019-06-22 16:59
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
3樓
回應

roar
檢舉此回應
can you post your file,and let all test.
本篇文章回覆於2019-06-22 17:38
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
4樓
作者回應

show73
檢舉此回應
There is no problem with the running of the program. The problem now is that I hope that it will be simplified.
Because at present there is only one more condition, the code will be doubled...
本篇文章回覆於2019-06-22 17:42
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
5樓
作者回應

show73
檢舉此回應
I have thought of a way.. but I don't know how to write this code..
The concept is like this
First judge whether there is no data in all the fields to be queried.
If there is information, transfer the data to Me.Form.Filter
For example, a b has the information Me.Form.Filter will filter a b or a c have data or b have information
It’s just that I use the array to write down. I found that when there is no data, it will go wrong.

我有想了一個辦法..但是不知道如何寫這個程式碼..
        概念是這樣的
        先判斷要查詢的所有欄位有沒資料
        如果有資料就把資料傳到Me.Form.Filter
        例如a b有資料Me.Form.Filter就會篩選a b或a c有資料或b有資料
        只是我用陣列下去寫..發現當有一個沒資料的時候就會出錯了
本篇文章回覆於2019-06-22 17:47
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
6樓
作者回應

show73
檢舉此回應
這是我想到的一個辦法!但是只要有一個條件是空白那麼程式就會錯誤...
不然就是只能個別查詢
Private Sub 查詢_Click()

Dim 查詢是否空白
查詢是否空白 = Array("選門市", "選人員", "選日期", "選生日禮")

Dim j As Integer
Dim i As Integer

For j = 0 To 3

Select Case 查詢是否空白(j)

Case 查詢是否空白(0)
If Nz(Me![選門市]) = "" Or IsNull(Me![選門市]) Then
i = i + 1
Else
空間1 = "[辦卡門市] = '" & [選門市] & "' "
空間 = 空間1
End If

Case 查詢是否空白(1)
If Nz(Me![選人員]) = "" Or IsNull(Me![選人員]) Then
i = i + 1
Else
空間2 = "[辦卡人員] = '" & [選人員] & "' "
空間 = 空間1 & "and" & 空間2
End If

Case 查詢是否空白(2)
If Nz(Me![開始日期]) = "" Or IsNull(Me![開始日期]) Then
i = i + 1
Else
空間3 = "[辦卡日期] >= #" & 開始日期 & "# and [辦卡日期] <= # " & 結束日期 & "# "
空間 = 空間1 & "and" & 空間2 & "and" & 空間3
End If

Case 查詢是否空白(3)
If Nz(Me![選生日禮]) = False Then
i = i + 1
Else
空間4 = "CBool([生日禮]) = '" & [選生日禮] & "' "
空間 = 空間1 & "and" & 空間2 & "and" & 空間3 & "and" & 空間4
End If

End Select

Next

If i = 4 Then
警告 "沒輸入任何資料無法查詢", ""
Exit Sub
End If

Me.Form.Filter = 空間
Me.Form.FilterOn = True
Me.Requery
end sub
本篇文章回覆於2019-06-22 17:53
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
7樓
回應

P陳
檢舉此回應
有一個建議 變數名稱請取有意義的
比如 空間4是什麼 ?

當J=0 時會比對二次 J=1 也會比對二次
Select Case 查詢是否空白(j)
Case 查詢是否空白(0)

所以共會比對 16次
本篇文章回覆於2019-06-22 23:32
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
8樓
回應

roar
檢舉此回應
一般來說查詢是分階段的,你的查詢是一次就將4個條件查詢完畢嗎?
如果資料量少的話,可能查到的會很少或是沒有。
如先將太平門市的資料先查完後,羅列所有符合的資料
再依辦卡人員小柯的資料再篩選一次
再依辦卡日期範圍再篩一次
最後依生日禮查出共有多少筆。
本篇文章回覆於2019-06-23 09:21
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
9樓
回應

roar
檢舉此回應
我想到一個方法可以解決,就是設定其查詢的sql,在按commandbutton前所有的條件都已經確定,
將條件如果超過1個使用 and連結,就可得唯一的查詢條件。放在DoAll表單內
以下是參考用檔案
https://drive.google.com/open?id=1oAYbnWqNZ7v2WwP3q5WOsYgtEiso3Z7o

本篇文章回覆於2019-06-24 13:19
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
10樓
回應

roar
檢舉此回應
列35要補上i=i+1
本篇文章回覆於2019-06-24 13:24
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
11樓
作者回應

show73
檢舉此回應
感謝 目前問題已經解決 謝謝
本篇文章回覆於2019-06-26 18:58
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
   
1

回覆
如要回應,請先登入.