รบกวนขอ keyword ค้นหาเรื่องการดึงข้อมูลมาทำงานครับ
กระทู้เก่าบอร์ด อ.Yeadram

 2,896   16
URL.หัวข้อ / URL
รบกวนขอ keyword ค้นหาเรื่องการดึงข้อมูลมาทำงานครับ

ตอนนี้ผมสร้างฟอร์มที่ค้นหาข้อมูลจากตารางเพื่อแสดงผลและ Update รายการที่เลือกซึ่งการ Update นั้นไม่จำเป็นต้องทำกับทุก record ที่ค้นหามาแสดงก็ได้

ตัวอย่างครับ ดึงข้อมูลรายการขายโดยเลือกเงื่อนไขวันทำรายการตั้งแต่ 01/01/2013 - 05/01/2013 โดยลูกค้าชื่อ *A* กดค้นหาแสดงรายการ 18 รายการ(เปิด Form ใหม่และ set recordsource ตามที่ค้นหาครับ) จากนั้นผู้ใช้จะต้องเลือกรายการที่จะบันทึกรับเงินจากลูกค้าโดยเลือกติ๊กถูกรายการที่ต้องการจนครบแล้วจึงกดปุ่มทำรายการ โปรแกรมก็จะ update รายการโดยที่ใช้เงื่อนใขจากการค้นหา + รายการที่เลือก (Mark = yes) ครับ

ปัญหาที่พบครับ
การดึงข้อมูลมาทำงานใน form เป็นการทำงานกับตารางโดยตรงครับ เช่นถ้าติ๊กถูก(เลือกรายการ) field mark ในตารางจะถูก Update ทันทีเมื่อ User เลือก ส่งผลให้ถ้ามี User ทำรายการหลายคนจะทำให้การ Update ข้อมูลผิดพลาดได้ครับ

ผมขอรบกวน keyword หรือแนวทางการดึงข้อมูลมาทำรายการใน form โดยไม่เป็นการทำกับตารางที่ดึงข้อมูลมาโดยตรงครับ (ประมาณว่าต้องกดปุ่มทำรายการถึงจะเริ่มทำการ Update ข้อมูล) ซึ่งตอนนี้หากมีการแก้ไขใน Field ที่เปิดให้แก้ไขเพื่อทำรายการได้ข้อมูลในตารางจะถูก update โดยอัตโนมัิติครับ

หากต้องการข้อมูลเพิ่มเติมถามได้ครับ ผมไม่รู้ว่าจะอธิบายยังไงครับ
ขอบคุณครับ

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

1 @R17746
ผมว่าวิธีที่ง่ายสำหรับคุณก็คือ สร้างอีกฟิลด์ในตารางเพื่อเก็บชื่อเครื่องคอมฯของเราตอนที่เลือกเรคอร์ดนั้น พอกดปุ่มทำรายการ ก็ให้อัพเดตเฉพาะเครื่องของเราไป

ฃื่อเครื่องใช้คำสั่ง Environ("COMPUTERNAME") ในการดึงมา

ใช้ event afterupdate ของฟิลด์ mark เพื่อใส่ชื่อเครื่องลงฟิลด์ที่เพิ่มมาตอนเลือกเรคอร์ดนั้น หรือลบชื่อเครื่องออกเมื่อไม่เลือกแล้ว
2 @R17748
ตอนนี้คิดจะใช้วิธีนี้เหมือนกันครับแต่จะเป็น Field UserName เนื่องจากผมมีการกำหนดสิทธิ์เข้าถึงฟอร์มไว้ด้วย Username ครับ แต่มันจะเกิดปัญหากรณีที่ User เลือกรายการที่จะทำรายการเดียวกันพร้อมกันครับ มันจะทำให้ Username ไปบันทึกซ้ำของคนเดิม (หรือถ้าเป็น Computername ก็จะไปบันทึกทับของคนเก่าที่กำลังทำค้างอยู่) ความจริงแล้วถ้าเป็นการทำงานปกติจะไม่มีทางเป็นไปได้เลยครับที่ User จะเลือกรายการเดียวกันมาทำเพราะการทำรายการต้องอิงตามเอกสารที่ได้รับมา แต่จากประสปการ์ณที่เจอมาในระบบอื่นๆพบว่ามีเคสแปลกๆหลายๆเคสครับ ตอนนี้เลยพยายามนึกไปถึงเคสต่างๆที่จะมีโอกาสเกิดได้ครับ

ตอนนี้วิธีที่กรองการเกิดรายการผิดพลาดรูปแบบนี้ผมใช้การกำหนดสาขาของผู้ทำรายการให้สามารถค้นหาข้อมูลเพื่อมาทำรายการได้เฉพาะสาขาที่ตรงกันเท่านั้นครับ โดยให้แต่ละสาขามีคนทำรายการได้คนเดียว ส่วนสำนักงานหลักที่ให้ทำรายการได้ทุกสาขาผมใช้วิธีแบ่งช่วงเวลาทำงานครับ คิดว่าน่าจะช่วยป้องกันการเกิดปัญหานี้ได้บ้าง แต่อยากมาศึกษาเพิ่มเติมเรื่องการดึงข้อมูลมาใช้ทำรายการโดยที่ไม่เชื่อมต่อกับตารางโดยตรงครับ ประมาณว่าค้นหามาเก็บไว้ในตัวแปรหรือใน form การทำการแก้ไขข้อมูลจาก Form จะยังไม่ Update ข้อมูลในตารางอัตโนมัติจะ Update เมื่อกดปุ่มบันทึกข้อมูลอย่างเดียวครับ ผมเคยลองหัดเขียนVB ดูพบว่าตอนใช้ Control DataGridView จะได้แบบที่ต้องการเลยครับแต่ที่ทำงานไม่สะดวกกับการใช้ VB ครับ (ส่วน Control DataGridView ใน MS Access ที่ทำงานไม่สามารถใช้ได้ครับเลยไม่รู้ว่ามันจะทำงานเหมือนกันมั้ยครับ)

ตอนนี้ผมกำลังศึกษาข้อมูลเกี่ยวกับ ADODB Connection ครับยังไม่ค่อยเข้าใจหลักการการทำงานพอจะมีหนังสือหรือข้อมูลตั้งแต่เบื้องต้นไปถึงขั้นกลางสูงแนะนำมั้ยครับ และการใช้ ADODB นี่จะช่วยตาบโจทย์ที่ผมต้องการมั้ยครับ

ขอบคุณครับ
3 @R17749
เพิ่มเติมรายละเอียดเคสที่คิดไว้ครับ

User A ค้นหาข้อมูลเพื่อทำรายการ ได้ข้อมูล 1,2,3 และได้เลือกรายการ 1,3 ทำรายการค้างไว้แต่ยังไม่กดปุ่มบันทึกรายการ

จากนั้น

User B ค้นหาข้อมูลเพื่อทำรายการได้ข้อมูล 2,3,4,5,6 เลือกรายการ 2,3,5 เพื่อทำรายการค้างไว้แต่ยังไม่กดปุ่มบันทึกรายการ

*การเลือกรายการจะใช้ Field Mark เป็นแบบติ๊กถูกครับ(yes/no)
1. ตอนที่ยังไม่มี Field ชื่อเครื่องคอมหรือ User Name มาเก็บตอนจะทำรายการถ้า User A กดปุ่มบันทึก จะทำการUpdate 1,2,3 โดยเก็บชื่อผู้ทำรายการเป็น A จากนั้นเมื่อ User B ทำรายการจะทำการUpdateเฉพาะ 5 (ชื่อผู้ทำรายการเป็น B) เพราะ 2,3 เปลี่ยนสถานะไปตั้งแต่ User A ทำรายการไปแล้วครับ
**กรณีที่ User A ทำรายการด้วยจำนวนเงินที่ไม่เต็มจำนวนทั้งหมดของรายการ สถานะจะยังไม่เปลี่ยน หาก User B ทำรายการต่อจะส่งผลให้เกิดยอดติดลบได้ครับ

2. ถ้าใส่ Field ชื่อเครื่องคอมหรือ User Name เมื่อ User A กดปุ่มทำรายการจะ Update เฉพาะ 1 เท่านั้นเนื่องจาก 3 ถูกตั้งไว้ว่าเป็น User B หรื่ออีกครื่อง เป็นคนทำรายการแล้วครับ
4 @R17750
ถ้ามี 2 คนอัพเดตเรคอร์ดเดียวกันที่อยู่บนฟอร์มพร้อมๆกัน คนหลังจะได้รับการเตือนมาจาก Access เองว่าต้องการจะอัพเดตหรือจะยกเลิกมั้ย เพราะข้อมูลที่อยู่บนหน้าจอกับที่อยู่ในตารางไม่เหมือนกันแล้ว คุณสามารถเช็ค error code นี้ได้ใน Form_Error event เช็คแล้วจะยกเลิกหรือจะทำอะไรก็แล้วแต่คุณ และเพื่อป้องกันอีกชั้น ก็ต้องเช็คใน Form_BeforeUpdate event ว่า Username หรือ Computername ต่างจากเครื่องคุณหรือเปล่า

ผมไม่ถนัด ADODB ครับ มันยืดหยุ่นดี แต่ผมชอบอะไรที่ง่ายๆตรงไปตรงมาเป็นขั้นเป็นตอนมากกว่า ผมใช้ DAO ครับ แล้วก็หาอ่านจากใน Help File นี่แหล่ะ แต่ก็ยอมรับว่า Help File ของ Access ยิ่งทำยิ่งแย่ลงไปเรื่อยๆ ตย.หายไปเยอะเลย
5 @R17751
เพิ่มเติม

หลังกดปุ่มบันทึกรายการแล้ว คุณต้องล้าง Username หรือ Computer ออกไปด้วยนะ
6 @R17752
ขอลองก่อนนะครับเพราะตอนนี้ผมไปปิด setwarning เป็น false หมดเลยเดี๋ยวจะไปเปลี่ยนเป็นปิดและเปิดใหม่ครับ

ที่ปิดเพราะเวลาดึงข้อมูลมาแสดงจะให้ใีการกรอกตัวเลขให้ล่วงหน้าถ้าไม่ทำรายการจะให้คืนค่ากลับ มันเลยมี update ข้อมูลหลายครั้งครับ เดี๋ยวขอไปประชุมก่อนครับแล้วจะกลับมาลองครับ

ขอบคุณมากครับ
7 @R17753
ปกติเราจะไม่ใส่ค่าที่เตรียมไว้ล่วงหน้าแล้วบันทึกเรคอร์ดนั้นไปเลยนะครับ เราจะแค่เตรียมไว้เฉยๆเมื่อผู้ใช้เริ่มป้อนเรคอร์ดใหม่ โดยใส่โค้ดไว้ใน Form_BeforeInsert event ไม่ก็อาจจะทำโดยกำหนดว่าฟิลด์ไหนที่ผู้ใช้ไม่ป้อน ฟิลด์นั้นเราจะใส่ค่าที่เตรียมให้ไว้แทน โดยใส่โค้ดไว้ใน Form_BeforeUpdate event ก็ได้

อยากบอกว่า สำหรับโปรแกรมพวก Access หรือตัวพัฒนาโปรแกรมอื่นๆอะไรก็ตาม ที่ทำงานบางอย่างกับข้อมูลโดยอัตโนมัติ เราอย่าไปฝืนธรรมชาติของมันครับ มันมี event อะไรให้ใช้ เราก็ใช้ตามนั้น มันทำงานยังไง เราก็สร้างระบบเราให้โอนอ่อนผ่อนตามมัน แล้วชีวิตของโปรแกรมเมอร์จะมีความสุขมากขึ้น
8 @R17754
จากที่ลองมาครับหลังจากที่ setwarning = true เหมือนเดิมแล้ว ลองใช้ Form_BeforeUpdate แล้วใส่ไปว่า

me.textbox.value = me.textbox2.value

ผลปรากฎว่าแสดงเฉพาะรายการแรกครับ

แบบเดิมที่ผมใช้จะเป็นคำสั่ง update ด้วย Criteria ที่ค้นหามาครับให้ Field1 = field2 เมื่อกดยกเลิกทำรายการก็ปรับ field1 = 0 ครับ

เดี๋ยวพรุ่งนี้จะทดลองใหม่ครับ คิดว่าจะลองใช้ for loop ครับโดยนับ record เอาครับน่าจะประมาณนี้ครับ


For i = 1 to rs!rc (ตัวแปรเก็บ count record ที่ค้นหามาครับ)
me.textbox.value = me.textbox2.value
me.gotorecord , ,acnext
i = i + 1
next

ประมาณนี้ครับ แต่ตอนนี้ผมไม่ได้ลองว่าจะได้หรือไม่ ถ้ายังไงจะขอรบกวนอีกครับ

ป.ล. หลังจากที่ setwarning true แล้วลองเข้ามาใช้ทีเดียวสองเครื่องโดย query รายการแบบเดียวมาลองทำรายการ(คนละ User) พบว่า User2 สามารถเลือกรายการที่ User1 เลือกไว้แล้วได้เลยครับโดยระบบไม่แจ้งเตือนอะไรเลยครับ

ขอบคุณครับ
9 @R17756
ผู้ใช้เลือกทำเครื่องหมายเรคอร์ดไหน Form_BeforeUpdate event ของเรคอร์ดนั้นก็ทำงาน ก็ค่อยกำหนด TextBox = TextBox2 ไปเฉพาะเรคอร์ดนั้น ทำไมต้องกำหนดค่าทีนึงหลายๆเรคอร์ดครับ ทั้งๆที่เรคอร์ดอื่นแค่แสดงขึ้นมา แต่ยังไม่ได้ถูกทำเครื่องหมาย

ตกลงต้องการไม่ให้ผู้ใช้คนอื่น ทำรายการที่ผู้ใช้คนแรกได้ทำไปแล้วใช่ไหมครับ ถ้าใช่ ฟิลด์ Username ไม่ต้องเคลียร์ครับ

สรุปคือใน Form_BeforeUpdate event
- ถ้าผู้ใช้เลือกทำเครื่องหมาย คุณต้องเช็คก่อนว่าในฟิลด์ Username มันมีค่าหรือไม่ ถ้ามี เป็นผู้ใช้เครื่องนี้ด้วยหรือไม่ ถ้าไม่ ก็แปลว่าเป็นรายการของคนอื่นทำ คุณก็ต้องไม่ให้ทำต่อ แต่ถ้า Username ไม่มีค่า ก็ต้องกำหนดผู้ใช้เครื่องเราเข้าไป

- ถ้าผู้ใช้เลือกทำเครื่องหมาย คุณต้องเช็คฟิลด์ Username แบบเดียวกันหลังจากนั้นค่อยเคลียร์ Username ทิ้ง

กรณีที่คุณ ปล.มาว่าผู้ใช้คนสามารถเลือกรายการที่คนอื่นเลือกไปแล้วได้ อาจเป็นเพราะคุณไม่ได้เก็บ Username เอาไว้ หรืออาจเก็บไว้ แต่ไม่ได้เช็คก่อนตามที่ผมบอกไว้ในคำตอบนี้
10 @R17759
ขอบคุณครับ เดี๋ยวถ้ามีเวลาได้ทดลองจะมารายงานผลครับ
ผมไม่ได้คิดไปถึงในเรื่องให้ตรวจสอบว่า Field username มีค่าอยู่แล้วหรือไม่กรณีที่ User B ทำรายการซ้ำกับ User A
ส่วนเรื่อง BeforeUpdate event ผมไม่เคยลองใช้มาก่อนครับต้องขอโทาด้วยครับที่ไม่ได้ดูให้ดีเรื่องนี้ครับ
11 @R17760
แก้ที่ผิดนิดหน่อย เป็น

- ถ้าผู้ใช้เลือกไม่ทำเครื่องหมาย คุณต้องเช็คฟิลด์ Username แบบเดียวกันหลังจากนั้นค่อยเคลียร์ Username ทิ้ง
12 @R17768
ตอนนี้ลองแล้วครับ

ผมใช้วิธีกรองตั้งแต่ค้นหาตามที่อาจารย์บอกครับ หาจากรายการที่ Username = ""
ทำให้ User ต่อๆ มาจะไม่เรียกรายการที่กำลังมีคนทำรายการมาใช้ครับ ขอบคุณอาจารย์มากเลยครับ

ขอถามเพิ่มอีกนิดครับ ถ้ากรณีปิดโปรแกรมไม่ปกติโปรแกรมค้างแล้วระบบไม่ Clear Username ออก ผมทำปุ่มเพิ่มสำหรับ User Admin ให้กดล้าง Field Username เองโดยแนะนำวิธีการกดให้ Admin กดในช่วงที่ไม่น่าจะมีคนใช้งานระบบแบบนี้เหมาะสมมั้ยครับ หรืออาจารย์พอมีแนวทางแนะนำแบบอื่นสำหรับกรณีนี้ครับ

ขอบคุณครับ
13 @R17769
เหมาะสมมั้ย ? ถ้าง่ายๆก็ทำแบบที่คุณคิดไว้ก็ได้ ส่วนในระบบที่ผมทำให้ลูกค้า ตัวไฟล์ฐานข้อมูลเราอยู่บนเครื่องเซิฟเวอร์ซึ่งเปิดตลอด 24 ชม. กลางคืนอาจจะยังมีคนใช้โปรแกรมก็เป็นไปได้ ผมจะเขียนโปรแกรมเอาไว้ตัวนึงเพื่อให้มันทำงานต่างๆตอนกลางคืนเอาเอง ในโปรแกรมนี้ ผมจะเช็คไฟล์ชื่อเดียวกับฐานข้อมูลแต่มีนามสกุลเป็น .ldb (หรือ .laccdb ขึ้นกับเวอร์ชั่นของ Access ที่ใช้) ถ้าพบ แปลว่ามีคนใช้ฐานข้อมูลอยู่ โปรแกรมก็จะรอต่อไปตามเวลาที่กำหนด เมื่อไม่มีคนใช้แล้ว โปรแกรมก็จะเริ่มทำงาน โปรแกรมนี้จะยัดเข้าไปอยู่ใน Windows Schedule ครับ แล้วเราก็กำหนดใน schedule นี้เอาว่าต้องการให้มันรันโปรแกรมเมื่อไหร่เท่านั้นเอง

แต่จริงๆสิ่งที่ต้องกังวลกว่านั้นคือ ทำไมโปรแกรมถึงค้าง การที่เราปิดโปรแกรมโดยผ่าน Task Manager หรือวิธีใดๆที่ไม่ได้เป็นการปิดอย่างปกติ มันอาจทำให้ไฟล์ฐานข้อมูลเสียได้ เพราะ Access ไม่ได้เก่งกล้าสามารถถึงขนาดการันตีได้ว่าไฟล์ฐานข้อมูลจะไม่เสีย หรือจะกู้ที่เสียกลับมาได้เสมอครับ
14 @R17775
ขอบคุณครับ ตอนนี้ผมคงใช้เป็นปุ่มกดล้างไปก่อนครับ
ส่วนโปรแกรมที่เขียนให้สั่งทำงานตาม Schedule ถ้าจะลองทำต้องไปศึกษาเรื่องอะไรเพิ่มบ้างครับเผื่อจะลองหัดดูครับ
15 @R17779
ก็แค่ไปดูวิธีใช้ของ Schedule (ใน Windows 7 อยู่ใน Control Panel - System and Security - Administrative Tools ถ้าวินโดว์อื่นๆก็อยู่ใน Control Panel เหมือนกัน) เท่านั้น เราสามารถเซ็ทวัน เวลา ช่วงเวลา ให้มันทำงานได้ และกำหนดได้ว่าให้มันไปเรียกโปรแกรมอะไรมาทำงาน ส่วนตัวโปรแกรมคุณจะเขียนด้วยภาษาอะไรก็ได้ ที่ผมทำมีใช้ vbScript บ้าง ใช้ภาษา AutoIt บ้าง หรือคุณจะเขียนด้วย Access เองก็ได้ครับ แต่อย่างนึงที่จะบอกคือ โปรแกรมที่ทำงานเบื้องหลังเหล่านี้ เวลาทำงาน เราจะไม่เห็นว่ามันกำลังทำอะไรไปบ้าง ดังนั้นในโปรแกรมเหล่านี้จึงควรเขียนว่ากำลังทำงานอะไรอยู่บ้าง ทำไปถึงขั้นตอนไหนแล้ว หรือมีปัญหาอะไร ก็เขียนลงในเท็กซ์ไฟล์ธรรมดาๆนี่แหล่ะครับก็เพียงพอแล้ว เช้ามาคุณก็ดูว่ามันทำได้เรียบร้อยหรือเปล่าเท่านั้นเอง
16 @R17784
ขอบคุณครับอาจารย์ ผมจะลองศึกษาดูเพิ่มเติมครับ
@ ประกาศใช้งานเว็บบอร์ดใหม่ => บอร์ดเรียนรู้ Access สำหรับคนไทย
แล้วจะใส่ลิ้งอ้างอิงมาที่โพสต์เก่านี้หรือไม่ก็ตามสะดวกครับ
Time: 0.2599s