ปัญหาการทำ Multiple filter ด้วย Listbox หลายๆอันครับ ให้ Filter ตามเงื่อนไข


0 สมาชิก และ 1 บุคคลทั่วไป กำลังดูหัวข้อนี้

22 ต.ค. 63 , 14:58:36
อ่าน 1206 ครั้ง

Tatchawin

สวัสดีครับทุกท่าน ผมต้องการทำ Multiple filter ด้วย Listbox หลายๆอันครับ ให้ Filter ได้ตามเงื่อนไขที่เลือกเลย
โดยผมเขียนโค้ดตามด้านล่างนี้ แล้วลอง filter ดู จากภาพ
1. ที่ Field MonthNum ผมต้องการเลือก Record ของเดือน 9 (September)
2. ที่ Field WorkGroup ผมต้องการเลือก “งานอื่นๆ”

แต่ผลลัพท์คือ ไปเอา “งานอื่นๆ” ของเดือนอื่นมา ซึ่งผมต้องการของเดือน 9 เท่านั้น(ซึ่งผลลัพธ์ที่ถูกต้อง จะต้องไม่มีของเดือน 9 โผล่มา เพราะไม่มี”งานอื่นๆ” ในเดือน 9) ผมจะต้องเพิ่มเติม Code อย่างไรให้ Filter ทำงานทั้งสองตัวครับ

ขอบคุณล่วงหน้าครับผม


Private Sub lstMonthSort_AfterUpdate()
    Call Search1
End Sub
--------------------------------------------------------------------------------------------------------
Sub Search1()
Dim varItem As Variant
Dim strsearch As String
Dim Task As String

Me.FilterOn = True
For Each varItem In Me!lstMonthSort.ItemsSelected
    strsearch = strsearch & "," & Me!lstMonthSort.ItemData(varItem)
Next varItem
'MsgBox (strSearch)
    If Len(strsearch) = 0 Then
        Task = "SELECT * FROM qryPerday"
        Forms!frmManpower1!frmqryPerDay.Form.RecordSource = Task
    Else
        strsearch = Right(strsearch, Len(strsearch) - 1)
        'MsgBox (strSearch)
        Task = "SELECT * FROM qryPerDay WHERE ([MonthNum] in (" & strsearch & "))"
        Forms!frmManpower1!frmqryPerDay.Form.RecordSource = Task
    End If
End Sub
--------------------------------------------------------------------------------------------------------
Private Sub lstWorkGroup_AfterUpdate()
    Call Search2
End Sub
--------------------------------------------------------------------------------------------------------
Sub Search2()
Dim varItem As Variant
Dim strsearch As String
Dim Task As String

Me.FilterOn = True
For Each varItem In Me!lstWorkGroup.ItemsSelected
    strsearch = strsearch & "," & Me!lstWorkGroup.ItemData(varItem)
Next varItem
'MsgBox (strSearch)
    If Len(strsearch) = 0 Then
        Task = "SELECT * FROM qryPerday"
        Forms!frmManpower1!frmqryPerDay.Form.RecordSource = Task
    Else
        strsearch = Right(strsearch, Len(strsearch) - 1)
        'MsgBox (strSearch)
        Task = "SELECT * FROM qryPerDay WHERE ([WorkGroup] in (" & strsearch & "))"
        Forms!frmManpower1!frmqryPerDay.Form.RecordSource = Task
    End If
End Sub

 

22 ต.ค. 63 , 15:45:39
ตอบกลับ #1

PNR

ส่งFile และ เพิ่มข้อมูลเบื้องต้นในตาราง และฟอร์มนั้นมาครับ (ถ้าไม่ได้ส่วนตัวมาก)
เดี่ยวผมปรับโค้ดให้ใหม่ ดูแล้วโค้ดไม่ได้ยาวอะไรเลยครับ สั้นๆ เอง
Time to stop for me  :dizzy:
 
โพสต์นี้ได้รับคำขอบคุณจาก: Tatchawin

22 ต.ค. 63 , 15:48:47
ตอบกลับ #2

Tatchawin

ขอแนบไฟล์ส่งมาตามนี้นะครับผม ไหนๆก็ไหนๆแล้ว ผมอยากให้ Sort ได้ทั้ง lstYearSort, lstMonthSort, lstWorkGroup, lstDepartment และ lstSection

ยังไง ถ้าท่านแก้ให้ filter ได้หมดนี้ ก็ดีนะครับ อิอิ

ขอบคุณล่วงหน้าครับ :D
« แก้ไขครั้งสุดท้าย: 22 ต.ค. 63 , 15:59:06 โดย Tatchawin »

 

22 ต.ค. 63 , 16:35:50
ตอบกลับ #3

PNR

ครับพรุ่งนี้จัดให้ครับผม
วันนี้ผมเลิกงานแล้ว
Time to stop for me  :dizzy:
 
โพสต์นี้ได้รับคำขอบคุณจาก: Tatchawin

23 ต.ค. 63 , 12:53:50
ตอบกลับ #4

Tatchawin

Ok ครับ เดี๋ยวรอนะครับ อิอิ

 

24 ต.ค. 63 , 02:45:54
ตอบกลับ #5

PNR

ลองดูนะครับ
โค้ดแต่ละ listbox ผมจัดไว้เป็นชุดนะครับ
คงไม่ยาก ยังติดตรงส่วนไหนบอกได้
« แก้ไขครั้งสุดท้าย: 24 ต.ค. 63 , 03:16:29 โดย PNR »
Time to stop for me  :dizzy:
 
โพสต์นี้ได้รับคำขอบคุณจาก: Tatchawin

25 ต.ค. 63 , 09:45:32
ตอบกลับ #6

Tatchawin



ขอบคุณมากๆเลยครับ แต่ผมมีคำถามเพิ่มเติม หลังจากที่ได้ทดลองครับ
1. ผมลองกดเลือก filter ที่ปี 2020 แล้วก็กดที่ปี 2020 ซ้ำอีกทีเป็นการ Unfilter ปรากฎว่าขึ้น Popup Runtime Error แบบนี้ครับ
(ที่จริงกด filter ที่ตรงไหนก็ได้ แล้วกดซ้ำอีกทีก็ขึ้น Error runtime เหมือนกัน) ผมอยากแก้ไขตรงนี้
คือ ไม่ให้ขึ้น runtime Error เลย แล้วเมื่อกดซ้ำ Unfilterให้โชว์ Record เหมือนตอนที่เปิด Form frmManpower1 ขึ้นมาครับ
(เข้าใจว่าจะโชว์เฉพาะเดือนปัจจุบันกับเดือนหน้าอีก 1 เดือน)

2. จากภาพ ที่หมายเลข 2 อยากทำปุ่ม Unfilter ครับ เวลาเราเลือก filter หลายๆอัน แล้วอยาก Unfilter ให้โชว์ Record
เหมือนตอนที่เปิด Form frmManpower1 ขึ้นมาครับ

3. อยากทำปุ่ม Select All คือให้ Show Record ทั้งหมด ทุกๆปี ทุกเดือน ทุก WorkGroup ทุกDepartment ทุกSection เลยครับ

รบกวนขอไอเดีย หรือช่วยแก้ไขให้ผมหน่อยนะครับ ผมเองก็งงๆ ที่พัฒนามาได้ในตอนต้นก็ดูจาก youtube มาแบบไม่เข้าใจเท่าไหร่ครับ
ขอบคุณมากๆครับผม

 

25 ต.ค. 63 , 19:53:12
ตอบกลับ #7

PNR

แก้โค้ดบรรทัดนี้นะครับ เออเร่อจะหายไป
StrWhere = Nz((criteria1 & criteria2 & criteria3 & criteria4 & criteria5), "")

ปุ่มที่ 1 โจทย์ข้อ 2

โค๊ด: [Select]
Private Sub Cmb1_Click()
Dim sql As String
Dim i As Long
Dim currentMonth As String
Dim NextMonth As String
Dim Criteria As String
With Me.lstYearSort
    .Selected(0) = True
    For i = .ListCount To 0 Step -1
        .Selected(i) = False
    Next i
End With
With Me.lstMonthSort
    .Selected(0) = True
    For i = .ListCount To 0 Step -1
        .Selected(i) = False
    Next i
End With
With Me.lstSection
    .Selected(0) = True
    For i = .ListCount To 0 Step -1
        .Selected(i) = False
    Next i
End With
With Me.lstWorkGroup
    .Selected(0) = True
    For i = .ListCount To 0 Step -1
        .Selected(i) = False
    Next i
End With
With Me.lstDepartment
    .Selected(0) = True
    For i = .ListCount To 0 Step -1
        .Selected(i) = False
    Next i
End With
currentMonth = Month(Date)
NextMonth = Month(Date) + 1
Criteria = " [MonthNum] in " & "(" & currentMonth & "," & NextMonth & ")"
sql = "SELECT * FROM qryPerDay WHERE" & Criteria
Forms!frmManpower1!frmqryPerDay.Form.RecordSource = sql
End Sub
ปุ่มที่ 2 โจทย์ข้อ 3 ใส่โค้ดแบบนี้
โค๊ด: [Select]
Private Sub Cmb2_Click()
Dim sql As String
Dim i As Long
With Me.lstYearSort
    .Selected(0) = True
    For i = .ListCount To 0 Step -1
        .Selected(i) = False
    Next i
End With
With Me.lstMonthSort
    .Selected(0) = True
    For i = .ListCount To 0 Step -1
        .Selected(i) = False
    Next i
End With
With Me.lstSection
    .Selected(0) = True
    For i = .ListCount To 0 Step -1
        .Selected(i) = False
    Next i
End With
With Me.lstWorkGroup
    .Selected(0) = True
    For i = .ListCount To 0 Step -1
        .Selected(i) = False
    Next i
End With
With Me.lstDepartment
    .Selected(0) = True
    For i = .ListCount To 0 Step -1
        .Selected(i) = False
    Next i
End With
sql = "SELECT * FROM qryPerDay;"
Forms!frmManpower1!frmqryPerDay.Form.RecordSource = sql
End Sub



« แก้ไขครั้งสุดท้าย: 26 ต.ค. 63 , 07:56:25 โดย PNR »
Time to stop for me  :dizzy:
 
โพสต์นี้ได้รับคำขอบคุณจาก: Tatchawin

26 ต.ค. 63 , 18:07:35
ตอบกลับ #8

Tatchawin

ขอบคุณมากครับคุณ PNR ผมทำได้แล้วครับ เจ๋งมากๆเลยครับ แต่อยากจะสอบถามเพิ่มเติมครับ พอดีเจอโจทย์เพิ่มจากเจ้านายครับ
คำถามคือ ตัว Listbox แต่ละตัวนี่เราสามารถทำให้ Row Source มันกรองเปลี่ยนตามกันได้ไหมครับ กล่าวคือ

1. ที่ lstPlant ถ้าเรากดเลือกไปที่่โรงงานใดโรงงานหนึ่ง Row Source lstDepartment จะกรองเฉพาะข้อมูลที่สัมพันธ์กับ lstPlant ให้เลือก
2. ส่วนถ้าเลือก lstPlant และ lstDepartment ที่ lstPlant ก็จะกรองเฉพาะข้อมูลที่เกี่ยวข้องมาให้เลือก
สรุปคือ เป็นเสมือน Dropdown ไล่เป็นชั้นๆลงไปครับ ซึ่งผมแบบนี้ได้ ใน combo box แต่ผมนำหลักการแบบที่ทำใน combo box มาทำไม่สำเร็จ

รบกวนคุณ PNR อีกสักรอบได้ไหมครับ ขอบคุณมากๆครับผม
ปล. ผมแนบไฟล์ที่แก้โค้ดตามที่คุณ PNR แนะนำ พร้อมกับใส่ tblOrg ที่เป็นตารางแสดงความสัมพันธ์ของ Plant, Department และ Section มาให้ครับ
« แก้ไขครั้งสุดท้าย: 26 ต.ค. 63 , 18:16:32 โดย Tatchawin »

 

27 ต.ค. 63 , 09:13:30
ตอบกลับ #9

PNR

ลองดูครับ
Time to stop for me  :dizzy:
 
โพสต์นี้ได้รับคำขอบคุณจาก: sjs, Tatchawin

29 ต.ค. 63 , 11:26:12
ตอบกลับ #10

Tatchawin

ขอบคุณมากๆครับท่าน ขออภัยที่มาตอบช้านะครับ พอดีหมุนไปทำงานอีกอย่าง
น่าจะเกือบได้แล้วครับ ขอรบกวนอีกสักนิดได้ไหมครับ คือ พอเปิด Form มาผมลองกดไปที่ lstDepartment กับ lstSection เลย ปรากฎว่าเกิด Error ตามภาพ
จะต้องแก้ตัวไหนครับ ผมลองแก้เองแล้วไม่ได้ครับ

รบกวนอีกสักนิดนะครับ ขอบคุณมากๆเลยครับ

 

29 ต.ค. 63 , 12:38:23
ตอบกลับ #11

PNR

ใช้เงื่อนไขการเช็ค ถ้าไม่มีรายการก็ยกเลิกการทำงานเช่น
Me.lstDepartment.Selected(0) = True

แก้ไขโค้ดเป็นแบบนี้ครับ

โค๊ด: [Select]
If Me.lstDepartment.Selected(0) = True Then
    Exit Sub
    Else
    For Each varItem4 In Me.lstDepartment.ItemsSelected
        strsearch4 = strsearch4 & "," & Me!lstDepartment.ItemData(varItem4)
    Next varItem4
    If strsearch4 = vbEmpty Then
    criteria4 = Null
    Else
        strsearch4 = Right(strsearch4, Len(strsearch4) - 1)
        criteria4 = " And [DepartmentID] in (" & strsearch4 & ")"
    End If
End If
'---------------------------------------------------------------------------------------------------------
If Me.lstSection.Selected(0) = True Then
    Exit Sub
    Else
    For Each varItem5 In Me.lstSection.ItemsSelected
        strsearch5 = strsearch5 & "," & Me!lstSection.ItemData(varItem5)
    Next varItem5
    If strsearch5 = vbEmpty Then
    criteria5 = Null
    Else
        strsearch5 = Right(strsearch5, Len(strsearch5) - 1)
        criteria5 = " And [SectionID] in (" & strsearch5 & ")"
    End If
End If
Time to stop for me  :dizzy:
 
โพสต์นี้ได้รับคำขอบคุณจาก: Tatchawin

29 ต.ค. 63 , 13:37:17
ตอบกลับ #12

Tatchawin

ขอบคุณครับท่าน ขออีกนิดครับ ที่ lstSection กดซ้ำหลายๆที ไม่มี Error ครับ แต่ที่ lstDepartment กดทีเดียวไม่เปนไร
แต่ถ้ากดซ้ำ2-3 ครั้งก็จะมี Error = Runtime Error '5': ขึ้นมา ตรงนี้แก้อย่างไร ครับ

เหลือตรงนี้จุดเดียว ผมคิดว่าไม่น่ามีไรเพิ่มเติมแล้วครับ
รบกวนอีกสักรอบครับ
ขอบคุณเป็นอย่างยิ่งเลยครับ  :miao:

 

29 ต.ค. 63 , 13:43:21
ตอบกลับ #13

PNR

ทำไมของผมไม่เป็นครับ
Time to stop for me  :dizzy:
 
โพสต์นี้ได้รับคำขอบคุณจาก: Tatchawin

01 พ.ย. 63 , 12:01:00
ตอบกลับ #14

Tatchawin

ขอบคุณมากๆเลยครับคุณ PNR ผมทำได้แล้วครับ ขอบคุณสำหรับความช่วยเหลือทุกคำถามนะครับ :D

 
โพสต์นี้ได้รับคำขอบคุณจาก: SakDa, PNR


บอร์ดเรียนรู้ Access สำหรับคนไทย


 

Sitemap 1 2 3 4 5