สมัครสมาชิก
 

Hide Duplicates



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

30 ต.ค. 61 , 15:33:47
อ่าน 625 ครั้ง

Un

Hide Duplicates
« เมื่อ: 30 ต.ค. 61 , 15:33:47 »
ในหน้า Report จะมีรายการให้เรา Hide Duplicates
ในหน้าฟอร์ม มันไม่มีให้เลือก เราทำเองได้มั้ย ทำอย่างไรครับ

 

01 พ.ย. 61 , 21:08:01
ตอบกลับ #1

สันติสุข

  • แฟนพันธุ์แท้ไท.Access
  • *
  • กระทู้: 236
  • พลังขอบคุณ: 216

  • Infiorata งานเทศกาลดอกไม้ในหลายเมืองของอิตาลี

    • ดูรายละเอียด

: Hide Duplicates
« ตอบกลับ #1 เมื่อ: 01 พ.ย. 61 , 21:08:01 »
แนวทางเท่าที่คิดได้ตอนนี้คือสร้าง ฟังก์ชั่น F ที่รับค่าของทุกฟิลด์ใน Primary Key (หรือ Unique Key) ของบรรทัดนั้นๆ (aPK1 ถึง aPKn) และค่าของฟิลด์ (aF) ที่ต้องการเปรียบเทียบระหว่างบรรทัดนั้นกับบรรทัดก่อนหน้า ส่วนตัวฟังก์ชั่นเองก็คืนค่าของฟิลด์ aF ที่ต้องการแสดงกลับมา ซึ่งก็เป็นไปได้ 2 อย่างคือ ค่าที่ส่งเข้ามา หรือไม่ก็ไม่ต้องแสดงเพราะค่าเท่ากับบรรทัดก่อนหน้า

โค๊ด: [Select]
' โค้ดนี้เป็นแค่แนวทาง ต้องไปปรับปรุงเองนะครับ
Public Function F(aPK1 as Variant , ... , aPKn as Variant , aF as Variant) as Variant
Dim RS As DAO.Recordset

' กรณีเป็นบรรทัดของ New Record ค่าที่ส่งมาจะเป็น NULL
' ก็ไม่ต้องทำอะไร ออกจากฟังก์ชั่นได้เลย
If IsNull(aPK1) Then Exit Function

' กำหนด recordset ของฟอร์มที่โค้ดจะใช้ในการค้นหาเพื่อเปรียบเทียบ
Set RS = Forms("ชื่อฟอร์ม").RecordsetClone

' ทำการรวบรวมทุกเรคอร์ดให้ recordset รู้จัก
RS.MoveLast

' ค้นหาเรคอร์ดที่มีค่าตรงกับ Primary Key ของบรรทัดนั้นๆ
RS.FindFirst " ฟิลด์1 = " & aPK1 & " and ฟิลด์2 = " & aPK2 & ... & " and ฟิลด์n = " & aPKn

' ถ้าเป็นบรรทัดแรก ค่าที่ส่งกลับไปแสดงก็คือค่าที่ส่งเข้ามานั่นเอง
If RS.AbsolutePosition = 0 Then
F = aF
Exit Function
End If

' ย้อนกลับไป 1 เรคอร์ด (บรรทัด)
RS.MovePrevious

' ถ้าค่าของฟิลด์ในบรรทัดก่อนหน้าไม่เท่ากับค่าที่ส่งมา ก็ให้ส่งกลับไปแสดงค่าที่ส่งเข้ามาเช่นกัน
If RS("ชื่อฟิลด์") < > aF Then
F = RS("ชื่อฟิลด์")
End If

' แต่ถ้าเท่ากัน ก็ไม่ต้องส่งอะไรกลับ มันจะเป็น NULL เป็นค่าว่างๆ
End Function

ถ้าเท็กซ์บ็อกซ์ของฟิลด์ T ที่แสดงค่าชื่อว่า txtT  เราก็ใส่ =F([ชื่อฟิลด์ที่1ของ PK],...,[ชื่อฟิลด์ที่ n ของ PK], [T]) ไว้ใน Control Source property ของ txtT นั่นเอง

ตย.การแสดง

เลขเอกสาร(aPK1)   รหัสสินค้า(aPK2)   แผนกผลิต(txtT)   วันที่ผลิต   จำนวนที่ผลิต
A0001      001         CUT      15/11/2018   100
B0003      003                  16/11/2018   300
C0005      005         ASSY      16/11/2018   500
D0007      007                  17/11/2017   700
ช่วยพกถุงผ้า หรือถุงพลาสติกที่สะอาดและผ่านการใช้มาแล้ว ไปซื้อของเพื่อลดการใช้พลาสติก ลดขยะ รักษาสิ่งแวดล้อม และไม่ให้ภาวะโลกร้อนวิกฤติเร็วขึ้นกว่านี้
 
โพสต์นี้ได้รับคำขอบคุณจาก: Un

02 พ.ย. 61 , 10:16:31
ตอบกลับ #2

Un

: Hide Duplicates
« ตอบกลับ #2 เมื่อ: 02 พ.ย. 61 , 10:16:31 »
โอ้โห เหมือนเป็นคำถามง่ายๆ ไม่น่าเชื่อว่ามันจะทำยากขนาดนี้
ขอบพระคุณ อ.สันติสุข ที่กรุณาเสมอมาครับ ขอลองทำดูก่อน แล้วจะมาแจ้งผมให้ทราบครับ

 

21 ธ.ค. 61 , 10:38:29
ตอบกลับ #3

Un

: Hide Duplicates
« ตอบกลับ #3 เมื่อ: 21 ธ.ค. 61 , 10:38:29 »
ถ้าเท็กซ์บ็อกซ์ของฟิลด์ T ที่แสดงค่าชื่อว่า txtT

ผมไม่เข้าใจคำนี้ครับ แทนค่า [T] ไม่ถูกครับ

 

21 ธ.ค. 61 , 10:48:24
ตอบกลับ #4

Un

: Hide Duplicates
« ตอบกลับ #4 เมื่อ: 21 ธ.ค. 61 , 10:48:24 »

 

21 ธ.ค. 61 , 14:21:37
ตอบกลับ #5

สันติสุข

  • แฟนพันธุ์แท้ไท.Access
  • *
  • กระทู้: 236
  • พลังขอบคุณ: 216

  • Infiorata งานเทศกาลดอกไม้ในหลายเมืองของอิตาลี

    • ดูรายละเอียด

: Hide Duplicates
« ตอบกลับ #5 เมื่อ: 21 ธ.ค. 61 , 14:21:37 »
1. ฟังก์ชั่น F ไม่ได้ให้เอาไปใส่ในคิวรี่ แต่ให้ใส่ลงในช่อง Control Source ของ VD (ถ้าผมเข้าใจไม่ผิดนะ ว่า VD คือเท็กซ์บ็อกซ์ที่ไม่ต้องการให้แสดงค่าซ้ำ)

2. สิ่งต่อไปก็คือ ต้องหาฟิลด์ Primary Key หรือ Unique Key ทั้งหมดที่ค่ารวมของฟิลด์เหล่านี้สามารถบ่งบอกได้ว่า นี่คือบรรทัดนี้บนฟอร์มเท่านั้น จะไม่มีบรรทัดอื่นที่มีค่ารวมเหมือนกับบรรทัดนี้ ผมไม่รู้ว่า PID+Visit_date+Visit_No+diagcode เพียงพอหรือไม่  แต่ถ้าใช่ ก็ใส่ =F(PID, Visit_Date, Visit_No, DiagCode, VD) ลงใน Control Source ของเท็กซ์บ็อกซ์ VD ครับ
ช่วยพกถุงผ้า หรือถุงพลาสติกที่สะอาดและผ่านการใช้มาแล้ว ไปซื้อของเพื่อลดการใช้พลาสติก ลดขยะ รักษาสิ่งแวดล้อม และไม่ให้ภาวะโลกร้อนวิกฤติเร็วขึ้นกว่านี้
 

21 ธ.ค. 61 , 17:19:25
ตอบกลับ #6

pizza_p

: Hide Duplicates
« ตอบกลับ #6 เมื่อ: 21 ธ.ค. 61 , 17:19:25 »
อีกทางเลือก
โค๊ด: [Select]
Dim KeyShow()  'กำหนด array ใน form scope เพื่อให้ทุก sub หรือ func มองเห็น

Private Sub Form_Load()
       
SetKeyShow "visit_No", "VD"   'ตอนโหลดข้อมูลเสร็จให้สร้าง array ที่เก็บ PK แรกของค่าที่ไม่ซ้ำ

End Sub

Private Sub SetKeyShow(PK_Name As String, FieldShow_Name As String)
Dim MyRS As Recordset, CurrentValue As Variant

ReDim Preserve KeyShow(0 To 0) 'set ขนาด array มีค่า 1 ตัว

Set MyRS = Me.RecordsetClone

If MyRS.RecordCount > 0 Then
    MyRS.MoveFirst
    KeyShow(0) = MyRS(PK_Name) 'บรรทัดแรกต้องแสดงอยู่แล้ว เก็บ PK ไว้
    Do While Not MyRS.EOF
        CurrentValue = MyRS(FieldShow_Name) 'เก็บค่าบรรทัดปัจจุบันไว้
        MyRS.MoveNext
        If Not MyRS.EOF Then
            If MyRS(FieldShow_Name) <> CurrentValue Then 'ถ้าบรรทัดถัดไปไม่ซ้ำกับบรรทัดปัจจุบันก็ดำเนินการเก็บค่าไว้
                ReDim Preserve KeyShow(0 To UBound(KeyShow) + 1) 'เพิ่มขนาด array
                KeyShow(UBound(KeyShow)) = MyRS(PK_Name) 'เก็บค่า PK ที่ไม่ซ้ำเพิ่มใน array
            End If
        End If
    Loop
End If
MyRS.Close
Set MyRS = Nothing

End Sub

Private Function IsShow(PK As Variant) As Boolean
Dim i As Long
'ตรวจสอบค่า PK ที่จะต้องแสดง
IsShow = False
For i = LBound(KeyShow) To UBound(KeyShow)
    If KeyShow(i) = PK Then
      IsShow = True
      Exit For
    End If
Next i
End Function

ในคอนโทรลที่ต้องการไม่ให้แสดงค่าเฉพาะที่ไม่ซ้ำให้กำหนด source = IIf(IsShow([visit_No]),[VD],"")

 

23 ธ.ค. 61 , 12:32:49
ตอบกลับ #7

Un

: Hide Duplicates
« ตอบกลับ #7 เมื่อ: 23 ธ.ค. 61 , 12:32:49 »
มันเป็นแบบนี้ครับ อ.สันติสุข

ผมก็ทำแบบไม่เข้าใจ


 

23 ธ.ค. 61 , 12:38:25
ตอบกลับ #8

Un

: Hide Duplicates
« ตอบกลับ #8 เมื่อ: 23 ธ.ค. 61 , 12:38:25 »
ของ อ.Pizza_P

มัน Error แบบนี้ครับ


 

23 ธ.ค. 61 , 13:54:43
ตอบกลับ #9

สันติสุข

  • แฟนพันธุ์แท้ไท.Access
  • *
  • กระทู้: 236
  • พลังขอบคุณ: 216

  • Infiorata งานเทศกาลดอกไม้ในหลายเมืองของอิตาลี

    • ดูรายละเอียด

: Hide Duplicates
« ตอบกลับ #9 เมื่อ: 23 ธ.ค. 61 , 13:54:43 »
- คอลัมน์ที่จะไม่ให้แสดงค่าซ้ำคือคอลัมน์อะไร
- คอลัมน์นั้นเอามาจากฟิลด์อะไรในเทเบิล
ช่วยพกถุงผ้า หรือถุงพลาสติกที่สะอาดและผ่านการใช้มาแล้ว ไปซื้อของเพื่อลดการใช้พลาสติก ลดขยะ รักษาสิ่งแวดล้อม และไม่ให้ภาวะโลกร้อนวิกฤติเร็วขึ้นกว่านี้
 
โพสต์นี้ได้รับคำขอบคุณจาก: Un

23 ธ.ค. 61 , 14:26:02
ตอบกลับ #10

Un

: Hide Duplicates
« ตอบกลับ #10 เมื่อ: 23 ธ.ค. 61 , 14:26:02 »
vd(visitdate)  คือ วันที่ และต้องการให้ค่าซ้ำแสดงค่าเดียว
นอกนั้น ไม่ซ้ำเลยครับ ผลที่ได้ อยากให้ออกมาแบบนี้

VD                     ชื่อโรค
12/12/2561        AAA
                         BBB
13/12/2561         CCC
14/12/2561         BBB
                          SSS
                          AAA

 

23 ธ.ค. 61 , 15:10:15
ตอบกลับ #11

สันติสุข

  • แฟนพันธุ์แท้ไท.Access
  • *
  • กระทู้: 236
  • พลังขอบคุณ: 216

  • Infiorata งานเทศกาลดอกไม้ในหลายเมืองของอิตาลี

    • ดูรายละเอียด

: Hide Duplicates
« ตอบกลับ #11 เมื่อ: 23 ธ.ค. 61 , 15:10:15 »
=F(PID, Visit_No, Visit_Date)
ช่วยพกถุงผ้า หรือถุงพลาสติกที่สะอาดและผ่านการใช้มาแล้ว ไปซื้อของเพื่อลดการใช้พลาสติก ลดขยะ รักษาสิ่งแวดล้อม และไม่ให้ภาวะโลกร้อนวิกฤติเร็วขึ้นกว่านี้
 
โพสต์นี้ได้รับคำขอบคุณจาก: Un

23 ธ.ค. 61 , 15:17:49
ตอบกลับ #12

Un

: Hide Duplicates
« ตอบกลับ #12 เมื่อ: 23 ธ.ค. 61 , 15:17:49 »
=F(PID, Visit_No, Visit_Date)
แบบนี้ผม ก็ลองแล้วครับ ผมว่า น่าจะผิดที่ฟังชั่น ที่ผมไม่เข้าใจ ในการแทนค่าครับ

 

23 ธ.ค. 61 , 16:21:58
ตอบกลับ #13

สันติสุข

  • แฟนพันธุ์แท้ไท.Access
  • *
  • กระทู้: 236
  • พลังขอบคุณ: 216

  • Infiorata งานเทศกาลดอกไม้ในหลายเมืองของอิตาลี

    • ดูรายละเอียด

: Hide Duplicates
« ตอบกลับ #13 เมื่อ: 23 ธ.ค. 61 , 16:21:58 »
ในโค้ด ให้แก้คำสั่งเป็น

RS.FindFirst "PID = '" & aPK1 & "' and Visit_No = '" & aPK2 & "' "
หมายเหตุ : ถ้า PID และ Visit_No ตัวไหนที่มี Data Type ในเทเบิลเป็น Numeric ก็เอาเครื่องหมาย ' ออก

และแก้

If RS("Visit_Date") <> aF then
   F = aF
End If

ช่วยพกถุงผ้า หรือถุงพลาสติกที่สะอาดและผ่านการใช้มาแล้ว ไปซื้อของเพื่อลดการใช้พลาสติก ลดขยะ รักษาสิ่งแวดล้อม และไม่ให้ภาวะโลกร้อนวิกฤติเร็วขึ้นกว่านี้
 
โพสต์นี้ได้รับคำขอบคุณจาก: Un

23 ธ.ค. 61 , 18:09:50
ตอบกลับ #14

pizza_p

: Hide Duplicates
« ตอบกลับ #14 เมื่อ: 23 ธ.ค. 61 , 18:09:50 »
บรรทัด Dim KeyShow() ต้องเอาไปอยู่ก่อนที่จะมีฟังก์ชั่นใดๆครับ อยู่ใต้บรรทัด Option Compare Database ครับ

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

24 ธ.ค. 61 , 09:24:27
ตอบกลับ #15

Un

: Hide Duplicates
« ตอบกลับ #15 เมื่อ: 24 ธ.ค. 61 , 09:24:27 »


แก้ไขตาม อ.pizza_p แล้วออกมาแบบที่ต้องการแล้วครับ

ส่วนของ อ.สันติสุข ยังออกมาเป็น Error #Name อยู่เหมือนเดิม

ทั้ง 2 แบบ ผมยังไม่เข้าใจหลักการทำงาน ต้องขอเวลาทำความเข้าใจ
โชคดีที่แบบของ อ.pizza_p ผมไม่ต้องแทนค่าเลย ทำให้ง่ายในการนำไปใช้
แต่ผมเชื่อว่า ทั้ง 2 แบบน่าจะเหมาะกับ เหตุการคนละแบบ ต้องขอศึกษาวิธีการ
เพิ่มเติมอีกครับ

ขอบขอบพระคุณอาจารย์ทั้ง 2 ที่กรุณาด้วยดีเสมอมาครับ

 

25 ธ.ค. 61 , 11:14:32
ตอบกลับ #16

สันติสุข

  • แฟนพันธุ์แท้ไท.Access
  • *
  • กระทู้: 236
  • พลังขอบคุณ: 216

  • Infiorata งานเทศกาลดอกไม้ในหลายเมืองของอิตาลี

    • ดูรายละเอียด

: Hide Duplicates
« ตอบกลับ #16 เมื่อ: 25 ธ.ค. 61 , 11:14:32 »
Visit_Date เปลี่ยนเป็น VisitDate (ไม่แน่ใจ)
ช่วยพกถุงผ้า หรือถุงพลาสติกที่สะอาดและผ่านการใช้มาแล้ว ไปซื้อของเพื่อลดการใช้พลาสติก ลดขยะ รักษาสิ่งแวดล้อม และไม่ให้ภาวะโลกร้อนวิกฤติเร็วขึ้นกว่านี้
 
โพสต์นี้ได้รับคำขอบคุณจาก: Un

25 ธ.ค. 61 , 15:38:54
ตอบกลับ #17

Un

: Hide Duplicates
« ตอบกลับ #17 เมื่อ: 25 ธ.ค. 61 , 15:38:54 »
Visit_Date เปลี่ยนเป็น VisitDate (ไม่แน่ใจ)
พอแก้แล้วมันเปลี่ยนจาก #Name เป็น #Error ครับ

ผมฝากไฟล์ให้อาจารย์ดูครับ

 


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