กระทู้เก่าบอร์ด อ.Yeadram
1,088 2
URL.หัวข้อ /
URL
สอบถาม multi-User VS Running No.
สวัสดีครับอาจารย์
ผมมีปัญหากับเรื่องการสร้าง Running No กับ Multi user ครับ
ขออธิบายขั้นตอนการสร้าง Running ครับ
มี table หลัก , Log , SumLog
ตารางหลัก กับ Log เป็นข้อมูลรายละเอียดรายการ
ส่วน SumLog เป็นข้อมูลสรุปของ Log อีกทีครับ (ข้อมูลเป็นแบบ 1 : m ครับ)
ขั้นตอนทำงานครับ
1. เมื่อ user ทำรายการจะดึงข้อมูลตาราง หลัก เข้ามาทำรายการ
2. หลังจาก user กดยืนยันทำรายการ จะทำการ Append ข้อมูลที่ทำรายการเข้าสู่ตาราง Log ครับ (ข้อมูลที่ทำแต่ละครั้งสามารถทำหลายรายการพร้อมกันได้) โดยจะยังไม่ระบุ Running No ในตาราง Log
3. จากนั้นจะทำการสร้าง Running No ในตาราง Log ครับ ขั้นตอนการสร้างตามนี้ครับ
3.1 ค้นหาข้อมูลในตาราง Log ที่มีข้อมูล Running No. เป็นค่าว่าง
3.2 ตรวจสอบเงื่อนไขสร้าง Running ครับเพื่อให้ได้ Running มาครับ text + year + running (โดยดึงข้อมูล Running ที่มีค่าสูงสุดมาใช้ครับ)
3.3 Update ข้อมูล running ที่ได้ลงไปในตาราง Log ครับ
*สมมุติว่ารายการที่ทำครั้งนี้มี 3 record คือ A, B, C และมี Running เดิม คือ TS201405214 ทั้งสามรายการ (A, B, C) จะได้ Running No = TS20145215 ทั้งสามรายการครับ)
4. เมื่อบันทึก Running ในตาราง Log แล้วจะทำการ Append ข้อมู,การทำรายการครั้งนี้ไปตาราง SumLog โดยรวบสามรายการ (A, B, C) ให้เป็น 1 รายการครับ ได้เป็นรายการ TS20145215 รายการเดียว (รวมยอดจำนวนเงินของ A, B, C)
### ปัญหาที่เจอครับ ###
เกิดจากกรณีที่ User ทำรายการพร้อมกัน(ในวินาทีเดียวกัน) กลายเป็นข้อมูลรายการที่ทำของทั้ง 2 user สร้าง Running ที่ซ้ำกันครับ
เช่น :
User 1 ทำรายการ P ,R มา
User 2 ทำรายการ X ,Y ,Z มา
ถ้ากดทำรายการมาข้อมูลทั้งหมด P ,R ,X ,Y ,Z จะกลายเป็น running เดียวกันและทั้ง 5 รายการจะถุกรวบไปเป็นยอดรวมในตาราง SumLog ครับซึ่งที่ถูกต้องจะต้องแยกเป็น 2 รายการครับ
มีอาจารย์ท่านไหนเคยเจอเคสแบบนี้มั้ยครับ ผมอยากทราบว่าควรปรับปรุงการ running นี้ให้เป็นแบบไหนได้บ้างครับ
*สำหรับ Running No นี้ไม่เป็น require field ครับ เนื่องจากรองรับกรณีที่เป็นค่าว่างได้
รบกวนด้วยครับ
ผมมีปัญหากับเรื่องการสร้าง Running No กับ Multi user ครับ
ขออธิบายขั้นตอนการสร้าง Running ครับ
มี table หลัก , Log , SumLog
ตารางหลัก กับ Log เป็นข้อมูลรายละเอียดรายการ
ส่วน SumLog เป็นข้อมูลสรุปของ Log อีกทีครับ (ข้อมูลเป็นแบบ 1 : m ครับ)
ขั้นตอนทำงานครับ
1. เมื่อ user ทำรายการจะดึงข้อมูลตาราง หลัก เข้ามาทำรายการ
2. หลังจาก user กดยืนยันทำรายการ จะทำการ Append ข้อมูลที่ทำรายการเข้าสู่ตาราง Log ครับ (ข้อมูลที่ทำแต่ละครั้งสามารถทำหลายรายการพร้อมกันได้) โดยจะยังไม่ระบุ Running No ในตาราง Log
3. จากนั้นจะทำการสร้าง Running No ในตาราง Log ครับ ขั้นตอนการสร้างตามนี้ครับ
3.1 ค้นหาข้อมูลในตาราง Log ที่มีข้อมูล Running No. เป็นค่าว่าง
3.2 ตรวจสอบเงื่อนไขสร้าง Running ครับเพื่อให้ได้ Running มาครับ text + year + running (โดยดึงข้อมูล Running ที่มีค่าสูงสุดมาใช้ครับ)
3.3 Update ข้อมูล running ที่ได้ลงไปในตาราง Log ครับ
*สมมุติว่ารายการที่ทำครั้งนี้มี 3 record คือ A, B, C และมี Running เดิม คือ TS201405214 ทั้งสามรายการ (A, B, C) จะได้ Running No = TS20145215 ทั้งสามรายการครับ)
4. เมื่อบันทึก Running ในตาราง Log แล้วจะทำการ Append ข้อมู,การทำรายการครั้งนี้ไปตาราง SumLog โดยรวบสามรายการ (A, B, C) ให้เป็น 1 รายการครับ ได้เป็นรายการ TS20145215 รายการเดียว (รวมยอดจำนวนเงินของ A, B, C)
### ปัญหาที่เจอครับ ###
เกิดจากกรณีที่ User ทำรายการพร้อมกัน(ในวินาทีเดียวกัน) กลายเป็นข้อมูลรายการที่ทำของทั้ง 2 user สร้าง Running ที่ซ้ำกันครับ
เช่น :
User 1 ทำรายการ P ,R มา
User 2 ทำรายการ X ,Y ,Z มา
ถ้ากดทำรายการมาข้อมูลทั้งหมด P ,R ,X ,Y ,Z จะกลายเป็น running เดียวกันและทั้ง 5 รายการจะถุกรวบไปเป็นยอดรวมในตาราง SumLog ครับซึ่งที่ถูกต้องจะต้องแยกเป็น 2 รายการครับ
มีอาจารย์ท่านไหนเคยเจอเคสแบบนี้มั้ยครับ ผมอยากทราบว่าควรปรับปรุงการ running นี้ให้เป็นแบบไหนได้บ้างครับ
*สำหรับ Running No นี้ไม่เป็น require field ครับ เนื่องจากรองรับกรณีที่เป็นค่าว่างได้
รบกวนด้วยครับ
2 Reply in this Topic. Dispaly 1 pages and you are on page number 1
2 @R19484
ได้แล้วครับขอบคุณครับ
Time: 0.3245s
ถ้าข้อ 3 และ 4 ทำต่อเนื่องกันไปในขั้นตอนเดียว คือไม่ใช่ต้องมาคลิกหรือกดอะไรค่อยทำข้อ 4 การแก้ปัญหาก็คือ
1. ฟิลด์ Running No ในตาราง SumLog จะต้องเป็น primary key หรือไม่ก็ต้องเป็น unique index (หวังว่าใน SumLog จะไม่มีเรคอร์ดที่มีค่ารันนิ่งซ้ำกันได้นะครับ)
2. ใช้คำสั่งของ Transaction Control (BeginTrans, CommitTrans, Rollback) คลุมข้อ 2 ถึง 4 เอาไว้ ดังนั้นถ้าผู้ใช้อีกคนสร้างเลขรันนิ่งใน SumLog ตรงกันกับที่อีกคนกำลังสร้างหรือได้สร้างไปแล้ว ก็จะเกิด error ในโปรแกรม เราก็เพียงสั่ง Roolback ดังนั้นการอัพเดตใดๆลงตารางต่างๆภายใต้การครอบของ Transaction Control ก็จะถูกยกเลิกไป ก็เพียงแต่แสดงข้อความบอกผู้ที่ถูกยกเลิกให้กดยืนยันทำรายการใหม่อีกครั้งเท่านั้นเอง