ไม่อยากให้เพิ่ม Record เมื่อกดออกจาก form
กระทู้เก่าบอร์ด อ.Yeadram

 1,160   4
URL.หัวข้อ / URL
ไม่อยากให้เพิ่ม Record เมื่อกดออกจาก form

ผมสร้าง form แบบ datasheet view เปิดให้ Add & Edit ได้
(Default View เป็น Continuous form)
โดยการกรอกข้อมูลผมจะตั้ง Require field ไว้ 3-4 field
ตั้งจาก Event Form_BeforeUpdate ถ้า Require field ไม่มีข้อมูล จะแจ้งเตือน Msgbox และ
Cancel = True

ปัญหาที่พบ
ใน Form นี้มีปุ่ม Cancel และปุ่ม Close form
ปุ่ม Cancel จะอยู่ท้าย Record ทุก Record
ส่วนปุ่ม Close จะอยู่ที่ Form Footer
1. เมื่อกดปุ่ม Close โดยที่กรอกข้อมูลไว้บางส่วน และไม่ได้กรอกใน Require Field จะแจ้งเตือนแล้วออกจาก form ไป *ออกจาก Form แต่ยังบันทึกข้อมูลลงในตารางโดย Require Field ที่ต้องการเป็นค่าว่าง

2. ส่วนปุ่ม Cancel เมื่อข้อมูลยังไม่ได้บันทึกลงตารางเมื่อกดแล้วระบบจะขึ้น Error (หา ID ที่จะ Cancel ไม่ได้) ผมได้ตั้ง error handle ให้ส่งค่าปุ่ม ESC เพื่อยกเลิกรายการครับ (เพื่อให้ user ไม่งงมาก)

If err.Number = 94 Then
    SendKeys "{esc}", True
Else
พบว่าบางเครื่องจะมีปัญหาขึ้น error
execution of this application has stopped due to a run-time error
this program can't continue and will be shut down

อยากทราบวิธีแก้ไข 2 เรื่องครับ
1. แก้ให้ไม่ทำการ Insert ข้อมูลกรณีกดปุ่ม Cancel และ Close
2. สงสัยเรื่องที่บางเครื่อง Error ตามที่แจ้งไปครับ (การใช้งานแต่ละเครื่องมีทั้ง windows xp / 7 และ Office Access 2003 / 2010 ครับ

ขอบคุณครับ

4 Reply in this Topic. Dispaly 1 pages and you are on page number 1

1 @R21226
เอาโค้ดในปุ่ม Close และ Cancel มาให้ดูหน่อยครับ ฟังจากอาการแล้วไม่น่าเป็นไปได้เพราะถ้ากำหนดพารามิเตอร์ Cancel ให้เท่ากับ True แล้ว ยังไงมันก็ไม่บันทึกการแก้ไข/เพิ่มเรคอร์ดเข้าไปนะครับ
2 @R21234
มี หลักๆ 3 SUB นะครับ
ส่วนใน Msgbox เป็นแค่ Message แจ้งเฉยๆครับ

Private Sub btnCancelRec_Click()
On Error GoTo err:

If MsgBox("µéͧ¡Òà Cancel ÃÒ¡ÒùÕéËÃ×ÍäÁè", vbYesNo) = vbYes Then
intRecID = Me.ReceiveID.value

DoCmd.SetWarnings False
DoCmd.OpenQuery "qryUpdate_CancelRec"
DoCmd.SetWarnings True
MsgBox "Record is Cancelled.", vbOKOnly, "Result"
Me.Requery
End If

ext:
Exit Sub

err:
If err.Number = 94 Then
    SendKeys "{esc}", True
Else
    MsgBox err.Description
End If
    Resume ext
End Sub


Private Sub btnClose2_Click()
On Error GoTo Err_Click

DoCmd.Close
DoCmd.OpenForm "frmMain"

ext:
    Exit Sub

Err_Click:
    MsgBox err.Description
    Resume ext
    
End Sub


Private Sub Form_BeforeUpdate(Cancel As Integer)
On Error GoTo err

If Me.Amount.value = 0 Or IsNull(Me.Amount.value) = True Then
MsgBox "¡ÃسÒÃÐºØ Amount ¡è͹à¾ÔèÁ¢éÍÁÙÅ"
Me.Amount.SetFocus
ElseIf Me.BankAcct.value = "" Or IsNull(Me.BankAcct.value) = True Then
MsgBox "¡ÃسÒÃÐºØ BankAcct ¡è͹à¾ÔèÁ¢éÍÁÙÅ"
Me.BankAcct.SetFocus
ElseIf Me.RType.value = "" Or IsNull(Me.RType.value) = True Then
MsgBox "¡ÃسÒÃÐºØ Receive Type ¡è͹à¾ÔèÁ¢éÍÁÙÅ"
Me.RType.SetFocus
ElseIf Me.RDate.value = "" Or IsNull(Me.RDate.value) = True Then
MsgBox "¡ÃسÒÃÐºØ Receive Date ¡è͹à¾ÔèÁ¢éÍÁÙÅ"
Me.RDate.SetFocus
ElseIf Me.Remark.value = "" Or IsNull(Me.Remark.value) = True Then
MsgBox "¡ÃسÒÃÐºØ Remark ¡è͹à¾ÔèÁ¢éÍÁÙÅ"
Me.Remark.SetFocus
End If
Cancel = True

   
ext:
    Exit Sub

err:
    MsgBox err.Description
    Resume ext

End Sub
3 @R21235
1. แน่ใจหรือว่ามันบันทึก ลองเช็คในเทเบิลดูแน่ชัดหรือยัง !!! เนื่องจากโค้ดใน BeforeUpdate event นั้นท่าทางจะผิด เพราะไม่ว่าคุณจะใส่ข้อมูลในช่อง required field หรือไม่ก็ตาม คุณก็กำหนด Cancel = True เสมอ ดังนั้นมันจะไม่ให้ผ่านไปได้เลย คุณไม่มีทางเพิ่ม/แก้ไขเรคอร์ดอะไรทั้งนั้น แล้วผมจำลองทำดู ก็ไม่มีทางผ่านเช่นกันครับ

2. Error code 94 (Invalid use of Null) , แทนที่จะรอให้เกิดปัญหาแล้วมาเช็ค Error code 94 สิ่งที่ควรจะเป็นคือ ควรเช็คว่าช่องต่างๆที่จำเป็นได้ถูกป้อนข้อมูลก่อนจะ OpenQuery ถึงจะถูก เพราะ Error Handling Routine เรามีไว้เพื่อใช้สำหรับดักข้อผิดพลาดต่างๆที่เราไม่รู้ว่ามันจะเกิดต่างหาก ยกเว้นในบางกรณีที่การเช็คป้องกันข้อผิดพลาดนั้นทำก่อนไม่ได้เลย เพราะไม่มีฟังก์ชั่นให้เช็ค หรือไม่ก็เช็คไม่ได้ง่ายๆครับ

ส่วนการที่ขึ้นข้อความ "execution of this application has stopped due to a run-time error this program can't continue and will be shut down" ให้ลองทำการ Compile ดูก่อนว่ามีอะไรผิดพลาดแฝงไว้ที่ไหนในระบบหรือไม่ ถ้าไม่มีก็ค่อยทำ Decompile ครับ (ลองหาวิธีทำจากกระทู้เก่าๆครับ)
4 @R21236
1. ผิดจริงครับอันนี้เพิ่มเข้าไปทีหลังครับแก้ไว้ใน if แต่ละตัวแล้วครับ

2. 94 ผมเปลี่ยนเป็นเช็ค Count record >0 แล้วครับ

3. จะลองหาดูครับ
ได้ผลยังไงจะมีแจ้งครับ
ขอบคุณครับ
@ ประกาศใช้งานเว็บบอร์ดใหม่ => บอร์ดเรียนรู้ Access สำหรับคนไทย
แล้วจะใส่ลิ้งอ้างอิงมาที่โพสต์เก่านี้หรือไม่ก็ตามสะดวกครับ
Time: 0.5129s