กระทู้เก่าบอร์ด อ.Yeadram
3,309 4
URL.หัวข้อ /
URL
save access
สวัสดีค่ะ
พอดีตอนนี้ทำฐานข้อมูลน่ะค่ะ เวลาใช้งานเปิดหน้าฟอร์มอ่าค่ะ
พอมีบังเอิญไปเขียนทับ มันทำการเซฟข้อมูลอัตโนมัติโดยไม่ต้องกดปุ่มเซฟ
ทำให้มีปัญหา
จะต้องทำยังไงค่ะ
เพื่อไม่ให้มันเซฟอัตโนมัติ
ขอบคุณล่วงหน้าค่ะ
พอดีตอนนี้ทำฐานข้อมูลน่ะค่ะ เวลาใช้งานเปิดหน้าฟอร์มอ่าค่ะ
พอมีบังเอิญไปเขียนทับ มันทำการเซฟข้อมูลอัตโนมัติโดยไม่ต้องกดปุ่มเซฟ
ทำให้มีปัญหา
จะต้องทำยังไงค่ะ
เพื่อไม่ให้มันเซฟอัตโนมัติ
ขอบคุณล่วงหน้าค่ะ
4 Reply in this Topic. Dispaly 1 pages and you are on page number 1
2 @R05998
ขอบคุณสำหรับคำตอบน่ะค่ะ
สำหรับดิฉัน เรื่องaccess คงอยู่ในระดับต้นๆ
การทำมาโครพอทำได้บ้าง แต่ให้เขียนให้คำสั่ง vbaเองคงทำไม่ได้ทั้งหมด
ได้อย่างมากก็แค่เข้าใจว่าโคดนี้ต้องการอะไร
แต่ว่าจะให้เขียนเองคงไม่ได้ค่ะ
ความรู้ขั้นต้นอย่างดิฉัน จะสามารถทำแนวทางที่สามได้ไหมค่ะ
ขอบคุณล่วงหน้าค่ะ
สำหรับดิฉัน เรื่องaccess คงอยู่ในระดับต้นๆ
การทำมาโครพอทำได้บ้าง แต่ให้เขียนให้คำสั่ง vbaเองคงทำไม่ได้ทั้งหมด
ได้อย่างมากก็แค่เข้าใจว่าโคดนี้ต้องการอะไร
แต่ว่าจะให้เขียนเองคงไม่ได้ค่ะ
ความรู้ขั้นต้นอย่างดิฉัน จะสามารถทำแนวทางที่สามได้ไหมค่ะ
ขอบคุณล่วงหน้าค่ะ
3 @R06007
สมมติว่า คุณมีฟิลด์ข้อมูลชือ Item1
แล้วคุณให้แสดงผลใน textbox ชื่อว่า txItem1 (ควรตั้งชื่อคอนโทรลอย่าให้ซ้ำกับชื่อฟิลด์)
ให้คุณประกาศตัวแปรสาธารณะ ไว้ส่วนบนของโมดูลฟอร์มนี้ก่อน
Option Explicit
Dim tmpFocus As variant
-----------------------------------------
ต่อไปเขียนโค้ดในเหตุการณ์ "เมื่อได้รับโฟกัส" ของคอนโทรลที่เราต้องการ
Private Sub txItem1_gotfocus()
' เก็บข้อมูลเท่าที่มีเข้าตัวแปรก่อนเลย
tmpFocust=txItem1.text
End sub
ต่อไปดักจับเหตุการณ์ก่อนทีคอนโทรลตัวนี้จะบันทึกข้อมูล ด้วยการเขียนโค้ดฝังในเหตุการณ์ "ก่อนการปรับปรุง"
Private sub txItem1_BeforeUpdate(Cancel as integer)
' อาจจะเพิ่มความยุ่งยากให้ผู้ใช้สักนิดด้วยการใช้ msgbox (ผมไม่แนะนำนัก เพราะผู้ใช้อาจรำคาญได้เมื่อเข้าทำงานส่วนนี้บ่อยๆ แต่ผมเอามาฝากเอามาวางเพื่อให้คุณหมุบหมับเข้าใจ ลำดับเหตุการณ์ง่ายขึ้นเท่านั้น)
if txItem.text<>tmpFocus then
if msgbox("คุณกำลังแก้ไขข้อมูลจากเดิมคือ " & tmpFocus & vbcrlf & "ยันยืนว่าจะแก้ไขหรือไม่",vbyesno)<>vbYes then cancel=true
end if
tmpFocus=Empty
End sub
โปรดสังเกต
- เราไม่ได้สั่งการกับชื่อฟิลด์เลยนะครับ เราสั่งการกับคอนโทรลเท่านั้น
- ในคอนโทรล 1 ตัวคุณต้องเขียนโค้ดอย่างน้อยๆ 2 เหตุการณ์ (ยิ่งมีคอนโทรลเยอะโค้ดก็ยิ่งเยอะเท่าตัวนะครับ อิอิ)
- อย่างไรก็ตาม ผมอยากให้คุณหมุบหมับมุ่งมั่นที่จะฝึกต่อไป เพื่อก้าวไปสู่อีกขั้นให้ได้ เพราะจริงๆ แล้วความต้องการของคุณหมุบหมับจะได้รับการตอบสนองด้วยดีที่สุด คือวิธี Unbound Control ครับ **
** หลักการเดียวกัน กับการเขียนโปรแกรมด้วยภาษาอื่นๆ ที่ไม่มีดาต้าเบสเป็นของตัวเอง เช่น asp, html, java, php, vb ฯลฯ เขาจะปล่อยให้ผู้ใช้กรอกข้อมูล ปรับเปลี่ยนข้อมูลจนพอใจ ส่วนจะบันทึกหรือไม่บันทึก นั้นขึ้นอยู่กับว่าข้อมูลเหล่านั้นจะผ่านการตรวจสอบหรือไม่ ซึ่งการตรวจสอบทั้งหมด จะกระทำในเหตุการณ์เดียวกันเท่านั้น ซึ่งมักจะเห็นบ่อยๆ คือเมื่อคลิ๊กปุ่ม "บันทึก"
แล้วคุณให้แสดงผลใน textbox ชื่อว่า txItem1 (ควรตั้งชื่อคอนโทรลอย่าให้ซ้ำกับชื่อฟิลด์)
ให้คุณประกาศตัวแปรสาธารณะ ไว้ส่วนบนของโมดูลฟอร์มนี้ก่อน
Option Explicit
Dim tmpFocus As variant
-----------------------------------------
ต่อไปเขียนโค้ดในเหตุการณ์ "เมื่อได้รับโฟกัส" ของคอนโทรลที่เราต้องการ
Private Sub txItem1_gotfocus()
' เก็บข้อมูลเท่าที่มีเข้าตัวแปรก่อนเลย
tmpFocust=txItem1.text
End sub
ต่อไปดักจับเหตุการณ์ก่อนทีคอนโทรลตัวนี้จะบันทึกข้อมูล ด้วยการเขียนโค้ดฝังในเหตุการณ์ "ก่อนการปรับปรุง"
Private sub txItem1_BeforeUpdate(Cancel as integer)
' อาจจะเพิ่มความยุ่งยากให้ผู้ใช้สักนิดด้วยการใช้ msgbox (ผมไม่แนะนำนัก เพราะผู้ใช้อาจรำคาญได้เมื่อเข้าทำงานส่วนนี้บ่อยๆ แต่ผมเอามาฝากเอามาวางเพื่อให้คุณหมุบหมับเข้าใจ ลำดับเหตุการณ์ง่ายขึ้นเท่านั้น)
if txItem.text<>tmpFocus then
if msgbox("คุณกำลังแก้ไขข้อมูลจากเดิมคือ " & tmpFocus & vbcrlf & "ยันยืนว่าจะแก้ไขหรือไม่",vbyesno)<>vbYes then cancel=true
end if
tmpFocus=Empty
End sub
โปรดสังเกต
- เราไม่ได้สั่งการกับชื่อฟิลด์เลยนะครับ เราสั่งการกับคอนโทรลเท่านั้น
- ในคอนโทรล 1 ตัวคุณต้องเขียนโค้ดอย่างน้อยๆ 2 เหตุการณ์ (ยิ่งมีคอนโทรลเยอะโค้ดก็ยิ่งเยอะเท่าตัวนะครับ อิอิ)
- อย่างไรก็ตาม ผมอยากให้คุณหมุบหมับมุ่งมั่นที่จะฝึกต่อไป เพื่อก้าวไปสู่อีกขั้นให้ได้ เพราะจริงๆ แล้วความต้องการของคุณหมุบหมับจะได้รับการตอบสนองด้วยดีที่สุด คือวิธี Unbound Control ครับ **
** หลักการเดียวกัน กับการเขียนโปรแกรมด้วยภาษาอื่นๆ ที่ไม่มีดาต้าเบสเป็นของตัวเอง เช่น asp, html, java, php, vb ฯลฯ เขาจะปล่อยให้ผู้ใช้กรอกข้อมูล ปรับเปลี่ยนข้อมูลจนพอใจ ส่วนจะบันทึกหรือไม่บันทึก นั้นขึ้นอยู่กับว่าข้อมูลเหล่านั้นจะผ่านการตรวจสอบหรือไม่ ซึ่งการตรวจสอบทั้งหมด จะกระทำในเหตุการณ์เดียวกันเท่านั้น ซึ่งมักจะเห็นบ่อยๆ คือเมื่อคลิ๊กปุ่ม "บันทึก"
4 @R06101
ขอบคุณมากค่ะ
สำหรับคำแนะนำ
คงใช้วิธีนี้ได้ค่ะ
เพราะคนที่ใช้มีตัวหนูคนเดียว
คงไม่รำคาญไร
ขอบคุณมากๆน่ะค่ะ
สำหรับคำแนะนำ
คงใช้วิธีนี้ได้ค่ะ
เพราะคนที่ใช้มีตัวหนูคนเดียว
คงไม่รำคาญไร
ขอบคุณมากๆน่ะค่ะ
Time: 0.3165s
ความต้องการของคุณหมุบหมับ จะบังคับให้คุณหมุบหมับ ยกระดับทั้งความเข้าใจและฝีมือของคุณเองให้เลื่อนจาก "ขั้นต้น" ไปสู่ "ขั้นกลาง" และสู้ขั้นสูงต่อไป
ก่อนจะแนะวิธีต่างๆ (ซึ่งก็มีหลายวิธี) จึงอยากทราบว่า คุณหมุบหมับเองพอจะใช้อะไรได้บ้างแล้ว
- การฝังโค้ดในเหตุการณ์ ทำเป็นหรือเปล่า
- การใช้ มาโคร เป็นหรือไม่ หรือคล่องแค่ไหน
ถ้าให้แนวทางคร่าวๆ จะไปต่อด้วยตัวเองได้หรือเปล่า
แนวทางที่ 1
การกำหนดคุณสมบัติของฟอร์ม ให้แก้ไขข้อมูล (yes / no)
....แนวทางนี้ อาจจะไม่จำเป็นต้องมีปุ่ม save....
คุณสามารถใช้มาโคร หรือเขียนเป็นโค้ด VBA สั่งให้มัน yes หรือสั่งให้มัน No ได้หรือเปล่า
แนวทางที่ 2
การสร้างฟอร์มแบบ unbound control
...แนวทางนี้ จำเป็นอย่างยิ่งต้องมีปุ่ม save....
แนวทางนี้ต้องเขียนโค้ดได้อย่างคล่องจริงๆ เพราะเขียนโค้ดเยอะมากๆ
แนวทางที่ 3
แนวทางนี้ จะมีปุ่ม save หรือไม่มีก็ได้ แล้วแต่ความต้องการ
สองแนวทางข้างต้นสามารถกำหนดข้อจำกัดได้ทั้งฟอร์มหมายความว่า ไม่ว่าบนฟอร์มจะมี คอนโทรลกี่ชนิด หรือกี่ตัวก็ตามสามารถควบคุมได้พร้อมๆ กัน สำหรับแนวทางที่ 3 นี้ ก็คือ เราจะควบคุม, ตรวจสอบ, ป้องกัน ทีละคอนโทรล อย่างเช่น เมื่อผู้ใช้เอาเคอร์เซอร์เข้ามาวางในคอนโทรลตัวนี้ เราก็จะมีโค้ดไว้คอยระวังป้องกันทันที อาจต้องใช้สองเหตุการณ์ควบคู่กัน เช่น onfocus + afterupdate ซึ่งแนวทางนี้ก็ต้องเขียนด้วยโค้ด VBA เช่นกัน
ตอบยาวไปหน่อย หวังว่าคงไม่รำคาญในการอ่าน แต่ว่าสำหรับคำถามนี้ มันก็ต้องตอบแบบนี้แหละครับ ขอให้เข้าใจว่า บางที คำถามสั้นๆ เข้าใจง่ายๆ อาจลำบากมากๆ ในการหาคำจัดความเพื่อจะตอบ