1. ต้องสร้างตัวแปร IsSaveClicked ในระดับของ form module ตัวนึงที่เก็บสถานะว่าได้กดปุ่ม Save ก่อนจะเกิดการบันทึกหรือไม่ แล้วค่อยทำการปรับปรุง txtCreated, txtCreatedBy, txtModified หรือ txtModifiedBy ภายใน Form_BeforeUpdate event procedure เพียงจุดเดียวตามค่าของตัวแปรนี้
2. Me.Dirty = False และ DoCmd.RunCommand acCmdSaveRecord ทำงานเหมือนกันคือสั่งให้บันทึกเรคอร์ดบนฟอร์มลงฐานข้อมูล ดังนั้นเลือกคำสั่งใดคำสั่งหนึ่งก็พอ
3. Form_BeforeUpdate event procedure จะทำงานเสมอเมื่อจะบันทึกข้อมูลบนฟอร์มลงฐานข้อมูล เมื่อโค้ดในปุ่ม Save สั่งบันทึกปั๊ป โค้ดจะกระโดดมา Form_BeforeUpdate event procedure ทันที และตามด้วย Form_AfterUpdate event procedure แล้วค่อยกลับมาที่โค้ดบรรทัดต่อไปในปุ่ม Save
4. การตรวจสอบว่าเป็นเรคอร์ดเก่าหรือใหม่ สามารถเช็คจาก Me.NewRecord ได้ จึงคิดว่าไม่ต้องแยกปุ่มบันทึกเรคอร์ดใหม่และเก่าแยกกัน
5. Form_AfterUpdate event procedure เป็นตำแหน่งที่เหมาะสมที่จะวางโค้ดแสดงข้อความว่าได้บันทึกแล้วเอาไว้ที่นี่ เราจะใช้สถานะความเป็นเรคอร์ดเก่าหรือใหม่เพื่อแสดงข้อความที่แตกต่างกัน แต่เนื่องจากเมื่อบันทึกเรคอร์ดแล้ว Me.NewRecord property จะให้ค่าเป็น FALSE เสมอ ดังนั้นใน event นี้จึงเช็คจาก property นี้ไม่ได้ จึงต้องเก็บสถานะว่าเป็นเรคอร์ดใหม่เอาไว้ในตัวแปร IsNewRecord เพิ่มเติมตั้งแต่อยู่ใน Form_BeforeUpdate event procedure
หมายเหตุ ผมไม่ได้เปิดโปรแกรมคุณหรือทดสอบโค้ดนี้ คุณเอาไปลองหรือปรับปรุงเองนะครับ
Option Compare Database
Option Explicit
Dim IsSaveClicked As Boolean
Dim IsNewRecord As Boolean
Private Sub cmdSave_Click()
IsSaveClicked = True
Me.Dirty = False
End Sub
Private Sub Form_BeforeUpdate(Cancel As Integer)
On Error GoTo Err_BeforeUpdate
If Not IsSaveClicked Then
If MsgBox("Are you sure you want to save change?", vbYesNo + vbQuestion, "Save Record") = vbNo Then
Me.Undo
GoTo Exit_BeforeUpdate
End If
End If
If Me.NewRecord Then
Me.txtNationalID1 = Me.txtNationalID2
Me.txtCreated = Now()
Me.txtCreatedBy = GetUserName()
IsNewRecord = True
Else
Me.txtModified = Now()
Me.txtModifiedBy = GetUserName()
End If
Exit_BeforeUpdate:
Exit Sub
Err_BeforeUpdate:
MsgBox Err.Number & " " & Err.Description
Resume Exit_BeforeUpdate
End Sub
Private Sub Form_AfterUpdate()
If IsNewRecord Then
MsgBox "Your record has been successfully saved!"
Else
MsgBox "Your edited record has been successfully saved!"
End If
IsNewRecord = False
IsSaveClicked = False
End Sub
Private Sub Form_Undo(Cancel As Integer)
IsSaveClicked = False
IsNewRecord = False
End Sub
Private Sub Form_Error(DataErr As Integer, Response As Integer)
IsSaveClicked = False
IsNewRecord = False
End Sub