อยากให้บันทึกฟอร์ม หลังกดปุ่มบันทึกเท่านั้น
กระทู้เก่าบอร์ด อ.Yeadram

 11,872   20
URL.หัวข้อ / URL
อยากให้บันทึกฟอร์ม หลังกดปุ่มบันทึกเท่านั้น

มือใหม่มากๆ ค่ะ

คือออยากให้ฟอร์มทำการบันทึกข้อมูล ต่อเมื่อ มีการกดบันทึกเท่านั้น ทำได้ไหมคะ

พอดี เผื่อคนอื่นมากดเปลี่ยนข้อมูลในฟิล เกรงว่า รหัสจะเปลี่ยนไปอะไรแบบนี้

เลยอยากให้การเปลี่ยนแปลงข้อมูลนั้นๆ หรือ กรอกข้อมูลใหม่นั้น ๆ จะสมบูรณ์ได้

ต่อเมื่อมีการกดปุ่มบันทึกเท่านั้น

ขอบคุณมาก ๆ ค่ะ

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

1 @R10266
จากคำถามที่ตั้งมา เข้าใจว่าออกแบบฟอร์มมาในลักษณะของ Bound Form ซึ่งมันจะบันทึกข้อมูลที่เราป้อน/แก้ไขบนหน้าจอให้อย่างอัตโนมัติเมื่อเรากระทำอะไรบางอย่าง เช่น เราทำอะไรสักอย่างเพื่อไปเรคอร์ดต่อไป, คลิกที่ Record Selector, กดคีย์ Shift-Enter, คลิก command button ต่างๆ (ถ้ามี) ที่อยู่นอก detail section ของฟอร์ม ...

การป้องกันไม่ให้ Access มันบันทึกข้อมูลโดยอัตโนมัติ เราจะกำหนดให้ Cancel argument ใน Form_BeforeUpdate event procedure มีค่าเป็น True หรือ False ขึ้นกับว่าได้คลิกที่ปุ่มบันทึกหรือไม่ เมื่อเป็น True ฟอร์มจะบันทึกข้อมูลให้ แต่เมื่อเป็น False (เป็นค่า default) ฟอร์มจะไม่บันทึกให้

ดังนั้นเราจะมีตัวแปรหนึ่งตัวเป็นประเภท boolean ที่อยู่ในระดับ module โดยสมมุติว่ามันชื่อ IsSaveClicked เมื่อไหร่ก็ตามที่คลิกปุ่มบันทึก เราจะกำหนดให้ตัวแปรนี้มีค่าเป็น True และสั่งบันทึกข้อมูลซึ่งจะกระตุ้นให้เกิด Form_BeforeUpdate event    ใน event นี้ก็ตรวจว่าถ้า IsSaveClicked = True ก็ยอมให้บันทึกได้ ซึ่งก็คือให้ Cancel argument เป็น False แต่ถ้าไม่ ก็กำหนดค่าเป็นตรงกันข้าม   ดังนั้นมันก็จะบันทึกเมื่อเราคลิกปุ่มบันทึกเท่านั้น หลังจากบันทึกแล้ว เราก็ต้องกำหนดให้ตัวแปรนี้มีค่ากลับมาเป็น False โดยการใช้ Form_AfterUpdate event procedure   นอกจากนี้เพิ่อป้องกันความผิดพลาดที่อาจเกิดขึ้นได้ระหว่างการบันทึกจึงต้องดักว่าถ้าเกิด Form_Error event เมื่อไหร่ก็ให้ตั้งค่าตัวแปรกลับเป็น False เช่นกัน

พูดมายืดยาว โค้ดก็สั้นๆเองครับ

Option Compare Database
Option Explicit

Dim IsSaveClicked   As Boolean

Private Sub Form_Error(DataErr As Integer, Response As Integer)
    IsSaveClicked = False
End Sub

Private Sub Form_BeforeUpdate(Cancel As Integer)
    Cancel = Not IsSaveClicked
End Sub

Private Sub Form_AfterUpdate()
    IsSaveClicked = False
End Sub

Private Sub btnSave_Click()
    IsSaveClicked = True
    Me.Dirty = False    ' สั่งให้บันทึกข้อมูล
End Sub
2 @R10274
เมื่อกี้เขียนตอบซ๊ะยาวเหยียด แต่กดส่งไม่ได้ หายไปหมดแล้ว

เอาเป็นว่า ทำตามแล้ว มัน error ค่ะ เดี๋ยวจะไปพยายามทดลองทำใหม่

ขอบคุณมากๆ นะคะ

ปล.
---------------------------------------------------------------------
Option Compare Database
Option Explicit
Dim IsSaveClicked   As Boolean
----------------------------------------------------------------------
code นี้เอาวางไว้ที่หัวข้อ General ใช่ไหมคะ


----------------------------------------------------------------------
แล้วปุ่ม SAVE ต้องเปลี่ยนเป็นชื่อ btnSave_Click ใช่ไหมคะ
----------------------------------------------------------------------



-------------------------------------------------------------------------------------
ปุ่ม SAVE อันเก่ามันมีชื่อว่า Command44_Click และมี code อยู่แล้วว่า
(ต้องลบทิ้งออกก่อนไหมคะ)


Private Sub Command44_Click()
On Error GoTo Err_Command44_Click


    DoCmd.DoMenuItem acFormBar, acRecordsMenu, acSaveRecord, , acMenuVer70

Exit_Command44_Click:
    Exit Sub

Err_Command44_Click:
    MsgBox Err.Description
    Resume Exit_Command44_Click
    
End Sub
------------------------------------------------------------------------------------------

ขอบคุณมากๆ ค่ะ


3 @R10275
ถาม : code นี้เอาวางไว้ที่หัวข้อ General ใช่ไหมคะ
ตอบ : ใช่ครับ

ถาม : แล้วปุ่ม SAVE ต้องเปลี่ยนเป็นชื่อ btnSave_Click ใช่ไหมคะ
ตอบ : ถ้าเปลี่ยน โค้ดเดิมใน Command44_Click ก็ลบออกไปได้ครับ แต่ถ้าไม่เปลี่ยน คุณก็ย้ายโค้ดใน btnSave_Click ไปแทนโค้ดของเดิมใน Command44_Click ครับ
4 @R10281
แก้ย่อหน้าที่ 2 ในคำตอบ R10266 เป็น

การป้องกันไม่ให้ Access มันบันทึกข้อมูลโดยอัตโนมัติ เราจะกำหนดให้ Cancel argument ใน Form_BeforeUpdate event procedure มีค่าเป็น False ในกรณีที่ผู้ใช้คลิกที่ปุ่มบันทึก แต่ถ้าไม่ ก็กำหนดให้มีค่าเป็น True
5 @R10318
โอ้ นั่ง งม อยู่ หลายวัน ในที่สุดก็ได้แล้วเจ้าค่า

ขอบคุณ คุณ สันติสุข ม๊ากกก มาก น๊าค๊า

6 @R10320
..
7 @R10321
สวัสดีครับพี่ ผมพึ้งเริ่มหัดเขียนครับรบกวนขอถามอะไรหน่อยครับ
คืนผมมี ตารางชื่อData ประไปด้วยฟิวด์ A B C D และมีฟอร์มชื่อAddDataประกอบไปด้วยtextbox t1 t2 t3 t4 ผมดึงข้อจากตารางมาโชว์อัตโนมัติบนฟอร์มAddDataนี้ทุกครั้งเมื่อเปิดฟอร์มAddDataมาครับโดยที่ให้ข้อมูลในฟิวด์A มาโชว์บนtextbox t1 B=t2 C=t3 D=t4 ตามลำดับครับ (ข้อมูลในตารางDataนั้นจะมีการใส่ข้อมูลเพียงแค่เรคคอสเดียวตลอดครับจะไม่มีการเพิ่มข้อมูลอีก)
ถ้างง ผมต้องขอโทษด้วยนะครับ ผมมือใหม่มากๆเลยครับพี่
8 @R10322
คำถามคืออะไรครับ ที่เขียนมามีแต่ประโยคบอกเล่า !
9 @R10325
อยากได้code นะครับพี่ ขอโทษทีนะครับพิมพ์ตก เยอะไปหน่อยครับ
10 @R10326
ผมอยากได้codeดึงข้อมูลจากตารางมาโชว์อัตโนมัติบนฟอร์ม*
11 @R10332
ในระดับฟอร์ม ไปกำหนด RecordSource property ให้เป็นชื่อ Data, Allow Additions property ให้เป็น No, Allow Deletions property ให้เป็น No

ในระดับคอนโทรล ให้กำหนด ControlSource property ของ t1 ให้เป็น A, t2 ให้เป็น B, ...

ถ้าไม่อยากให้แก้ไขข้อมูลได้ ทำได้ 2 วิธีคือ
1) ในระดับฟอร์ม กำหนด Allow Edits property ให้เป็น No
หรือ
2) ในระดับคอลโทรล กำหนด Locked property ให้เป็น No

ไม่ต้องมีการโค้ดใดๆครับ
12 @R10353
ได้แล้วครับๆ ขอบคุณ คุณสันติสุข มากๆเลยครับ
13 @R16040
กำหนดให้ Cancel argument ใน Form_BeforeUpdate event procedure มีค่าเป็น True หรือ False   ทำอย่างไรครับ
14 @R16044
ปกติถ้าเราไม่กำหนดอะไร มันจะเป็น False อยู่แล้ว แต่ถ้าเราต้องการไม่ให้ผ่าน Form_BeforeUpdate event เราก็เพียงเขียนว่า Cancel = True ครับ
15 @R16069
ขอบพระคุณอาจารย์มากครับ เรื่องบางเรืองที่คนบางคนไม่เข้าใจอาจเป็นเรื่องใหญ่สำหรับเค้า อาจารย์เหมือนแสงไฟที่นำแสงสว่างมาให้ครับ ขอความดีอันนี้จงเกื้อหนุนให้อาจารย์เจริญยิ่ง ๆ ขึ้นไป เทอญ
16 @R21928
ถึงอาจารย์สันติสุขครับ
ผมใช้วิธีการเขียน code ที่อาจารย์เขียนไว้กับ application หลายตัวและได้ผลมาตลอด แต่ล่าสุดเขียน application ขึ้นมาใหม่อีกตัวหนึ่งซึ่งมีรูปแบบคล้ายๆกับทีเคยเขียนมาแต่กลับพบปัญหาที่ event before update ซึ่งใส่ code "Cancel = Not IsSaveClicked" โดยไม่สามารถเลื่อนตัวชี้ record ไปที่อื่นๆได้เลย อีกทั้งยังไม่สามารถใช้ combo box เพื่อ search หา record ได้เลยครับขอให้อาจารย์ช่วยดูไฟล์ที่ทำขึ้นได้หรือไม่ครับตอนนี้จนปัญญาจริงๆ
17 @R21929
อัพโหลดไปที่ไหนสักแห่ง แล้วผมจะดูให้ ถ้าแปลงเป็น Access 2003 ได้ก็จะดีครับ แต่ถ้าไม่ได้ก็ไม่เป็นไร
18 @R21931
อาจารย์ครับผมรู้สึกว่ามันน่าจะเกิดจากการเขียน code ที่ event on current ครับเลยทำการลบออกที่ตัวครับ พอลบออกใช้ได้เลยและไม่กระทบกับการทำงานที่ on current แต่อย่างได (รู้สึกว่า code ที่ลบออกไปเกินความจำเป็น) สรุปว่า code สำหรับ save record ของอาจารย์สมบูร์อยู่แล้วครับ
19 @R23689
ผมลองทำตามโค๊ดที่อาจารย์สันติสุขให้มาทำได้แล้วครับ แต่ติดปัญหาว่า ตอนเพิ่ม sub ฟอร์มเข้าไป พอพิมพ์ข้อมูลในฟอร์มหลักเสร็จ มันไม่สามารถพิมพ์ข้อมูลใน sub ฟอร์มได้ครับ
20 @R23690
โค้ดนี้ทำงานเฉพาะฟอร์มเดี่ยวๆเท่านั้น ใช้กับฟอร์มที่มีซับฟอร์มไม่ได้ครับ กระทู้ในลิงค์ http://www.thai-access.com/yeadram_view.php?topic_id=5190 จะเหมือนกับที่คุณถาม ลองดูวิธีการที่ผมใช้ในงานของผมในคำตอบ R22423 ครับ

หรือไม่ก็อาจใช้วิธีผูกเมนฟอร์มและซับฟอร์มเข้ากับเทเบิลชั่วคราวก่อน พอกดปุ่ม Save ก็ค่อยก็อปปี้ไปเทเบิลจริงอีกที ดูที่ อ. yeadram เขียนใน http://www.thai-access.com/yeadram_view.php?topic_id=2443 นะครับ
@ ประกาศใช้งานเว็บบอร์ดใหม่ => บอร์ดเรียนรู้ Access สำหรับคนไทย
แล้วจะใส่ลิ้งอ้างอิงมาที่โพสต์เก่านี้หรือไม่ก็ตามสะดวกครับ
Time: 0.2103s