กระทู้เก่าบอร์ด อ.Yeadram
1,630 6
URL.หัวข้อ /
URL
ความแตกต่าง recalc refresh refreshpage requery rep
สอบถามผู้รู้เกี่ยวกับความแตกต่าง ของ recalc refresh refreshpage requery และ repaint หน่อยครับ ใช้ในกรณีไหนกันบ้าง ขอบคุณครับ
6 Reply in this Topic. Dispaly 1 pages and you are on page number 1
2 @R20688
ขอบคุณมากๆที่ให้ความรู้ครับ อ้อ! แล้ว refreshpage ด้วยครับ
3 @R20689
ไม่เคยได้ยินเลยครับ เอามาจากไหน
4 @R20697
docmd.RunCommand acCmdRefreshPage ครับ
5 @R20702
สมัย Access เวอร์ชั่นแรกๆ การจะสั่งให้ทำตามคำสั่งไหนในเมนูบาร์ ค่อนข้างจะไม่สะดวก ต่อมาก็เลยมีคำสั่ง Docmd.RunCommand ซึ่งจะเป็นคำสั่งที่เทียบเท่ากับแต่ละคำสั่งในเมนูบาร์ ปกติเวลาผมจะสั่งอะไร ผมจะดูก่อนว่ามีคำสั่งเฉพาะด้านอยู่แล้วหรือไม่ เช่น การ save record ผมก็จะสั่ง me.dirty = false หรือ refresh ผมก็จะใช้คำสั่ง [form object].Refresh ไปตรงๆเลย จะไม่มาใช้ .RunCommand
ยังไงก็ตาม ผมไปพยายามหาว่าระหว่าง acCmdRefresh ต่างจาก acCmdRefreshPage ยังไง ก็ไม่เห็นมีที่ไหนเขียนอธิบายไว้อย่างชัดๆ มีแต่บอกว่าอย่างแรกเป็นการเป็นการ refresh table ส่วนอย่างหลังเป็นการ refresh subform ซึ่งผมว่าฝรั่งนี่ก็มั่วเป็นเหมือนกัน ก็เลยยังบอกไม่ได้ว่าอะไรทำอะไรกันแน่
ยังไงก็ตาม ผมไปพยายามหาว่าระหว่าง acCmdRefresh ต่างจาก acCmdRefreshPage ยังไง ก็ไม่เห็นมีที่ไหนเขียนอธิบายไว้อย่างชัดๆ มีแต่บอกว่าอย่างแรกเป็นการเป็นการ refresh table ส่วนอย่างหลังเป็นการ refresh subform ซึ่งผมว่าฝรั่งนี่ก็มั่วเป็นเหมือนกัน ก็เลยยังบอกไม่ได้ว่าอะไรทำอะไรกันแน่
6 @R20703
ขอบคุณครับ ผมเป็นมือสมัครเล่น เวลาใช้งานคำสั่งพวกนี้ก็ใช้ไปโดยไม่รู้หลักการ ซึ่งบางครั้งก็ใช้งานได้บ้างไม่ได้บ้าง หรือ อาจทำให้โปรแกรมมีปัญหา เช่นทำงานช้า แต่ก็ไม่รู้จะแก้ไขอย่างไร เพราะถึงช้าแต่ก็ทำงานได้ (แอบพอใจนิดๆ) ขอบคุณ thai-access ที่เป็นแหล่งความรู้ที่ดีเยี่ยมครับ
Time: 0.3399s
refresh อ่านข้อมูลมาใหม่เหมือน requery แต่ไม่ประมวลผลคำสั่งใหม่ การอ่านจะอ่านเฉพาะจากเรคอร์ดที่เคยอ่านได้ ดังนั้นจำนวนเรคอร์ดที่อ่านได้ในช่วงเวลาระหว่างครั้งก่อนและครั้งใหม่จึงเท่ากัน แต่เรคอร์ดที่อ่านได้ใหม่อาจมีข้อมูลของฟิลด์ต่างๆเปลี่ยนแปลงไป หรือ เรคอร์ดที่ถูกลบไปแล้วก็จะ unavailable ซึ่งถ้าเรา refresh ผ่านหน้าฟอร์มหรือคิวรี่ จะเห็นว่ามันจะแสดงคำ #delete ออกมาในเรคอร์ดนั้นแทน ถ้า refresh ด้วยการเขียนโค้ด ก็ต้องดักจับ error ที่อาจเกิดขึ้นเมื่อจะอ่านจากแต่ละเรคอร์ดใน recordset ด้วย ส่วนเรคอร์ดที่ถูกเพิ่มเข้ามาใหม่ในช่วงเวลาดังกล่าว จะไม่ถูกอ่านเข้ามา
Repaint ใช้กับ Form object เท่านั้น เพื่อวาดหน้าจอและหาผลลัพธ์ของพวก calculated field ใหม่อีกครั้ง ไม่ได้เกี่ยวอะไรกับการอ่านข้อมูลเลย เพราะ Access อาจไม่ได้แสดงทุกอย่างทันทีที่เราสั่งเปลี่ยนแปลงข้อมูลหรืออะไรบนหน้าฟอร์มในทันที จะต้องมีเวลาว่างพอสำหรับ process เพื่อทำการแสดงและคำนวนใหม่ เราจะเห็นผลได้ชัดในโค้ดที่วนลูปเปลี่ยนแปลงข้อมูลบนหน้าฟอร์ม ถ้าแทรกคำสั่งนี้เข้าไป หน้าฟอร์มก็จะปรับปรุงทันที แต่ก็ทำให้เห็นหน้าฟอร์มกระตุกๆระหว่างลูปด้วย
Recalc ใช้กับ Form object เช่นกัน แต่ทำการคำนวนสำหรับ calculated field เท่านั้น เพราะฟิลด์ที่จะถูกคำนวนก็ต้องให้ process มีเวลาพอที่จะทำเหมือนกับ Repaint การสั่ง Recalc จะทำให้เห็นการเปลี่ยนแปลงทันที
โดยประสบการณ์ที่ผ่านมา เราไม่มีทางรู้ได้ว่าเมื่อไหร่จะต้องใช้ Repaint และ Recalc หากใส่ไปทุกที่ ก็มักเกินความจำเป็นและจอกระตุก เอาเป็นว่าเมื่อไหร่เห็นว่าระบบที่เขียนขึ้นไม่แสดงผลลัพธ์เป็นปัจจุบัน ก็ค่อยมาใส่คำสั่งพวกนี้เข้าไปแล้วกัน