ผมเขียนตัวอย่างสมมุติของ Class Recordset เพื่อให้เห็นภาพว่าเมื่อเราอ่านหรือกำหนดค่าให้ Property ของ Object ทำงาน มันจะไปสัมพันธ์กับโค้ดส่วนไหนใน Class นั้นๆ หวังว่าพอจะมีประโยชน์บ้างครับ แต่เอาไปรันจริงไม่ได้นะครับ แค่ตัวอย่างเท่านั้น
โค้ดข้างล่างนี้จะเขียนอยู่ใน Class Module และบันทึกในชื่อ Recordset
Option Compare Database
Option Explicit
Type RecordStructure ' โครงสร้างของ Recordset Object
RSField1 As Variant
RSField2 As Variant
End Type
Dim Ptr As Integer ' เก็บตำแหน่งเรคอร์ดปัจจุบันของ Recordset นี้
Dim RC() As RecordStructure ' ตัวแปร Recordset Object
Private Sub Class_Initialize()
' Procedure จะทำงานโดยอัตโนมัติเมื่อ object ถูกสร้าง
' ตย.โค้ดเช่น เพิ่ม object นี้ลงใน Recordsets Collection (Collection คือ อ็อปเจ็คของกลุ่ม Object อีกที)
End Sub
Private Sub Class_Terminate()
' Procedure จะทำงานโดยอัตโนมัติเมื่อ object ถูกเคลียร์ให้เป็น Nothing
' ตย.โค้ดเช่น นำ object นี้ ออกจาก Recordsets Collection
End Sub
Public Property Let Bookmark(NewPosition As Integer)
' กำหนดตำแหน่งเรคอร์ดปัจจุบันของ Recordset
If NewPosition <= UBound(RC) Then
Ptr = NewPosition
Else
Err.Raise 1234, "Invalid Bookmark"
End If
End Property
Public Property Get RecordCount() As Long
' คืนค่าจำนวนเรคอร์ดทั้งหมดใน Recordset
RecordCount = UBound(RC)
End Property
Public Property Get Fields(Name As String) As Variant
' คืนค่าฟิลด์ตามชื่อฟิลด์ที่ส่งมาในตัวแปร Name
Select Case Name
Case "CustomerID"
Fields = RC(Ptr).RSField1
Case "CustomerName"
Fields = RC(Ptr).RSField2
Case Else
Err.Raise 2589, "Invalid Field Name"
End Select
End Property
Public Property Get EOF() As Boolean
' คืนค่า True เมื่อตำแหน่งเรคอร์ดปัจจุบันเลยเรคอร์ดสุดท้ายไปแล้ว
If Ptr > UBound(RC) Then
EOF = True
Else
EOF = False
End If
End Property
Public Sub MoveNext()
' เลื่อนไปยังเรคอร์ดถัดไปใน Recordset
If Ptr <= UBound(RC) Then
Ptr = Ptr + 1
Else
Err.Raise 7654, "End of file"
End If
End Sub
ส่วนข้างล่างนี้เป็นโค้ดที่อยู่ใน Module ธรรมดาๆ ที่เรียกใช้ Object, Method และ Property ต่างๆใน Class Module Recordset ครับ
Private Sub Example()
' โค้ดพิมพ์ CustomerID และ CustomerName จากเทเบิล Customer ตั้งแต่เรคอร์ดที่ 10 เป็นต้นไป
Dim RS As DAO.Recordset
Set RS = CurrentDb.OpenRecordset("Customer")
' เมื่อ Object ถูกสร้าง จะไปเรียก Class_Initialize procedure มาทำงาน
If RS.RecordCount > 10 Then ' โค้ดใน Property Get RecordCount จะถูกทำงาน
RS.Bookmark = 10 ' โค้ดใน Property Let Bookmark จะถูกทำงาน เป็นการนำค่าเข้าไปใน Property Bookmark
End If
Do Until RS.EOF ' โค้ดใน Property Get EOF จะถูกทำงาน
Debug.Print RS.Fields("CustomerID") & ";" _
& RS.Fields("CustomerName") ' โค้ดใน Property Get Fields จะถูกทำงาน
RS.MoveNext ' โค้ดใน Sub MoveNext จะถูกทำงาน
Loop
Set RS = Nothing
' เมื่อ Object ถูกเคลียร์ จะไปเรียกโค้ดใน Class_Initialize procedure มาทำงาน
End Sub