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

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

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

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

1 @R10655
จาก http://www.thai-access.com/yeadram_view.php?topic_id=487

myLastLine คือชื่อของ textbox บนฟอร์มใดฟอร์มหนึ่ง ซึ่งจะถูกอ้างอิงในตัวรายงานนี้ด้วยโค้ด Forms("ชื่อฟอร์ม").myLastLine   ฟอร์มจะใช้ฟอร์มอะไรก็ได้ แต่เพื่อความเหมาะสม ก็ควรเป็นฟอร์มที่เกี่ยวข้องกับการพิมพ์นี้ครับ และฟอร์มนั้นจะต้องเปิดทำงานอยู่ระหว่างการพิมพ์ด้วย

ปล. คำว่า "คะ" กับคำว่า "ค่ะ" ออกเสียงไม่เหมือนกันนะครับ "คะ" ออกเสียงสูงกว่า "ค่ะ" ออกเสียงต่ำกว่า ต้องใช้ให้ถูกต้องด้วย

ได้มั้ยค่ะ ต้องเขียน ได้มั้ยคะ
ที่ไหนค่ะ ต้องเขียน ที่ไหนคะ

อย่าใช้ผิิดครับ ภาษาไทยอย่าใช้ผิด โดยเฉพาะคำง่ายๆอย่างนี้ที่ผู้หญิงทุกคนต้องพูดแทบจะทุกประโยคอยู่แล้ว แต่ไม่เข้าใจเหมือนกันว่าเกิดอะไรขึ้นใน 10 ปีหลังมานี้ ร้อยละ 90 ได้มั้งที่ใช้กันผิดหมด บางคนล่อ "คะ" อย่างเดียว บางคนก็ล่อ "ค่ะ" อย่างเดียวเลย ดูแล้วมันน่ารำคาญครับ เหมือนไม่ใส่ใจแม้แต่เรื่องง่ายๆอย่างนี้


อย่าหาว่าผมบ้าเลย แม้ผมไม่ใช่ครูภาษาไทย และผมก็เรียนไม่ค่อยรู้เรื่องกับ syntax ของภาษาไทยด้วยซ้ำ คำเป็น คำตาย ตัวสะกดแม่ต่างๆ ตัวไหนผันวรรณยุกต์ไหนได้บ้าง ไม่ได้บ้าง กฏ syntax พวกนี้ผมไม่ค่อยจะรู้เรื่องด้วยซ้ำ แต่คำไหนสะกดอย่างไร ผมว่า เราควรเขียนผิดให้น้อยที่สุดครับ แล้วผมตั้งใจว่าต่อไปผมจะมีกฏของผมเองว่า ใครเขียนไม่ถูก ผมจะไม่ตอบแล้วครับ พิมพ์ผิดโดยไม่ตั้งใจก็ไม่ว่ากันครับ แต่พิมพ์โดยไม่รู้ว่าคำไหนต้องเขียนอย่างไร โดยเฉพาะคำง่ายๆอย่างนี้ไม่ดีครับ
2 @R10675
ขอบคุณสำหรับคำอธิบายของ อ.สันติสุข คะ แต่ดิฉันก็ยังไม่ค่อยเข้าใจคะ ทำอย่างไรให้ฟอร์มนั้นเปิดทำงานอยู่ระหว่างการพิมพ์ แล้วค่าที่ใส่ใน textbox ที่ชื่อ myLastLine ต้องเก็บค่าไว้ใน Table ด้วยไหมคะ รบกวนอ.สันติสุขอีกครั้งคะ พอดีดิฉันมือใหม่นิดๆ พอรู้เรื่อง Access บ้าง แต่ไม่ลึกเท่าไรคะ
3 @R10676
ป.ล. ขออภัยด้วยคะหากการใช้ภาษาไทยของดิฉันผิดเพี้ยนไป อย่างไรก็รบกวนอ.สันติสุขแนะนำด้วยคะ
4 @R10677
เขียน คะ ค่ะ ผิดหมดครับ ผมไม่ตอบครับ อยากรู้ว่าผิดยังไง ลอง Copy และ Paster ข้อความที่คุณเขียนลงไปที่ http://www.hlt.nectec.or.th/speech/index.php?option=com_jumi&fileid=9&Itemid=141&lang=th (ต้องติดตั้งโปรแกรม QuickTime ของ Apple ก่อนนะครับ) แล้วคุณจะรู้ว่าที่เขียนมา พอฟังที่อ่านแล้วจะแปลกๆมาก ลองฟังดูครับ

แต่ผมคิดว่าคุณอาจจะไม่ใช่คุณ Pukpik
5 @R10701
ต้องขอโทษ อ.สันติสุขด้วยค่ะ สำหรับการใช้ภาษาผิดของดิฉัน
วันนี้ขอปรับปรุงใหม่นะคะ
คำถามที่อยากจะทราบเกี่ยวกับการพิมพ์หน้าแบบสมุดธนาคารมีดังนี้ค่ะ
1. ทำอย่างไรให้ฟอร์มนั้นเปิดทำงานอยู่ระหว่างการพิมพ์
2. ค่าที่กรอกใน textbox ที่ชื่อ myLastLine ต้องเก็บค่าไว้ใน Table ด้วยไหมคะ
3. ถ้าเป็นไปได้ รบกวนขอไฟล์ตัวอย่างด้วย ก็จะดีมากเลยค่ะ พอดีทำงานราชการ พี่ๆที่ทำงานเค้าอยากได้การพิมพ์แบบสมุดธนาคารค่ะ ดิฉันก็ Access มือใหม่ ยังไม่สันทัดเรื่องโค้ดสักเท่าไร
ขอบคุณ อ.สันติสุข อีกครั้งค่ะ สำหรับคำแนะนำ การใช้ภาษา และขอบคุณด้วยสำหรับการตอบคำถามของดิฉันค่ะ
6 @R10702
1. ในแนวคิดที่ให้ไว้ใน http://www.thai-access.com/yeadram_view.php?topic_id=487 คือฟอร์มที่ว่านั้นจะเปิดขึ้นมาก่อนรายงาน อาจโดยการใช้โค้ด

DoCmd.OpenForm "ชื่อฟอร์ม"

หรืออาจโดยผู้ใช้เรียกเปิดเองโดยตรงจากหน้าต่างของ Access ก็ได้ครับ หลังจากนั้น ผู้ใช้ป้อนหมายเลขบรรทัดสุดท้ายลงไปใน Textbox ที่ชื่อ myLastLine นอกจากนี้ บนฟอร์มก็ควรสร้างปุ่ม Command Button อีกปุ่มเพื่อให้ผู้ใช้คลิกเพื่อไปเปิดตัวรายงานอีกต่อหนึ่ง โค้ดที่ฝังอยู่ใน Command Button ใน OnClick event นั้น ก็คือ

DoCmd.OpenReport "ชื่อของรายงาน"

ง่ายๆตรงๆเท่านี้เองครับ   เราจะไม่ทำในทิศทางตรงกันข้ามในลักษณะเปิดตัวรายงานก่อน แล้วตัวรายงานไปเปิดฟอร์ม เราไม่ทำอย่างนั้นครับ

2. ไม่จำเป็นต้องเก็บครับ เพราะบรรทัดสุดท้ายของสมุดแต่ละเล่มย่อมไม่เหมือนกัน เก็บไปก็ไม่สามารถนำไปใช้กับสมุดเล่มอื่นๆได้ครับ

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

ภาษาไทยแก้ไขแล้ว เยี่ยมครับ
7 @R10800
ขอบคุณ อ. สันติสุขมากเลยค่ะ ตอนนี้พิมพ์ได้แล้ว
แต่ปัญหาตอนนี้ก็คือ เมื่อพิมพ์ครั้งแรกแล้ว ลองสั่งพิมพ์ครั้งต่อไป
โปรแกรมพิมพ์ข้อมูลเดิมออกมาด้วยค่ะ เช่น เคยพิมพ์บรรทัด ที่ 1 - 3 ไปแล้ว
เมื่อสั่งพิมพ์ในครั้งต่อมา ก็ใส่ myLastLine = 3 ข้อมูลที่พิมพ์ออกมา
มีบรรทัดที่ 1 - 3 ที่เคยพิมพ์ไปแล้วค่ะ ทำไมถึงไม่เริ่มที่บรรทัดที่ 4 เลยคะ
รบกวนอาจารย์อีกทีนะคะ
ขอบคุณค่ะ
8 @R10801
ความหมายของ myLastLine คือ เลขที่บรรทัดบนกระดาษที่จะพิมพ์ครับ ไม่ใช่ลำดับที่ที่เท่าไหร่ของเรคอร์ดที่จะพิมพ์ครับ ลำดับที่ของเรคอร์ดแรกที่จะพิมพ์ มันขึ้นอยู่กับคิวรี่ที่คุณสร้างครับ ไม่ได้เกี่ยวกับเทคนิคที่ผมเขียนไปก่อนหน้านี้
9 @R15650
กรณี ในสมุดเราพิมพ์ได้ 10 บรรทัด เราจะพิมพ์บรทัดที่ 11
มันต้องขึ้นหน้าใหม่ เราก็จะมี หน้าว่าง 1 หน้า เราจะแก้ไขโค๊ตยังงัยครับ
ไม่ให้มีหน้าว่าง
10 @R15652
ลองใช้ Mod ดูครับ เช่น สมมุติ Print_Line คือค่าบรรทัดที่ต้องการพิมพ์

If Print_Line > 10 Then
    Print_Line = Print_Line Mod 10
End If
11 @R15655
อาจารย์ TTT ครับ อาจารย์สันติสุขเค้าทำโคตไว้แบบนี้ครับ
Option Compare Database
Option Explicit
Dim myLine As Long   ' เป็นตัวนับบรรทัด เพื่อใช้หาว่าจะเริ่มพิมพ์บรรทัดแรกได้หรือยัง
Private Sub Detail_Format(Cancel As Integer, FormatCount As Integer)
    myLine = myLine + 1     
    If myLine <= Forms("ชื่อฟอร์ม").myLastLine Then ' ถ้าบรรทัดที่กำลังจะพิมพ์ในรายงานน้อยกว่าบรรทัดสุดท้ายที่เคยพิมพ์ไปแล้ว
        Me.NextRecord = False        ' โปรแกรมจะไม่ข้ามไปยังเรคอร์ดต่อไป
        Me.ชื่อคอลโทรล.Visible = False ' ซ่อนคอลโทรลต่างๆไว้เพื่อให้พิมพ์ออกมาเป็นบรรทัดเปล่าๆ
    Else
        Me.ชื่อคอนโทรล.Visible = True
    End If
    ' ชื่อคอลโทรลคือคอลโทรลต่างๆใน Detail Section ที่ไม่ต้องการพิมพ์เมื่อเป็นบรรทัดเปล่าๆ เช่น ถ้ามี 5 คอลโทรลก็กำหนดไป 5 บรรทัด
End Sub
Private Sub Report_Open(Cancel As Integer)
    myLine = 0
End Sub


ผมทำแล้วก้โอเค แต่เวลาใช้จริง เวลาครบ 10 บรรทัดจะทำยังงัยให้ โคตไม่พิมพ์หน้าปล่าว
โคตอาจารย์ TTT ทำให้ตัด myLastLine ให้ไม่เกิน 10 แต่การพิมพ์มันยังไม่ถูกครับ
12 @R15657
คือผมแค่ดูโค๊ดแล้วคิดนะครับ ไม่ได้ทดสอบ อย่างนี้ครับ
หากค่าเกินหน้าที่พิมพ์ได้แค่ 10 บรรทัด ตัวอย่างคือ 11 ก็อาจเพิ่มเงื่อนไขว่า


Private Sub Detail_Format(Cancel As Integer, FormatCount As Integer)
    myLine = myLine + 1
    Dim TTT As Long
    If Forms("ชื่อฟอร์ม").myLastLine > 10 Then
        TTT = (Forms("ชื่อฟอร์ม").myLastLine Mod 10) - 1
     Else
        TTT = Forms("ชื่อฟอร์ม").myLastLine
    End If
    If myLine <= TTT Then
        Me.NextRecord = False        ' โปรแกรมจะไม่ข้ามไปยังเรคอร์ดต่อไป
        Me.ชื่อคอลโทรล.Visible = False ' ซ่อนคอลโทรลต่างๆไว้เพื่อให้พิมพ์ออกมาเป็นบรรทัดเปล่าๆ
    Else
        Me.ชื่อคอนโทรล.Visible = True
    End If
...
...

อะไรประมาณนี้อ่ะครับ เราก็จะไม่มีหน้าว่างในหน้าแรก
หากบรรทัดผิดพลาด ก็อยู่ที่การ + - 1 และเครื่อง = ในเงื่อนไข ลองปรับดูครับ
13 @R16227
อาจารย์ TTT สมุดผมพิมพ์ได้ 23 บรรทัดต่อหน้า
ผมคำนวนที่ฟอร์ม โดยนับบรรทัดแล้ว MOD 23 ได้ค่าออกเป็นตัวเลข
สมมุติเท่ากับ 3 ที่กล่องข้อความ myLastLine แล้วโคตที่ Report
ผมใส่แบบนี้

Private Sub Detail_Format(Cancel As Integer, FormatCount As Integer)
Dim myLine As Long
    myLine = myLine + 1
     
    If myLine <= Forms("ชื่อฟอร์ม").myLastLine Then ' ถ้าบรรทัดที่กำลังจะพิมพ์ในรายงานน้อยกว่าบรรทัดสุดท้ายที่เคยพิมพ์ไปแล้ว
        Me.NextRecord = False        ' โปรแกรมจะไม่ข้ามไปยังเรคอร์ดต่อไป
        Me.ชื่อคอลโทรล.Visible = False ' ซ่อนคอลโทรลต่างๆไว้เพื่อให้พิมพ์ออกมาเป็นบรรทัดเปล่าๆ
    Else
        Me.ชื่อคอลโทรล.Visible = True
    End If
End Sub

ผลที่ออกมามันเป็นหน้ากระดาษปล่าว แบบมีจำนวนหน้าไม่รู้จบเลยครับ มันผิดตรงไหนครับ
14 @R16231
ขอโทษนะครับ ไม่ได้อ่านอย่างละเอียด แต่เท่าที่จับใจความคือจะพิมพ์รายงานโดยใช้ Report แบบจำกัดจำนวนต่อหน้า
ที่จริงผมไม่ได้ใช้ Report มานานแล้ว แต่เข้้าใจว่า กรณีนี้ ไม่น่าจะจำเป็นต้องมี code นะครับ
แค่กำหนดตอน design view ว่าจะให้มีเนื้อที่ต่อหน้าไดเท่าไร แล้วตอนสั่งพิมพ์ ก็กำหนดเงืร่อนไขข้อมูลให้ถูกครับ
15 @R16232
ไม่ใช่ครับอาจารย์พิชัย กำหนดเนื้อที่แล้ว
ผมต้องการให้เรคคอดที่พิมพ์แล้ว มองไม่เห็น เพื่อไม่ให้พิมพ์ทับของเดิมครับ
16 @R16234
ผมก็แค่แนะนำนะครับ ว่ามันน่าจะใช้การ MOD ได้ ไม่เคยได้ลองจริงๆ ยังไงรอ อาจารย์สันติสุข ว่างเข้ามาตอบ น่าจะแนะนำได้ดีกว่าครับ
17 @R16239
Dim MyLine As Long

ต้องวางไว้นอก Sub ครับ
เพราะเป็นตัวแปลที่จะต้องเพิ่มทุกครั้งที่เข้า event
ถ้าวางไว้ใน Sub อย่างนี้ จะเริ่ม 0 ใหม่ทุกครั้ง
18 @R16244
อาจารย์พิชัย อธิบายการประกาศตัวแปล Dim ให้หน่อยสิครับ

ผมมีอีกหลายที่เลย ที่วางแบบนี้ โดยไม่เข้าใจว่าทำไม(ทำตามคเค้าไป)

ขอบคุณครับอาจารย์ TTT

รออาจารย์สันติสุขครับ
19 @R16245
โค้ดที่ผมให้ไป เป็นการเลือกบรรทัดแรกของกระดาษที่จะพิมพ์เท่านั้น ไม่ได้เลือกเรคอร์ดแรกที่จะพิมพ์ไปด้วย เรคอร์ดแรกที่จะพิมพ์ยังคงเป็นเรคอร์ดที่ 1 จาก RecordSource อยู่ดี แต่ที่คุณ Un ต้องการคือเลือกเรคอร์ดแรกที่จะพิมพ์ด้วย ดังนั้นถ้าเราต้องการพิมพ์เรคอร์ดที่ 33 เราต้องเลื่อนเรคอร์ดทิ้งไป 32 เรคอร์ดก่อน แล้วก็ค่อยเข้าสู่การทำงานของโค้ดเดิม เราทำได้โดยปล่อยให้ Access พิมพ์ไปตามปกติ 32 เรคอร์ดนั่นแหล่ะ แต่เราไม่ให้มันแสดงออกมา (โดยการกำหนด .Visible) แล้วก็ต้องไม่ให้มันเลื่อนบบรทัดของกระดาษไปด้วย (โดยการกำหนด .MoveLayout)


Private Sub Detail_Format(Cancel As Integer, FormatCount As Integer)
    Static myLine   As Long
    Static myRec    As Long
    
    myRec = myRec + 1
    If myRec < Forms("ชื่อฟอร์ม").myFirstRecord Then ' พิมพ์เรคอร์ดทิ้งไป จนกว่าจะถึงเรคอร์ดแรกที่ต้องการพิมพ์
        Me.MoveLayout = False ' ไม่ต้องให้เลื่อนบรรทัดการเพิมพ์
        Me.ชื่อคอลโทรล.Visible = False ' ซ่อนคอลโทรลต่างๆไว้
        Exit Sub
    End If
    
    myLine = myLine + 1
    If myLine <= Forms("ชื่อฟอร์ม").myLastLine Then ' ถ้าบรรทัดที่กำลังจะพิมพ์ในรายงานน้อยกว่าบรรทัดสุดท้ายที่เคยพิมพ์ไปแล้ว
        Me.NextRecord = False        ' โปรแกรมจะไม่ข้ามไปยังเรคอร์ดต่อไป
        Me.ชื่อคอลโทรล.Visible = False ' ซ่อนคอลโทรลต่างๆไว้เพื่อให้พิมพ์ออกมาเป็นบรรทัดเปล่าๆ
    Else
        Me.ชื่อคอลโทรล.Visible = True
    End If

...
...
End Sub


หมายเหตุ :
1. โค้ดนี้ไม่ต้องมีการ declare MyLine ที่ข้างนอก procedure แล้วนะครับ เพราะเราใช้ static variable แทน
2. Forms("ชื่อฟอร์ม").myFirstRecord เอาไว้ใส่ลำดับของเรคอร์ดแรกที่ต้องการพิมพ์
3. Forms("ชื่อฟอร์ม").myLastLine ความหมายยังเหมือนเดิม
20 @R16250
โอเค ทดสอบแล้ว ใช้ได้ดีครับ

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