กระทู้เก่าบอร์ด อ.Yeadram
13,306 31
URL.หัวข้อ /
URL
อยาก sum ได้ผล sum report ในแต่ละหน้า
สวัสดีค่ะ
ต้องการให้ sum ในแต่ละหน้า จะทำยังไงอ่ะค่ะ
ขอบคุณล่วงหน้าค่ะ
ต้องการให้ sum ในแต่ละหน้า จะทำยังไงอ่ะค่ะ
ขอบคุณล่วงหน้าค่ะ
31 Reply in this Topic. Dispaly 2 pages and you are on page number 2
21 @R00762
ไม่เหมือนกับบนหน้าจอ ที่ได้ยอดถูกต้อง
22 @R00763
เวลาสั่งพิมพ์ คุณสั่งพิมพ์เฉพาะหน้าหรือไม่ เช่น พิมพ์หน้าสุดท้ายเท่านั้น ลองสั่งพิมพ์ตั้งแต่หน้าแรกถึงหน้าสุดท้ายครับ เพราะอย่างไรเสียสิ่งที่พิมพ์ก็ไม่ควรต่างจากสิ่งที่ปรากฏบนหน้าจอ
ไม่ก็กำหนดขนาดของกระดาษในตอนทำ Design View จากเมนู File>Page Setup ให้ตรงกับกระดาษจริงที่จะพิมพ์ด้วย
ไม่ก็กำหนดขนาดของกระดาษในตอนทำ Design View จากเมนู File>Page Setup ให้ตรงกับกระดาษจริงที่จะพิมพ์ด้วย
23 @R00764
สวัสดีค่ะคุณสันติสุข ใจดีจริงๆ เลย...
ตอนสั่งพิมพ์ สั่งทุกหน้าค่ะ ตั้งแต่หน้าแรกถึงหน้าสุดท้าย
ถ้ากำหนดเป็นหน้าเมื่อสักครู่ลองดู ได้ตัวเลขที่ PageSum เป็น 0 ทุกหน้าค่ะ
ตอนสั่งพิมพ์ สั่งทุกหน้าค่ะ ตั้งแต่หน้าแรกถึงหน้าสุดท้าย
ถ้ากำหนดเป็นหน้าเมื่อสักครู่ลองดู ได้ตัวเลขที่ PageSum เป็น 0 ทุกหน้าค่ะ
24 @R00765
แต่ถ้า Print ทุกหน้า
ตัวอย่างความแตกต่างกันก็คือ
หน้าแรก PageSum ได้ยอดรวมที่หน้าจอ 437,101.20 แต่สั่งพิมพ์ออกมาได้ -601,462.00
หน้า 2 PageSum ได้ยอดรวมที่หน้าจอ 576,506.00 สั่งพิมพ์ได้ยอดตรงกัน
หน้า 3 PageSum ได้ยอดรวมที่หน้าจอ 24,956.00 สั่งพิมพ์ได้ยอดตรงกัน
ติดลบ แปลกๆ อยู่ที่หน้าแรกอ่ะค่ะ
ตัวอย่างความแตกต่างกันก็คือ
หน้าแรก PageSum ได้ยอดรวมที่หน้าจอ 437,101.20 แต่สั่งพิมพ์ออกมาได้ -601,462.00
หน้า 2 PageSum ได้ยอดรวมที่หน้าจอ 576,506.00 สั่งพิมพ์ได้ยอดตรงกัน
หน้า 3 PageSum ได้ยอดรวมที่หน้าจอ 24,956.00 สั่งพิมพ์ได้ยอดตรงกัน
ติดลบ แปลกๆ อยู่ที่หน้าแรกอ่ะค่ะ
25 @R00766
1) แน่ใจหรือไม่ว่าคำสั่งต่างๆอยู่ใน Private Sub PageFooterSection_Print มันต้องไม่อยู่ใน Private Sub PageFooterSection_Format นะครับ
2) ถ้าแน่ใจว่าข้อ 1) ก็ถูกต้องแล้วและยังแก้ไขไม่ได้ ก็ให้ลองแทรกบรรทัดนี้ เข้าไปก่อนบรรทัดแรกใน Private Sub PageFooterSection_Print ด้วย
if me.page = 1 then x = 0
ปล.ช่วยเขียนตอบมาใน Message เดียวดีกว่านะครับ เขียนแยกหลาย Message แล้วเดี๋ยวจะขึ้นหน้าใหม่ มันอ่านค่อนข้างลำบากครับ
2) ถ้าแน่ใจว่าข้อ 1) ก็ถูกต้องแล้วและยังแก้ไขไม่ได้ ก็ให้ลองแทรกบรรทัดนี้ เข้าไปก่อนบรรทัดแรกใน Private Sub PageFooterSection_Print ด้วย
if me.page = 1 then x = 0
ปล.ช่วยเขียนตอบมาใน Message เดียวดีกว่านะครับ เขียนแยกหลาย Message แล้วเดี๋ยวจะขึ้นหน้าใหม่ มันอ่านค่อนข้างลำบากครับ
26 @R00769
ก่อนนี้ยังคิดไม่ออกว่าทำไมถึงค้างค่าเก่า แต่พอไปเจอคำถามนึงที่คล้ายกันก็เพิ่งจะร้องอ๋อ.. ก็เลยจะโพสเอาไว้เพื่อบอกให้คนอื่นรู้ด้วยว่าเหตุเพราะเมื่อ Preview ค่า x จะถูก initialize เป็น 0 (ศูนย์) จากคำสั่ง Dim x as double อยู่แล้ว ตรงนี้ก็ไม่มีปัญหาอะไร แต่หลัง Preview แล้ว Print จาก Preview ทันที ดังนั้นค่า x จึงยังคงค่าสุดท้ายของผลรวมในหน้าสุดท้ายเอาไว้ (ซึ่งเท่ากับ 437,101.20 + 576,506.00 + 24,956.00 = 1,038,563.20) พอพิมพ์หน้าแรกจริงต่อกันไปทันที ผลรวมของหน้าแรกก็เท่ากับ me!runsum - x ซึ่งก็ได้เท่ากับ 437,101.20 - 1,038,563.20 ก็เลยพิมพ์ออกมาเป็น -601,462.00
ดังนั้นตามที่ผมบอกก็ควรจะแก้ปัญหาที่ว่านี้ได้ เพราะเป็นการล้างค่า x ให้เป็นศูนย์ทุกครั้งที่เป็นหน้า 1
ดังนั้นตามที่ผมบอกก็ควรจะแก้ปัญหาที่ว่านี้ได้ เพราะเป็นการล้างค่า x ให้เป็นศูนย์ทุกครั้งที่เป็นหน้า 1
27 @R13991
Reports: Totals Running sum per page
เท่าที่ค้นหาดูใน บอร์ด การทำ Running sum per page มีปัญหาการ initialize เป็น 0 (ศูนย์) จากคำสั่ง Dim x as double (จะได้ผลดี จากรายงานที่เป็นหน้าที่ 1 หากเป็นหน้าที่มากกว่า 1 หลังจาก Preview ค่า x จะไม่คืนค่า เป็น 0 ทำให้เกิดปัญหา เมื่อ Print out จะไดผลที่ไม่ตรงกับ Preview) จาก Code ด้านล้างนี้ ไม่ทำให้เกิดปัญหาดังกลาว จากการที่ได้ทดลองใช้ดู.....
Each section of a report has a Format event, where you can alter properties such as Visible, Color, Size, etc in a manner similar to the Current in a form. (See Runtime Properties: Forms for details.) For example to force a page break when certain conditions are met, include a PageBreak control in the Detail Section and toggle its Visible property. In addition, the Print event can be used to perform tasks like adding the current record to a running total.
You have an Amount field, and want to display the Amount total for that page in the Page Footer. Totals are not normally available in the Page Footer, but the task requires just four lines of code!
In the PageHeader's Format event procedure, add:
curTotal = 0 'Reset the sum to zero each new Page.
In the DetailSection's Print event, add:
If PrintCount = 1 Then curTotal = curTotal + Me.Amount
Place an unbound control called PageTotal in the Page Footer. In the PageFooter's Format, add:
Me.PageTotal = curTotal
In the Code Window under Declarations enter:
Option Explicit 'Optional, but recommended for every module.
Dim curTotal As Currency 'Variable to sum [Amount] over a Page.In the PageHeader's Format event procedure, add: curTotal = 0 'Reset the sum to zero each new Page.
เท่าที่ค้นหาดูใน บอร์ด การทำ Running sum per page มีปัญหาการ initialize เป็น 0 (ศูนย์) จากคำสั่ง Dim x as double (จะได้ผลดี จากรายงานที่เป็นหน้าที่ 1 หากเป็นหน้าที่มากกว่า 1 หลังจาก Preview ค่า x จะไม่คืนค่า เป็น 0 ทำให้เกิดปัญหา เมื่อ Print out จะไดผลที่ไม่ตรงกับ Preview) จาก Code ด้านล้างนี้ ไม่ทำให้เกิดปัญหาดังกลาว จากการที่ได้ทดลองใช้ดู.....
Each section of a report has a Format event, where you can alter properties such as Visible, Color, Size, etc in a manner similar to the Current in a form. (See Runtime Properties: Forms for details.) For example to force a page break when certain conditions are met, include a PageBreak control in the Detail Section and toggle its Visible property. In addition, the Print event can be used to perform tasks like adding the current record to a running total.
You have an Amount field, and want to display the Amount total for that page in the Page Footer. Totals are not normally available in the Page Footer, but the task requires just four lines of code!
In the PageHeader's Format event procedure, add:
curTotal = 0 'Reset the sum to zero each new Page.
In the DetailSection's Print event, add:
If PrintCount = 1 Then curTotal = curTotal + Me.Amount
Place an unbound control called PageTotal in the Page Footer. In the PageFooter's Format, add:
Me.PageTotal = curTotal
In the Code Window under Declarations enter:
Option Explicit 'Optional, but recommended for every module.
Dim curTotal As Currency 'Variable to sum [Amount] over a Page.In the PageHeader's Format event procedure, add: curTotal = 0 'Reset the sum to zero each new Page.
28 @R13992
แก้ไขครับ....
In the PageHeader's Format event procedure, add:
curTotal = 0 'Reset the sum to zero each new Page.
In the DetailSection's Print event, add:
If PrintCount = 1 Then curTotal = curTotal + Me.Amount
Place an unbound control called PageTotal in the Page Footer. In the PageFooter's Format, add:
Me.PageTotal = curTotal
In the Code Window under Declarations enter:
Option Explicit 'Optional, but recommended for every module.
Dim curTotal As Currency 'Variable to sum [Amount] over a Page
In the PageHeader's Format event procedure, add:
curTotal = 0 'Reset the sum to zero each new Page.
In the DetailSection's Print event, add:
If PrintCount = 1 Then curTotal = curTotal + Me.Amount
Place an unbound control called PageTotal in the Page Footer. In the PageFooter's Format, add:
Me.PageTotal = curTotal
In the Code Window under Declarations enter:
Option Explicit 'Optional, but recommended for every module.
Dim curTotal As Currency 'Variable to sum [Amount] over a Page
29 @R13994
โค้ดที่คุณแหลมทองเอามาแสดง เป็นโค้ดจากเซียน Access คือ Allen Browne แต่โค้ดแแบบนี้ Microsoft เองกลับไม่ได้แนะนำ ทั้งๆที่มันดูออกจะง่ายและตรงไปตรงมา ในกรณีปัญหาการทำ Page Sum ผมเชื่อวิธีการของ Microsoft นะ ไม่ใช่โค้ดของ Allen Browne ใช้ไม่ได้ แต่มันอาจไม่เสมอไปที่จะได้ค่า Page Sum ที่ถูกต้องด้วยโค้ดแบบเขา เหตุผลส่วนตัวของผมเองที่พอจะอธิบายคือ ในการจัดหน้ากระดาษรายงาน 1 หน้านั้น อาจมีการเรียกใช้ Format หรือ Print event ของแต่ละ section มากกว่า 1 ครั้งก็ได้ ขึ้นกับเงื่อนไขที่ส่วนใหญ่เกี่ยวกับการจัดหน้ากระดาษ เช่น การจัด Format ครั้งแรก (ค่า FormatCount เป็น 1) อาจทำให้พิมพ์ได้ 10 บรรทัด ด้วยโค้ดของ Allen Browne คุณจะบวกกัน 10 ครั้ง แต่พอเจอเงื่อนไขบางอย่าง ทำให้ Access ต้องจัดหน้ากระดาษใหม่ในครั้งที่ 2 (ค่า FormatCount เป็น 2) ซึ่งอาจทำให้จำนวนบรรทัดที่จะได้พิมพ์จริงแตกต่างจาก 10 บรรทัดก็เป็นไปได้ ดังนั้นผลรวมต่อหน้าจึงผิดพลาดไปได้
ผมเชื่อว่า Microsoft เข้าใจถึงปัญหาลักษณะนี้ได้ดี เขาจึงแนะนำอีกวิธีตามที่ผมแปะลิงค์ไว้ในคำตอบในกระทู้นี้แล้วครับ
ผมเชื่อว่า Microsoft เข้าใจถึงปัญหาลักษณะนี้ได้ดี เขาจึงแนะนำอีกวิธีตามที่ผมแปะลิงค์ไว้ในคำตอบในกระทู้นี้แล้วครับ
30 @R13995
ขอบคุณครับ อาจารย์สันติ สุข ที่ให่การแนะนำ ที่ได้ความรู้เพิ่มเติม...ก็คงเป็นอีกทางเลือก ในการประยุกต์ใช้ ตอนนี้ผมกำลังพัฒนา โปรแกรมวัสดุคงคลัง โดยการตัดบิลเบิกจ่าย จากยอดบิลรับเข้า เพื่อลดปัญหา มูลค่าคงคลัง ที่สรุปตอนสิ้นปีมักไม่ถูกต้อง (หลายๆโปรแกรม ตัดจำนวนสตอ๊คถูกต้อง แต่มูลค่าคงคลัง มักไม่ค่อยถูกต้อง จากการที่ ตอนรับเข้าวัสดุ ในแต่ละครั้ง ราคารับเข้าแตกต่างกัน ครั้นเมือเบิกจ่าย ต้องกรอกราคาวัสดุที่จ่าย ในราคาเดียวกันกับที่รับเข้ามา กรณีของส่วนราชการ ที่รับเข้าราคาเท่าไหร่ ต้องจ่ายราคาเท่านั้น ไม่เหมือนกับร้านค้าที่ต้องมีผลกำไร ซึ่งการจ่ายออก เท่าไหร่ก็ได้ที่ไม่ขาดทุน) ถ้าจะใช้ระบบ บาร์โคด ไม่น่าจะเป็นการลดภาระงาน แต่จะเป็นการเพิ่มภาระงาน ที่ต้องติด บาร์โค๊ด กับ วัสดุทุกชิ้นว่าแต่ละชิ้นราคาเท่าไหร่เพื่อให้จ่ายออกได้ถูกต้อง...มันน่าจะมีวิธีการทางโปรแกรม ที่จะสามารถทำได้....ขอความกรุณาอาจารย์สันติสุข..ที่ให้ความกรุณาด้วยดีเสมอมา..หากมีคำแนะนำในการ ตัดสตอคดังกล่าวของต้น...หรือตัวอย่างโปรแกรมที่พอแนะนำได้จักเป็นพระคุณยิ่ง....ซ฿่งขณะนี้ ผมใช้ Source Code ของ อาจารย์ ชวลิต ธนุสุทธิยาภรณ์ ผูเขียนหนังสือ เรื่อง พัฒนาระบบบัญชีด้วย Microsoft Access โดยโปแกรมแบ่งเป็นสองส่วน คือ 1.การสร้างโปรแกรมใบกำกับภาษี 2.โปรแกรมควบคุมสินค้าคงคลัง....ซึ่งผมได้ศึกษาดูน่าจะพัฒนา ต้องความมุ่งหวังที่ตั้งใจไว้ได้....หากมีปัญหาอุปสรรคใด...คงจะเข้ามารบกวน อาจารย์ในบอร์ด ไทยแอ็คเซส แห่งนี้...
31 @R13996
ประมาณ 1 ปีที่แล้ว ผมก็เป็นคนนึงที่เคยใช้วิธีตามที่ Microsoft บอกแล้วมีปัญหา แล้วได้ทำตามโค๊ดลักษณะเหมือนที่คุณ แหลมทอง เขียนไว้ สามารถแก้ปัญหาได้จริง เลยมายืนยันอีกคน แต่ก็อย่างที่ อาจารย์สันติสุข กล่าวไว้ ผมก็เห็นด้วยว่าโค๊ดไม่ยืดหยุ่น ดังนั้นหากเป็น รายงานที่มีการปรับเปลี่ยนเงื่อนไขต่างๆที่ซับซ้อน อาจทำให้ค่าผิดพลาดได้เช่นกัน
แต่ที่แน่ๆ ตัวอย่างที่ Microsoft ให้ไว้ในเรื่องนี้ ใช้ไม่ได้จริง
แต่ที่แน่ๆ ตัวอย่างที่ Microsoft ให้ไว้ในเรื่องนี้ ใช้ไม่ได้จริง
Time: 0.3091s