แนวทางเท่าที่คิดได้ตอนนี้คือสร้าง ฟังก์ชั่น F ที่รับค่าของทุกฟิลด์ใน Primary Key (หรือ Unique Key) ของบรรทัดนั้นๆ (aPK1 ถึง aPKn) และค่าของฟิลด์ (aF) ที่ต้องการเปรียบเทียบระหว่างบรรทัดนั้นกับบรรทัดก่อนหน้า ส่วนตัวฟังก์ชั่นเองก็คืนค่าของฟิลด์ aF ที่ต้องการแสดงกลับมา ซึ่งก็เป็นไปได้ 2 อย่างคือ ค่าที่ส่งเข้ามา หรือไม่ก็ไม่ต้องแสดงเพราะค่าเท่ากับบรรทัดก่อนหน้า
' โค้ดนี้เป็นแค่แนวทาง ต้องไปปรับปรุงเองนะครับ
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