การแก้ไขข้อมูลจาก ชุดข้อมูลที่ copy ไป
กระทู้เก่าบอร์ด อ.Yeadram

 3,071   12
URL.หัวข้อ / URL
การแก้ไขข้อมูลจาก ชุดข้อมูลที่ copy ไป

คือก่อนหน้านี้ ผมได้ทำปุ่ม สำหรับ copy ข้อมูลจาก record หนึ่งไปอีก record หนึ่งครับ
http://thai-access.com/yeadram_view.php?topic_id=3432

แต่ตอนที่แก้ไขข้อมูลที่ copy มากแล้ว กด save ข้อูล ปรากฎว่า ข้อมูลของต้นฉบับถูกเปลี่ยนไปด้วย เช่นยอดรวมสินค้าครับ


ถ้าเป็นแถวข้อมูลของชุดที่ไม่ได้เกิดจากการ copy ไม่มีปัญหาครับ
อันนี้เป็น code ของปุ่ม copy ครับ

Private Sub Command46_Click()
DoCmd.RunSQL " INSERT INTO T_quotation (Quotation_No,Rec_id ,quotation_date,validity,remark,discount_value,total,vat,grandtotal,grandtotal2,termofpayment,delivery_time,delivery_term,project_id,EmpID,attension,mobile,quo_email,status,InquireID,order_tendency ) SELECT A.Quotation_No , (SELECT max(A.Rec_id ) +1 FROM T_quotation as A WHERE A.Quotation_No = " & Me.Quotation_No & " AND A.Rec_id = " & Me.Rec_id & ") ,quotation_date,validity,remark,discount_value,total,vat,grandtotal,grandtotal2,termofpayment,delivery_time,delivery_term,project_id,EmpID,attension,mobile,quo_email,status,InquireID,order_tendency FROM T_quotation as A WHERE A.Quotation_No = " & Me.Quotation_No & " AND A.Rec_id = " & Me.Rec_id & ""
DoCmd.RunSQL " INSERT INTO T_quotation_detail (Quotation_No,Rec_id ,pro_id,quo_qty,quo_price,quo_disc,quo_net,quo_total,quo_type,quo_remark ) SELECT C.Quotation_No ,(SELECT max(C.Rec_id) +1 FROM T_quotation_detail as C WHERE C.Quotation_No = Quotation_No AND C.Rec_id = Rec_id),pro_id,quo_qty,quo_price,quo_disc,quo_net,quo_total,quo_type,quo_remark FROM T_quotation_detail as C WHERE C.Quotation_No = Quotation_No AND C.Rec_id = Rec_id "
Me.Requery
End Sub


ตอนแก้ไขข้อมูล ผมส่งค่า Quotation_No,Rec_id ไปครับเพื่อแก้ไขข้อมูล
Private Sub Quotation_No_Click()
DoCmd.OpenForm "frmQuotation", acNormal, , "([Quotation_No] = " & Me.Quotation_No & ") and ([Rec_id] = " & Me.Rec_id & ")", acFormEdit
End Sub


ส่วนตอนแก้ไขข้อมูลเสร็จก็เป็นปุ่ม save จากการสร้าง macro ครับ

ผมนั่งหาวิธีแก้อยู่ครับ แต่ยังหาวิธีไม่ได้ รบกวนผุ้รู้ชี้แนะด้วยครับ ขอบคุณล่วงหน้าครับ

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

1 @R16116
เดาว่าผิดตอน save อาจจะ ไม่ได้ กำหนด เงื่อนไขของ Key ไม่ถูกต้อง
2 @R16121
- คำสั่ง SQL ที่ผมให้ไป ส่วนที่ตั้งชื่อเทเบิลเป็น A และ B มันมีขอบเขตที่แน่ชัด ลองไปดูดีๆ แต่คุณตั้งไม่เหมือนผม อันนี้ก็ไม่แน่ใจเหมือนกันว่าจะมีปัญหายังไงกับผลลัพธ์หรือไม่

- ปัญหาเหมือนว่าเกิดจากการ Save ดังนั้นปุ่ม Save มีโค้ดอะไรบ้าง

- Private Sub Quotation_No_Click() มันเกี่ยวยังไงกับปัญหานี้ ทำไมถึงเอามาแสดงให้ดู ไม่เข้าใจครับ

- คุณต้องอธิบายว่า หลังจากกดปุ่ม Copy แล้ว คุณป้อนอะไร คลิกอะไรบ้าง เพราะคุณเป็นคนออกแบบเอง มีแต่คุณที่รู้ ขั้นตอนการทำงานเหล่านี้มันอาจทำให้เกิดปัญหาที่ว่าก็ได้
3 @R16134
ขออภัยที่ตอบกลับช้าครับ
ผมแก้ไขโค้ดตามที่คุณสันติสุข แนะนำแล้วครับ ในส่วนของปุ่ม copy
Private Sub Command46_Click()
DoCmd.RunSQL " INSERT INTO T_quotation (Quotation_No,Rec_id ,..,.. ) SELECT A.Quotation_No , (SELECT max(B.Rec_id ) +1 FROM T_quotation as B WHERE B.Quotation_No = " & Me.Quotation_No & " AND B.Rec_id = " & Me.Rec_id & ") ,..,.. FROM T_quotation as A WHERE A.Quotation_No = " & Me.Quotation_No & " AND A.Rec_id = " & Me.Rec_id & ""
DoCmd.RunSQL " INSERT INTO T_quotation_detail (Quotation_No,Rec_id ,..,..) SELECT C.Quotation_No ,(SELECT max(D.Rec_id) +1 FROM T_quotation_detail as D WHERE D.Quotation_No = Quotation_No AND D.Rec_id = Rec_id),..,.. FROM T_quotation_detail as C WHERE C.Quotation_No =Quotation_No AND C.Rec_id = Rec_id "
Me.Requery
End Sub


-ปุ่ม save ของฟอร์มหลัก มีโค้ดดังนี้ครับ
DoCmd.RunSQL "UPDATE T_quotation Set total= '" & Me.total & "', grandtotal= '" & Me.grandtotal & "',vatrate= '" & Me.vatrate & "',vat= '" & Me.vat & "' ,grandtotal2= '" & Me.grandtotal2 & "' WHERE Quotation_No = " & Me.Quotation_No & ", Rec_id = " & Me.Rec_id & ""
-ปุ่ม save ของฟอร์มย่อย มีโค้ดดังนี้ครับ
DoCmd.RunSQL "UPDATE T_quotation_detail Set quo_price= '" & Me.pro_price & "' ,quo_net= '" & Me.quo_net & "', quo_total= '" & Me.quo_total & "' WHERE [Quotation_No] = " & Me.Quotation_No & " And [Rec_id] = " & Me.Rec_id & " And [pro_id] = " & Me.pro_id & ""

-Private Sub Quotation_No_Click() ที่เอาให้ดูโค้ด เพราะว่าผมไม่แน่ใจว่าเป็นที่ตัวนี้หรือ เปล่าครับ เลยเอาโค้ดการส่งค่า Quotation_No,Rec_id มาให้ดูครับ

การทำงานเป็นแบบนี้ครับ
-ฟอร์มที่เกี่ยวข้อง
qryQuotation-->frmQuotationList แสดงรายการใบเสนอราคา แบบ list ครับ
qryQuotation-->frmQuotation แสดงรายการข้อมูล *มีฟิวด์ที่ใช้คำนวนราคา(total)
qryQuotationDetail -->frmQuotationDetail เป็น sub form ครับ

1. กดปุ่ม copy เพื่อคัดลอกข้อมูลใบเสนอราคา กรณีต้องการ revise ราคาใหม่ให้ลูกค้า
2.คลิกเลือกรายการที่คัดลอก เข้าไปแก้ไขข้อมูลต่างๆได้ เช่นแก้วันที่ แก้ไข เพิ่มเติมรายการสินค้าในฟอร์มย่อย
3.หลังแก้ไขเพิ่มเติมข้อมูลเสร็จ ก็กดปุ่ม save ที่ฟอร์มย่อยก่อน แล้วจึงกด save ที่ฟอร์มหลักอีกครั้งครับ
ที่ทำแบบนี้เพราะต้องการให้ข้อมูลที่มาจากการคำนวณในฟอร์มย่อย บันทึกลงตารางด้วยครับ

ปัญหาคือ เวลาแก้ไขข้อมูลที่ copy แล้ว ข้อมูลของต้นฉบับที่เปลี่ยนไปคือ ราคารวม (total) ใน frmQuotationList ครับ ซึ่งตัวนี้มาจากผลรวมของ ราคารวมใน sub form(frmQuotationDetail)
แต่พอคลิกเข้าไปดูรายละเอียดที่ frmQuotation รายการต่างๆถูกต้องครับ ทั้งๆที่ ฟิวด์ที่เอามาแสดงที่ frmQuotationList ก็เป็นฟิวด์เดียวกันที่แสดงอยู่ที่ frmQuotation
ดูใน ตาราง T_quotation,qryQuotation ราคาต้นฉบับเปลี่ยนตามใบที่คัดลอก

ผมอธิบาย งง มั๊ยครับ

ผม งง ว่า โค้ดตรงไหนที่บันทึกข้อมูลตัวที่มีปัญหาลง T_quotaion,qryQuotation ซื่งผมเอาไปทำ frmQuotationList เพือแสดงข้อมูลครับ
4 @R16135
อันนี้เป็นภาพประกอบครับ จะได้เข้าใจมากขึ้นครับ


ขอบคุณมากครับ
5 @R16136
ที่ WHERE clause ของปุ่ม Save ของฟอร์มหลัก .... WHERE Quotation_No = " & Me.Quotation_No & ", Rec_id = " & Me.Rec_id & ""    คุณแน่ใจหรือไม่ว่า Me.Rec_id เป็นเลข revision ของใบใหม่ ไม่ใช่เลขของใบเก่า หรือใบอื่นๆ วิธีเช็คคือ ก่อนบรรทัด DoCmd.RunSQL "UPDATE ... ให้ใส่บรรทัด
Msgbox Me.Rec_id ครับ
6 @R16137
คุณสันติสุขครับ

ผมแน่ใจครับ และลองใช้วิธีของคุณสันติสุข ตรวจสอบแล้ว Rec_id นั้นเป็นเลข revision ของใบใหม่จริง ครับ

อ๊อ มีอีกอาการนึงครับ เวลากด save บางครั้ง ขึ้น message box ตามภาพครับ
ไม่ทราบว่าเกียวกับอาการ save ที่มีปัญหารึเปล่าครับ แต่แค่บางครั้งครับ ส่วนผลลัพธ์ ก็เหมือนกันคือ มันไปอัพเดท ราคา ของใบเก่าด้วยครับ



ขอบคุณครับ
7 @R16138
เห็นรูปของฟอร์มแล้ว ผมค่อนข้างสับสนว่าทำไมถึงมีปุ่ม Save ทั้งๆที่ดูแล้วเหมือนว่าเป็น bound form    และ 2 รูปหลัง ชื่อก็บอกว่าเป็น Quotation List เหมือนกัน แต่ทำไมหน้าฟอร์มแตกต่างกันบ้าง ลองส่งโปรแกรมมาให้ดูได้ไหมครับ ส่งมาที่ accboard@gmail.com
8 @R16145
คุณสันติสุขครับ

ผมส่ง โปรแกรมให้ดูแล้วทาง accboard@gmail.com ครับ

แต่ผมลืม zip ไฟล์ครับ ต้องขอโทษด้วย หากไม่ได้รับยังไง ผมจะส่งให้ดูอีกครั้งครับ


ขอบคุณล่วงหน้าครับ
9 @R16153
เราจะแก้โค้ดในปุ่ม Copy ของ FrmQuotationList เปลี่ยนให้เป็นอันใหม่นี้ แล้วลองใช้งานดูครับ

Private Sub Command46_Click()
Dim NextRecID As Long


NextRecID = DMax("Rec_id", "T_quotation", "Quotation_No = " & Me.Quotation_No) + 1

DoCmd.RunSQL " INSERT INTO T_quotation (Quotation_No,Rec_id ,quotation_date,validity,remark,discount_value,total,vat,grandtotal,grandtotal2,termofpayment,delivery_time,delivery_term,project_id,EmpID,attension,mobile,quo_email,status,InquireID,order_tendency ) SELECT Quotation_No , " & NextRecID & " ,quotation_date,validity,remark,discount_value,total,vat,grandtotal,grandtotal2,termofpayment,delivery_time,delivery_term,project_id,EmpID,attension,mobile,quo_email,status,InquireID,order_tendency FROM T_quotation WHERE Quotation_No = " & Me.Quotation_No & " AND Rec_id = " & Me.Rec_id

DoCmd.RunSQL " INSERT INTO T_quotation_detail (Quotation_No,Rec_id ,pro_id,quo_qty,quo_price,quo_disc,quo_net,quo_total,quo_type,quo_remark ) SELECT Quotation_No," & NextRecID & ",pro_id,quo_qty,quo_price,quo_disc,quo_net,quo_total,quo_type,quo_remark FROM T_quotation_detail WHERE Quotation_No = " & Me.Quotation_No & " AND Rec_id = " & Me.Rec_id
Me.Requery
End Sub
10 @R16161
ขอบคุณครับ คุณสันติสุข

นำโค้ดที่ คุณสันติสุข ให้ ไปทดลองใช้งานแล้ว ได้ผลลัพธ์ ดังนี้ครับ
1.คัดลอกข้อมูลจาก เลขที่ 001 เป็นใบที่ 001 revisiion R01 ได้ไม่มีปัญหา error อะไรครับ
2.เข้าไปแก้ไขข้อมูลราคาของใบที่ คัดลอกมา ใน frmQuotation แล้ว ตอนกดปุ่ม save ได้ปกติ และกดปุ่ม close เพื่อออกมาสู่หน้า QuotationList มี message box แจ้ง ตามภาพครับ (ปุ่ม close เป็นปุ่มที่ใช้ macro สั่งให้ปิดฟอร์ม frmQuotation และเปิดฟอร์ม frmQuotationList ธรรมดาครับ ไม่ได้เขียนอะไรเพิ่มเติม)




ถ้าเลือก save record มันจะบันทึกข้อมูลต้นฉบับเป็นของตัวคัดลอกด้วย
ถ้าเลือก copy to clipboard ข้อมูลต้นฉบับจะไม่เปลี่ยนครับ ซึ่งตัวนี้ที่ผมต้องการครับ
ถ้าเลือก drop change มันก็จะไม่ บันทึกราคาที่เราแก้ไขให้ครับ เช่นส่วนลดพิเศษ เป็นต้นครับ

ผมคิดว่าน่าจะใช้งานได้แล้วครับ ปัญหาที่เกิดขึ้นนี่ ก็จะพยายามแก้ไขต่อไปครับ ต้องขอขอบคุณมากๆครับที่ให้ความกรุณาหลายครั้งเลยครับ
11 @R16170
เข้าใจแล้วว่าเกิดอะไรขึ้น คือหลังจากมีการแก้ไขค่า textbox บนฟอร์ม frmQuotation (ยกเว้นในส่วนฟอร์มย่อย frmQuotationDetail) ที่ได้ผูกเข้ากับฟิลด์ในเทเบิล T_quotation เช่น VAT หรือส่วนลด เรคอร์ดนั้นก็อยู่ในสถานะที่กำลังถูกแก้ไขผ่านหน้าฟอร์มอยู่ พอคุณกดปุ่ม Save ซึ่งสั่งคำสั่ง SQL UPDATE ให้อัพเดตเรคอร์ดเดียวกันนั้นด้วย เรคอร์ดนั้นก็อัพเดตไปตามปกติ จากนั้นพอคุณกดปุ่ม Close ซึ่งจะปิดฟอร์ม เรคอร์ดที่ยังค้างสถานะบนหน้าฟอรมก็จะถูกบันทึกเข้าไปซ้ำอีกครั้งตามพฤติกรรมของ Access เอง แต่ Access มีคุณสมบัติตรวจสอบข้อมูลให้ ถ้าพบว่าข้อมูล (ในที่นี้คือ VAT หรือส่วนลด) ที่อยู่บนฟอร์มที่กำลังจะบันทึกนั้น แตกต่างจากข้อมูลเรคอร์ดเดียวกันในเทเบิลแล้ว (ซึ่งถูกแก้ไปแล้วด้วยการกดปุ่ม Save) มันจะไม่รู้ว่าข้อมูลบนฟอร์มหรือในเทเบิล อันไหนคือตัวล่าสุดที่ถูกต้องที่สุด มันก็จะถามเราว่า จะให้ Save ข้อมูลบนฟอร์มเข้าไปแทนในเทเบิล หรือ Drop Change เพื่อไม่บันทึก หรือเปิดโอกาสให้เราตัดสินใจโดยให้เราก๊อปปี้เรคอร์ดบนฟอร์มนั้นไปลง clipboard แล้วเราไปพิจารณาเอาเอง ก่อนกลับมาทำใหม่อีกครั้ง

ดังนั้นที่อยากแนะนำเพื่อแก้ปัญหานี้ก็คือ ต้องลดให้การบันทึกเหลือเพียงขั้นตอนเดียว โดยแก้ชื่อ 4 textbox ของฟิลด์ Total, VAT, GrandTotal และ GrandTotal2 ให้เป็นชื่ออื่นแทน สมมุติมีคำว่า txt นำหน้าก็แล้วกัน อย่าลืมแก้ชื่อ textbox ในสูตรที่อิงกับ 4 textbox นี้ด้วย จากนั้นก็ใช้โค้ดนี้แทนของเดิม ตัดคำสั่ง SQL UPDATE ออกไปเลย

Private Sub Command63_Click()
     Me.total = Me.txttotal
     Me.vat = Me.txtvat
     Me.grandtotal = Me.txtgrandtotal
     Me.grandtotal2 = Me.txtgrandtotal2

     DoCmd.RunCommand acCmdSaveRecord
End Sub

จริงๆแล้ววิธีการออกแบบเทเบิลโดยให้มีฟิลด์ที่เก็บผลการคำนวนนั้น เป็นสิ่งที่โดยปกติแล้วเราไม่ทำกัน เพราะมันจะทำให้เราต้องมาวุ่นวายกับการจัดเก็บข้อมูลที่ซ้ำซ้อน และที่สามารถคำนวนออกมาได้ครับ
12 @R16172
ขอบคุณครับ คุณสันติสุข

นำโค้ดที่แนะนำไปทดลองใช้งาน แล้ว ใช้งานได้ปกติแล้วครับ ไม่มี message แจ้งเตือนจาก access และข้อมูลก็ต้องต้องตามที่ต้องการครับ ขอบคุณมากๆเลยครับ




ที่ผมเก็บเข้า ตารางด้วยนี่ เพราะว่า ทางผู้ใช้เค้าต้องการให้ลิ้งข้อมูลออกไปยัง excel ได้ สำหรับจะไปทำกราฟ ทำแผนภูมิอะไรอีกต่างๆครับ ผมเองก็เข้าใจว่าอาจจะต้องดึงส่วนที่เป็นข้อมูลในตารางออกไป (อันนี้คิดเอาเองครับ ยังไม่ได้ศึกษาหาวิธีการเชื่อมโยงไปยัง excel แบบละเอียดแต่ดูในหนังสือบ้างแล้วครับ)

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