การซ่อน/แสดง ในหน้ารายงานค่ะ
กระทู้เก่าบอร์ด อ.Yeadram

 3,884   28
URL.หัวข้อ / URL
การซ่อน/แสดง ในหน้ารายงานค่ะ

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



มีภาพประกอบค่ะ

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

1 @R20643
ทำตรงกันข้ามและต่าง section เท่านั้นเอง http://www.thai-access.com/yeadram_view.php?topic_id=3053

ปล. รายงานรายชื่อคนได้เครื่องราชฯนี่ never die จริงๆ ข้ามภพข้ามชาติ 55
2 @R20644
ขอบคุณ อ.สันติสุข ค่ะ ดีใจที่ อ.จำได้
ได้ผลเป็นอย่างไรจะมารายงานให้ อ.ทราบค่ะ
ขอบคุณค่ะ
3 @R20645
ไม่หายค่ะ
มันซ่อนเฉพาะในหน้าสุดท้ายของรายงาน
แต่ในหน้าสุดท้ายของแต่ละกลุ่มไม่ได้ถูกซ่อนค่ะ

ดิฉันใน code on GroupFooter1_Format
ถูกที่หรือเปล่าคะ
4 @R20646
ผมเข้าใจว่า ให้แสดง Page Footer เฉพาะหน้าสุดท้ายของรายงานเท่านั้น ถูกต้องหรือไม่ หรืออย่างไร ถ้าใช่ โค้ดก็จะเป็น

Private Sub PageFooterSection_Format(Cancel As Integer, FormatCount As Integer)
    Me.Section("PageFooterSection").Visible = (Me.Page = Me.Pages)
End Sub

อีกอย่างคือ ในรายงานไม่มีอะไรอยู่ใน Group Footer section ไม่ใช่หรือ ก็ทำให้สงสัยที่เขียนถามมาว่า "แต่เมื่อถึงข้อมูลสุดท้ายในแต่ละกลุ่ม จะให้แสดงส่วนท้ายของกลุ่ม"   "ส่วนท้ายของกลุ่ม" นี่หมายถึงอะไรกันแน่
5 @R20647
หรือถ้าต้องการ แสดงทุกหน้ายกเว้นหน้าสุดท้ายของแต่ละกลุ่ม ก็โค้ดเป็น

Private Sub GroupFooter1_Format(Cancel As Integer, FormatCount As Integer)
    Me.Section("PageFooterSection").Visible = False
End Sub

แต่ Group Footer1 จะต้องมีพิมพ์อะไรออกมานะครับ ไม่งั้นน่าจะ(ผมไม่ได้ทดลอง)ไม่เกิด event ใดๆสำหรับ section นี้ แต่ถ้าไม่มีอะไรจะพิมพ์จริงๆ ก็พิมพ์เครื่องหมายจุด (.) เล็กๆสีเทาๆที่ไหนสักที่ใน section นี้ก็ได้เพื่อให้เกิด event ขึ้นมา

และต้องโค้ดด้วยว่า

Private Sub PageHeaderSection_Format(Cancel As Integer, FormatCount As Integer)
    Me.Section("PageFooterSection").Visible = True
End Sub
6 @R20648
ที่ GroupFooter1 มีข้อมูลค่ะ แต่ดิฉันบีบช่องให้สูงแค่ 0.11
ความต้องการจริงๆ คือ ให้ pagefooter แสดงทุกหน้า ยกเว้นในหน้าที่ groupfooter1 แสดงค่ะ ต้องไม่แสดง pagefooter
ดิฉันจะลองไปทำตามค่ะ
ขอบคุณ อ.สันติสุขมากนะคะ
7 @R20649
สำเร็จแล้วค่ะ ขอบพระคุณ อ.สันติสุขมากค่ะ

แต่แอบมีข้อสงสัยเรื่องอื่นค่ะ
ถ้าเราอยากให้ข้อมูลสุดท้าย ตัดไปอยู่อีกหน้าหนึ่ง ต้องทำอย่างไรคะ
8 @R20650
ข้อมูลสุดท้ายคือเรคอร์ดสุดท้ายหรือว่าอะไรครับ แล้วทำไมจะต้องยกไปหน้าต่อไป
9 @R20652
ใช่ค่ะ record สุดท้าย
เหตุที่ต้องยกไปหน้าต่อไปเพราะ
ส่วนท้ายของกลุ่ม เป็นลายเซ็นผู้รับรอง
ซึ่งในบางที record สุดท้ายจะจบที่หน้าก่อนหน้า
พอหน้าถัดไปที่แสดงส่วนท้ายของกลุ่มก็จะแสดงแค่ลายเซ็นผู้รับรอง ไม่มีข้อมูลค่ะ
10 @R20656
ค่อนข้างจะยุ่งยากและมีข้อจำกัดบ้าง แล้วผมจะมาเขียนให้ดู ยังไม่ยืนยันนะครับว่าจะเขียนให้ได้เมื่อไหร่แน่ แต่อย่างเร็วคงเป็นเย็นวันจันทร์
11 @R20657
ขอบคุณ อ.สันติสุขค่ะ
12 @R20660
สิ่งที่ต้องทำก็คือ

1) หาว่าเป็นเรคอร์ดสุดท้ายในกลุ่มหรือไม่ โดยการเทียบเลขลำดับที่ของเรคอร์ดนั้นในกลุ่ม เทียบกับจำนวนเรคอร์ดในกลุ่ม ถ้าเท่ากันก็คือเรคอร์ดเป้าหมาย
     - ใน Group Header Section ให้สร้างเท็กซ์บ็อกซ์ชื่อ TotalRecInGrp ให้ Control Source property เป็น =Count(*) และกำหนดให้ Visible property เป็น No ค่าที่ได้คือจำนวนเรคอร์ดในกลุ่มนี้
     - ใน Detail Section ให้สร้างเท็กซ์บ็อกซ์ชื่อ CurrentRecInGrp ให้ Control Source property เป็น =1    ให้ Running Sum property เป็น Over Group และให้ Visible property เป็น No ค่าที่ได้คือลำดับที่ของเรคอร์ดในกลุ่มนี้
     - ใน Detail Section   เมื่อไหร่ที่ CurrentRecInGrp เท่ากับ TotalRecInGrp ก็แสดงว่ากำลังอยู่ที่เรคอร์ดสุดท้ายแล้วนั่นเอง

2) ถ้าเป็นเรคอร์ดสุดท้ายในกลุ่ม หาว่ามันจะพิมพ์เลยตำแหน่งที่กำหนด (ซึ่งวัดจากตำแหน่งเริ่มต้นของ Page Header Section) หรือไม่
     - ข้อจำกัดคือ Can Grow, Can Shrink property ของ Detail section ต้องเป็น No เท่านั้น
     - ระยะทางในระบบ Access มีอยู่หลายหน่วย ที่ใช้ในโค้ดนี้คือหน่วย Twip โดยที่ 1 นิ้วเท่ากับ 1440 twips หรือ 1 ซม.ก็เท่ากับ 567 twips
     - Access ไม่มี property อะไรเพื่อบอกว่าสิ่งที่กำลังพิมพ์นี้อยู่ห่างจาก Page Header Section เท่าไหร่ แต่เรารู้ความสูงของแต่ละ section ดังนั้นจึงต้องสร้างตัวแปร TotalHeight เพื่อเก็บผลรวมว่าห่างจาก Page Header Section ไปเท่าไหร่แล้ว โดยการบวกความสูงของแต่ละ Section ที่อยู่ไม่ต่ำกว่า Detail Section บวกเข้ามาในตัวแปรนี้ ด้วยฟังก์ชั่นที่เราเขียนเองชื่อว่า SumHeight( )   แต่สิ่งนึงที่ต้องระวังเกี่ยวกับการบวกค่าอะไรเองด้วยโค้ดของ Report ก็คือ แต่ละ Section มีโอกาสที่จะเกิด Format event หรือ Print event ได้มากกว่า 1 ครั้ง (ตรวจสอบได้จากตัวแปร FormatCount หรือ PrintCount) ขึ้นกับการพิจารณาของตัว Access เอง เช่น เมื่อจะพิมพ์เรคอร์ดหนึ่งๆ   Format event ก็จะเกิด 1 ครั้ง   ปกติถ้า Access เห็นว่าเลยขอบกระดาษล่าง มันก็จะยกเลิกการพิมพ์และปัดไปหน้าถัดไปให้ แน่นอนว่าจะเกิด Format event อีก 1 ครั้ง รวมเป็น 2 ครั้ง เป็นต้น ดังนั้นโค้ดเราต้องเช็คว่าถ้า event เกิดมากกว่า 1 ครั้ง ค่าผลรวมความสูงต้องหักความสูงของการบวกในครั้งก่อนที่เก็บอยู่ในตัวแปรชื่อ LastHeight ออกไปด้วย ถึงจะได้ความสูงที่ถูกต้องตามจริง

3) ถ้าเลย ก็ให้ปัดเรคอร์ดนั้นไปหน้าใหม่
     - เมื่อได้ความสูงรวมแล้ว ดังนั้นก่อนที่จะปล่อยให้พิมพ์ ก็เช็คจาก Format event ว่าค่านี้มากกว่าตำแหน่งที่เรากำหนดไว้หรือไม่ (ในตย.นี้อยู่ที่ 18.5 ซม.) ถ้ามากกว่าก็สั่งให้มองเห็นคอนโทรล Page Break ที่ชื่อ PB ซึ่งต้องตั้งให้อยู่ชิดขอบบนของ Detail Section   เมื่ออยู่ในสถานะมองเห็น    Access จะถือว่าสิ่งต่างๆใน Section นั้นๆที่อยู่ล่าง Page Break จะต้องการปัดขึ้นหน้าใหม่ ดังนั้นเรคอร์ดสุดท้ายก็จะถูกปัดไปหน้าใหม่ตามที่เราต้องการ (และ Format event ก็จะเกิดซ้ำอีกครั้งในหน้าใหม่) แต่ถ้าไม่เกินความสูงที่กำหนด ก็ต้องให้ Page Break มองไม่เห็น

โค้ดทั้งหมดก็คือ

Option Compare Database
Option Explicit

Const LimitHeight = 18.5 * 567     ' 1 cm = 567 twips

Dim TotalHeight As Long
Dim LastHeight As Long

Private Sub GroupHeader1_Format(Cancel As Integer, FormatCount As Integer)
    ' หายอดรวมความสูง
    Call SumHeight(Me.Section("GroupHeader1").Height, FormatCount)
End Sub

Private Sub PageHeaderSection_Format(Cancel As Integer, FormatCount As Integer)
    ' เคลียร์ยอดรวมความสูง
    TotalHeight = 0
    
    ' หายอดรวมความสูง
    Call SumHeight(Me.Section("PageHeaderSection").Height, FormatCount)
End Sub

Private Sub Detail_Format(Cancel As Integer, FormatCount As Integer)
    ' ถ้าเป็นเรคอร์ดสุดท้ายในกลุ่ม และ ความสูงเกินกว่าลิมิตที่ตั้งไว้
    ' ก็ให้แสดง Page Control ซึ่งมีผลทำให้ปัดไปขึ้นหน้าใหม่ทันที
    If (Me.CurrentRecInGrp = Me.TotalRecInGrp) And (TotalHeight >= LimitHeight) Then
        Me.PB.Visible = True
        Exit Sub
    End If
    
    Me.PB.Visible = False
    
    ' หายอดรวมความสูง
    Call SumHeight(Me.Section("Detail").Height, FormatCount)
    'Debug.Print Me.MCOD_ID
End Sub

Private Sub SumHeight(SectionHeight As Long, FormatCount As Integer)
    ' ถ้า FormatCount เกินกว่า 1 ก็ต้องลบความสูงครั้งล่าสุดที่เคยบวกเข้าไป
    If FormatCount > 1 Then
        TotalHeight = TotalHeight - LastHeight
    End If
    
    ' เก็บความสูงครั้งล่าสุดไว้
    LastHeight = SectionHeight
    
    ' บวกยอดรวมความสูงของทุก section ที่ได้ทำไป
    TotalHeight = TotalHeight + LastHeight
End Sub
13 @R20661

รูปแรก แสดงผลลัพธ์การพิมพ์โดยไม่มีการตรวจสอบอะไร จะเห็นว่า Group Footer จะโดดลอยเดี่ยวๆที่หน้าถัดไป

14 @R20662
รูปที่สอง แสดงผลลัพธ์เมื่อมีการตรวจสอบแล้ว เรคอร์ดสุดท้ายจะปัดไปหน้าถัดไป ทำให้ Group Footer ไม่อยู่เดี่ยวๆอีกต่อไป

15 @R20663

รูปที่สาม แสดงตัวอย่างว่าเราต้องมีคอนโทรลอะไรบ้างเพื่อใช้ในโค้ดที่ให้ไป

16 @R20664
ไม่รู้จะทำยังไง ภาพเวลาใส่ในเวปบอร์ดนี้รวนไปหมด เอาเป็นว่า ภาพที่สองก็นึกภาพเอาเองแล้วกัน

ส่วนรูปที่สาม ถูกต้องแล้ว
17 @R20671
ขอบคุณค่ะ อ.สันติสุข ดิฉันจะไปทดลองทำค่ะ สงสัยตรงไหน อย่างไร จะกลับมาขอความรุ้เพิ่มเติมนะคะ ขอบคุณมากๆ อีกครั้งค่ะ
18 @R20717
มันขึ้นอย่างนี้ค่ะ อ.สันติสุข


ต้องแก้ไขอย่างไรคะ
19 @R20718
น่าจะมีชื่อ procedure PageHeaderSection_Format ซ้ำในโค้ดของคุณ
20 @R20719
แก้ไขแล้วค่ะ
แต่ผลลัพธ์ของ code ไม่เป็นไปตามที่ อ.อธิบายค่ะ


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