รบกวนอธิบายเรื่องสร้างโปรแกรม แบบสมุดธนาคารอย่างละ
กระทู้เก่าบอร์ด อ.Yeadram

 7,432   35
URL.หัวข้อ / URL
รบกวนอธิบายเรื่องสร้างโปรแกรม แบบสมุดธนาคารอย่างละ

คืออยากให้ท่าน อ. ผู้เชี่ยวชาญ อธิบายเรื่องการพิมพ์รายงานแบบสมุดธนาคารอย่างละเอียดหน่อยได้มั้ยค่ะ คือ เคยอ่านจากกระทู้ๆ หนึ่งในนี้ เค้าพูดถึงแต่โค๊ดส่วนที่ใส่ในรายงานค่ะ ลองทำดูแล้ว ก็ไม่ซ่อนบรรทัดให้ textbox ที่จะต้องใส่ค่า myLastLine ให้ใส่ไว้ที่ไหนค่ะ รบกวนด้วยค่ะ

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

21 @R16669
ดิฉันมีปัญหามารบกวนท่านอาจารย์อีกแล้วค่ะ

ต่อเนื่องจากการพิมพ์แบบสมุดธนาคารที่อาจารย์เคยให้โค๊ดไปทดลองนั้น ผ่านฉลุย ไม่มีปัญหาค่ะ

ปัญหาตอนนี้คือดิฉันมีข้อมูลที่ต้องพิมพ์ใน Report ที่อยู่ในส่วนของ Groupheader , Detail และ Groupfooter ค่ะ
ซึ่งโค๊ดที่อาจารย์ให้ มันสามารถหาบรรทัดแรกที่จะพิมพ์ได้ในส่วนของ Detail เท่านั้น
ถ้าดิฉันอยากให้นับรวมในส่วนของ Groupheader ด้วย จะสามารถทำได้อย่างไรคะ
ลอง copy โค๊ดไปใส่ในส่วน Format ของ Groupheader แล้ว ก็ทำไม่ได้ รบกวนด้วยค่ะ
22 @R16677
ถ้าหมายถึงว่า จะให้การพิมพ์ครั้งนี้นับบรรทัดของ Group Header/Footer ที่ได้พิมพ์ไปแล้วในครั้งก่อนรวมอยู่ด้วยใช่หรือไม่ ถ้าใช่ วิธีเดิมจะใช้ไม่ได้ เพราะโค้ดที่ให้ไป มันทำงานได้เฉพาะเมื่อแต่ละบรรทัดมีขนาดที่เท่าๆกัน และไม่มี Header/Footer มาเกี่ยวข้อง

วิธีนึงที่พอคิดได้คือ แทนที่จะระบุว่าพิมพ์ไปแล้วกี่บรรทัด ก็ต้องระบุเป็นกี่เซ็นติเมตรแทน ไม่ทราบว่าในทางปฏิบัติ คุณทำได้หรือไม่ ถ้ากระดาษที่พิมพ์เป็น Pre-Printed Form สั่งจากบริษัทขายกระดาษพิมพ์ ก็อาจให้เขาพิมพ์ตัวเลขเล็กๆที่ข้างกระดาษ ไม่ก็ต้องหาวิธีใดก็ตามเพื่อให้ทราบระยะห่างจากขอบบน ถ้าได้ ผมจะแสดงวิธีให้ดู
23 @R18038
ขอบคุณท่าน อ.สันติสุขค่ะ
ปัญหาที่อยากให้อาจารย์ช่วยแก้ไขคือ
ใน Report มี Record ที่จะพิมพ์ 5 บรรทัด ฉะนั้นเมื่อเวลาซ่อน Record ไม่ให้พิมพ์ ก็จะซ่อนทั้งหมด 5 บรรทัด จึงทำให้เกิดบรรทัดว่างขึ้น 5 บรรทัดแล้วโปรแกรมจึงพิมพ์ Record ดังกล่าวออกมา สิ่งที่ต้องการคือ อยากให้ Record พิมพ์ต่อจากบรรทัดที่เคยพิมพ์ไปเลย ซึ่งก็หมายถึง 5 บรรทัดที่ว่างนั้น ต้องเสมือนกับซ่อนเพียงแค่บรรทัดเดียว จะแก้ไขปัญหาอย่างไรคะ รบกวนท่านอาจารย์ด้วยค่ะ ขอบคุณค่ะ
24 @R18039
อ่านแล้วไม่เข้าใจครับ ยกตัวอย่างมาให้ดูจะดีกว่านะครับ

"ใน Report มี Record ที่จะพิมพ์ 5 บรรทัด ฉะนั้นเมื่อเวลาซ่อน Record ไม่ให้พิมพ์ ก็จะซ่อนทั้งหมด 5 บรรทัด จึงทำให้เกิดบรรทัดว่างขึ้น 5 บรรทัดแล้วโปรแกรมจึงพิมพ์ Record ดังกล่าวออกมา" หมายถึงพิมพ์ออกมาแล้วเป็นอย่างนี้ใช่หรือไม่

(บรรทัดว่าง #1)
(บรรทัดว่าง #2)
(บรรทัดว่าง #3)
(บรรทัดว่าง #4)
(บรรทัดว่าง #5)
(พิมพ์เรคอร์ดที่ 1)
(พิมพ์เรคอร์ดที่ 2)
(พิมพ์เรคอร์ดที่ 3)
(พิมพ์เรคอร์ดที่ 4)
(พิมพ์เรคอร์ดที่ 5)

-------------------------------------------------------------------------------------
พอบอกต่อมาว่า "สิ่งที่ต้องการคือ อยากให้ Record พิมพ์ต่อจากบรรทัดที่เคยพิมพ์ไปเลย" ที่เข้าใจคือพิมพ์ออกมาเป็น

...
...
...
(พิมพ์เรคอร์ดที่ 5)
(พิมพ์เรคอร์ดต่อไปที่บรรทัดนี้)


-------------------------------------------------------------------------------------
แต่พอบอกว่า "ซึ่งก็หมายถึง 5 บรรทัดที่ว่างนั้น ต้องเสมือนกับซ่อนเพียงแค่บรรทัดเดียว" ตรงนี้งงเลยครับ
25 @R18056
ขอบคุณ อ.สันติสุข สำหรับการพยายามตอบคำถามงงๆ ของดิฉันนะคะ

ฉะนั้นดิฉันขอยกตัวอย่างดังนี้ค่ะ
หน้า Report เป็นดังนี้ค่ะ
ส่วนรายละเอียด
[text1]
[text2]
[text3]
[text4]
[text5]

หน้ากระดาษที่ต้องการพิมพ์ เคยพิมพ์ไปแล้ว 2 บรรทัด ผลลัพธ์ที่ต้องการได้คือ

บรรทัดที่ 1 ที่เคยพิมพ์ไปแล้ว
บรรทัดที่ 2 ที่เคยพิมพ์ไปแล้ว
บรรทัดที่ 3 text1
บรรทัดที่ 4 text2
บรรทัดที่ 5 text3
บรรทัดที่ 6 text4
บรรทัดที่ 7 text5

ผลลัพธ์ที่ดิฉันทำการทดลองทำคือ เมื่อ myLastLine = 2

บรรทัดที่ 1 ที่เคยพิมพ์ไปแล้ว
บรรทัดที่ 2 ที่เคยพิมพ์ไปแล้ว
บรรทัดที่ 3 (ว่าง)
บรรทัดที่ 4 (ว่าง)
บรรทัดที่ 5 (ว่าง)
บรรทัดที่ 6 (ว่าง)
บรรทัดที่ 7 (ว่าง)
บรรทัดที่ 8 text1
บรรทัดที่ 9 text2
บรรทัดที่ 10 text3
บรรทัดที่ 11 text4
บรรทัดที่ 12 text5

รบกวนท่านอาจารย์อีกทีนะคะ ไม่ทราบจะยังงงอยู่หรือไม่ ถ้ายังงงอยู่ขอให้แจ้งด้วยนะคะ ดิฉันจะมาอธิบายใหม่ ขอบคุณค่ะ

26 @R18057
โค้ดที่ผมให้ไปในลิงค์ของหน้าแรก ก็น่าจะทำงานตามที่ต้องการนี้ได้แล้วนี่ครับ เอาโค้ดที่คุณใช้มาแสดงให้ดูหน่อยครับ
27 @R18064
Private Sub Detail_Format(Cancel As Integer, FormatCount As Integer)
    myLine = myLine + 1
    If myLine <= Forms("frm_tbl1").myLastLine Then
        Me.NextRecord = False
        Me.Text1.Visible = False
        Me.Text2.Visible = False
        Me.Text3.Visible = False
        Me.Text4.Visible = False
        Me.Text5.Visible = False
    Else
        Me.Text1.Visible = True
        Me.Text2.Visible = True
        Me.Text3.Visible = True
        Me.Text4.Visible = True
        Me.Text5.Visible = True
    End If
End Sub
28 @R18066
ผมคิดว่าโค้ดไม่มีอะไรผิดนะครับ เป็นไปได้หรือเปล่าว่า เรคอร์ดที่จะพิมพ์ มีเรคอร์ดที่ว่างๆปนอยู่ด้วย 5 เรคอร์ด และเป็นเรคอร์ดที่มีค่าอีก 5 เรคอร์ด
29 @R18069
ผมว่า ก่อนหน้านี้ผมอ่านแล้ว ผมเข้าใจผิด ตอนนี้คิดว่าเข้าใจแล้วว่า detail section มี 5 บรรทัด ความหมายของการเว้นบรรทัดของโค้ดเดิม จริงๆแล้วหมายถึงเว้นตามความสูงของทั้ง detail section ไปเลย ไม่ใช่เว้นแค่แต่ละบรรทัดอย่างที่เข้าใจครับ    detail section ของเดิมมีความสูงแค่ 1 บรรทัด แต่ตอนนี้จะมาเปลี่ยนความสูงเป็น 5 บรรทัด   ถ้ายังใช้โค้ดนี้ การเว้นข้าม 1 ครั้งจะทำทีละ 5 บรรทัดเลยครับ ไม่ใช่ 1 บรรทัด   แต่ก็ยังสงสัยว่า ทำไมมันเว้น 7 บรรทัดได้   ถ้า myLastLine เป็น 2 มันก็ควรเว้นไป 10 บรรทัดไปเลย ?!?

ส่วนจะทำอย่างที่ต้องการได้หรือเปล่า ผมไม่แน่ใจครับ เพราะช่วงนี้ไม่มีเวลาทดลองนะครับ แต่จะบอกวิธีให้ หลักการคือต้องสร้าง Group section ขึ้นมาครอบ Detail section เอาไว้ แล้วเราก็จะควบคุมความสูงของ Group section ให้สูงเท่ากับจำนวนบรรทัดที่จะเว้น

ให้ทำตามภาพนะครับ (ภาพนี้เป็นของ Access 2010)



1. คลิกที่ Group & Sort
2. คลิก Add a group
3. คลิก expression
4. ป้อน =1 แล้วคลิก OK
5. และ 6. Group Header section ชื่อ GroupHeader0 จะโผล่มา หดให้ความสูงเป็นศูนย์

โค้ดเดิมที่ผมให้ไป ไม่จำเป็นต้องใช้อีกต่อไป เอาออกไปได้เลย แล้วใส่โค้ดนี้เข้าไปแทน

Private Sub GroupHeader0_Format(Cancel As Integer, FormatCount As Integer)
    Me.Section("GroupHeader0").Height = X * 567 * myLastLine
End Sub

*** ที่สำคัญคือ คุณต้องจัดช่องไฟให้ความสูงของ Detail section อันใหม่ที่มี 5 บรรทัด เมื่อหาร 5 แล้ว ต้องได้เท่ากับความสูงของของเดิมที่มีบรรทัดเดียวพอดี และถ้ารายงานเดิมมี section อะไรเหนือ Detail section   รายงานใหม่ก็ต้องมีเหมือนกัน ***

แล้วให้แก้ X เป็นค่าความสูงของ 1 บรรทัดที่หามาได้เป็นเซ็นติเมตร

เท่านี้ครับ
30 @R18070
แก้ที่ผิดจากคำตอบข้างบนหน่อยนะครับ จาก myLastLine เป็น Forms("frm_tbl1").myLastLine

หรือถ้าคุณสามารถวัดระยะเป็นเซ็นติเมตรจากเหนือบรรทัดแรกสุดของหน้า มาถึงเหนือบรรทัดที่จะพิมพ์ครั้งนี้ออกมาได้ไม่ยุ่งยาก ก็เปลี่ยนโค้ดเป็น

Me.Section("GroupHeader0").Height = 567 * Forms("frm_tbl1").myLastLine

แล้วที่หน้าจอ แทนที่จะใส่ตัวเลขเป็นจำนวนบรรทัด ก็เปลี่ยนเป็นใส่ระยะห่างเป็นเซ็นติเมตรแทนครับ ดังนั้นก็ไม่ต้องไปจัดความสูงที่ Detail section ที่ว่าต้องหาร 5 อะไรนั้นอีกแล้ว จะสูงยังไงก็ได้ ไม่เหมือนของเก่าก็ได้ เพราะเราวัดเป็นระยะแทนการวัดเป็นจำนวนบรรทัดไปแล้ว
31 @R18072
ขอบพระคุณ อ.สันติสุขมากๆ เลยค่ะ เท่าที่อ่าน ดิฉันคิดว่าเข้าใจตรงกันแล้ว
ดิฉันจะไปทดลองทำดูนะคะ ได้ผลอย่างไรจะมารายงานให้ทราบค่ะ ขอบคุณมากๆ ค่ะ
32 @R18139
รบกวน อ. สันติสุข อีกครั้งค่ะ
ดิฉันใช้ access 2003 ค่ะ ไม่มีฟังก์ชั่น Add a group ค่ะ
มีวิธีอื่นที่สามารถทำได้หรือไม่คะ
33 @R18140
เปิดรายงานใน Design View แล้วคลิกเมนู View - Sorting and Grouping ครับ
34 @R18141
ขอบคุณท่าน อ. สันติสุขมากๆ ค่ะ ตอนนี้ดิฉันได้ทำตามคำแนะนำ สำเร็จเรียบร้อยแล้วค่ะ ท่านเก่งจริงๆ
35 @R18142
ขอบคุณครับ แต่ไม่ต้องเรียก "ท่าน" หรอกนะครับ มันรู้สึกแปลกๆ เรียกธรรมดาๆ หรือจะเรียก "คุณ" แค่นี้ก็พอแล้วครับ แล้วก็ผมไม่ใช่คนเฉลียวฉลาดหรือเก่งอะไรหรอกนะครับ ผมแค่รู้มากกว่าเพราะใช้ Access มานานเท่านั้นเอง แล้วก็รู้จากหนังสือหรือคนอื่นมาอีกทีนึงเหมือนๆกัน แต่ก็ยังรู้ได้ไม่เท่าไหร่ของ Acess อยู่ดีครับ
@ ประกาศใช้งานเว็บบอร์ดใหม่ => บอร์ดเรียนรู้ Access สำหรับคนไทย
แล้วจะใส่ลิ้งอ้างอิงมาที่โพสต์เก่านี้หรือไม่ก็ตามสะดวกครับ
Time: 0.2730s