ผู้เขียน หัวข้อ: [VB6] แจกโค้ดการพิมพ์ใบเสร็จรับเงิน ขนาดหน้ากว้าง 3 นิ้ว ด้วย ActiveReport 2.0  (อ่าน 451 ครั้ง)

ออฟไลน์ ทองก้อน ทับทิมกรอบ

  • Administrator
  • *****
  • กระทู้: 245
  • เพศ: ชาย
  • Webmaster G2GNet


แอดมินเองนี่แหละเป็นคนไทยคนแรก ที่แจกจ่ายความรู้เรื่องราวต่างๆของ ActiveReport ในการทำรายงานบน Windows Application มานานหลายปีแล้ว เพื่อเป็นอีกหนึ่งทางเลือกให้กับเหล่านักพัฒนาซอฟท์แวร์รุ่นใหม่ๆ ได้ลองเปรียบเทียบกับ 3rd Party ค่ายอื่นๆดูบ้าง ไม่ใช่จะมาผูกขาดแต่เฉพาะ Crystal Report กันมาอย่างช้านาน ซึ่งท่านสามารถสืบค้นหาจาก GooGle ก็จะเจอข้อมูลและโค้ดของ ActiveReport ทั้ง VB6 และ VB.Net ในภาคภาษาไทยของแอดมินเองครับ ...

สำหรับการแจกโค้ดชุดนี้ สำหรับมิตรรักแฟนคลับสาย Visual Basic 6 โดยเฉพาะ ท่านสามารถพิมพ์สลิปออกมาได้ โดยที่ไม่ต้องมีเครื่องพิมพ์มาทดสอบแต่ประการใด เพราะแอดมินให้โค้ดจริงๆเป็นๆกันไปเลยครับผม ... ส่วนกรณีของ Visual Studio .NET ก็ใช้หลักการเดียวกัน เหมือนกันทั้งหมดนั่นแหละครับ ซึ่งก็จัดทำไว้เรียบร้อยหมดแล้ว แต่ยังไม่แจกโค้ด .NET ก็อย่าเอาไปคิดให้หนักเลยครับ มีโค้ดไกด์นำทางให้ขนาดนี้แล้ว หากท่านติดขัดปัญหา ก็เชิญสอบถามเข้ามาได้ข่ะรับ ...


เมื่อ Preview หรือการแสดงผลข้อมูลก่อนการพิมพ์

ดูวิธีการติดตั้ง ActiveReport 2.0 ได้ที่นี่ และ ดาวน์โหลด ActiveReport 2.0 ได้ที่นี่ (สำหรับสมาชิกเท่านั้น)

ดาวน์โหลดโค้ดต้นฉบับ Visual Basic 6 ได้ที่นี่


Project --> Components ... หรือการเรียกใช้ ActiveReports Viewer เพื่อ Preview แสดงผลก่อนพิมพ์

โค้ดส่วนของการแสดงข้อมูลการพิมพ์



โค๊ด: [Select]
' / -----------------------------------------------------------------------------------------------
' / Developer : Mr.Surapon Yodsanga (Thongkorn Tubtimkrob)
' / eMail : thongkorn@hotmail.com
' / URL: http://www.g2gnet.com (Khon Kaen - Thailand)
' / Facebook: www.facebook.com/g2gnet
' / Purpose:  Print 3 Inch Slip with ActiveReport 2.0
' / Microsoft Visual Basic 6.0 Service Pack 6
' / -----------------------------------------------------------------------------------------------
Option Explicit

Private Sub cmdExit_Click()
    Unload Me
End Sub

Private Sub cmdPreview_Click()
    frmPrintAR2.Show
End Sub

Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
    ' ก่อนจะใช้ Sub Program นี้ได้ ... พี่น้องต้องกำหนดค่าของ Form ให้คุณสมบัติ KeyPreview = True ก่อน
    Select Case KeyCode
        Case vbKeyF1: MsgBox "No help now."
        Case vbKeyF7:
                    Call cmdPreview_Click
        Case vbKeyF10:
                    cmdExit_Click
   End Select
End Sub

Private Sub Form_Load()
    ' Center screen with coding
    Me.Move (Screen.Width - Width) \ 2, (Screen.Height - Height) \ 2
    ' Initial ListView control with run time (no design time)
    Call SetupListView
    Call ListFile
End Sub

' / -----------------------------------------------------------------------------------------------
' / แสดงรายชื่อไฟล์ใน ListView Control
Private Sub ListFile()
' / -----------------------------------------------------------------------------------------------
    Dim LV As ListItem
   
    lvwData.ListItems.Clear
    Set LV = lvwData.ListItems.Add(, , "1")
    ' Product Code
    LV.SubItems(1) = "1234567890A"
    ' Product Name
    LV.SubItems(2) = "หนังสือ VB6"
    ' Price
    LV.SubItems(3) = "555.55"
    '
    Set LV = lvwData.ListItems.Add(, , "2")
    ' Product Code
    LV.SubItems(1) = "1234567890128"
    ' Product Name
    LV.SubItems(2) = "เส้นทางสายฟรีแลนซ์"
    ' Price
    LV.SubItems(3) = "999.99"
    '
    Set LV = lvwData.ListItems.Add(, , "3")
    ' Product Code
    LV.SubItems(1) = "123456789XYZ"
    ' Product Name
    LV.SubItems(2) = "VB6 for Beginner"
    ' Price
    LV.SubItems(3) = "50.00"
End Sub

' Initial ListView
Sub SetupListView()
    With Me.lvwData
        ' Coding with Run Time
        .View = lvwReport
        .Arrange = lvwNone
        .LabelEdit = lvwManual
        .BorderStyle = ccFixedSingle
        .Appearance = cc3D
       
        .HideColumnHeaders = False
        .HideSelection = False
        .LabelWrap = False
        .MultiSelect = False
        .Enabled = True
        .AllowColumnReorder = True
        .Checkboxes = False
        .FlatScrollBar = False
        .FullRowSelect = True
        .GridLines = True
        .HotTracking = False
        .HoverSelection = False
       
        ' False = ไม่ต้องจัดเรียง
        .Sorted = False
        ' ใช้หลัก 0
        '.SortKey = 0
        '.SortOrder = lvwAscending
       
        ' Add header
        ' ซ่อน Primary Key
        .ColumnHeaders.Add , , "PK", .Width = 0
        .ColumnHeaders.Add , , "รหัสสินค้า", .Width \ 3 - 100
        .ColumnHeaders.Add , , "ชื่อสินค้า", .Width \ 3 + 490, lvwColumnLeft
        .ColumnHeaders.Add , , "ราคา", .Width \ 3 - 700, lvwColumnRight
    End With
   
End Sub

Private Sub Form_Resize()
On Error Resume Next
If Me.WindowState = vbMinimized Then Exit Sub
    ' Width
    If Me.Width < 9345 Then Me.Width = 9345
    ' Height
    If Me.Height < 6180 Then Me.Height = 6180
    ' Adjust width & height of ListView control upon form size
    lvwData.Move 15, 15, Me.Width - cmdPreview.Width - 320, Me.Height - (lvwData.Top) - stbMain.Height - 510
    cmdPreview.Move Me.ScaleWidth - cmdPreview.Width - 30
    cmdExit.Move cmdPreview.Left, cmdPreview.Top + cmdPreview.Height + 60
End Sub

Private Sub Form_Unload(Cancel As Integer)
    ' ลบไฟล์ขยะออกไปให้หมด ก่อนที่จะจบโปรแกรมออกไป
    If Dir$(App.Path & "\*.tmp") <> "" Then Kill App.Path & "\*.tmp"
    Set frmPrintAR2 = Nothing
    End
End Sub

โค้ดในส่วนของการ Preview

โค๊ด: [Select]
' / -----------------------------------------------------------------------------------------------
' / Developer : Mr.Surapon Yodsanga (Thongkorn Tubtimkrob)
' / eMail : thongkorn@hotmail.com
' / URL: http://www.g2gnet.com (Khon Kaen - Thailand)
' / Facebook: www.facebook.com/g2gnet
' / Purpose:  Print 3 Inch Slip with ActiveReport 2.0
' / Microsoft Visual Basic 6.0 Service Pack 6
' / -----------------------------------------------------------------------------------------------
Option Explicit

Private Sub cmdExit_Click()
    Unload Me
End Sub

Private Sub Form_Load()
    Me.Move (Screen.Width - Me.Width) \ 2, (Screen.Height - Me.Height) \ 2, 9000, 4545
    ' ผูก Activereport Designer เข้ากับ ActiveReport Viewer
    Dim rptPrint As Object
    Set rptPrint = New arPrint3inchSlip ' <-- ชื่อรายงาน
    Set Me.ARViewer.object = rptPrint   ' <-- ผูก Designer เข้ากับ ActiveReport Viewer (ARViewer คือชื่อคอนโทรลที่อยู่บนฟอร์ม)
    ARViewer.Zoom = 85  ' <-- การแสดงผลเป็น %
End Sub

Private Sub Form_Resize()
On Error Resume Next
    If Me.WindowState = vbMaximized Then
        Me.WindowState = vbNormal
        Exit Sub
    End If
    '
    If Me.Height < 9855 Then
        Me.Height = 9855
        Exit Sub
    End If
    '
    If Me.Width < 9745 Then
        Me.Width = 9745
        Exit Sub
    End If
    fraData.Width = Me.ScaleWidth - 30
    fraData.Height = Me.ScaleHeight
    ARViewer.Move 15, 120, fraData.Width - 60, fraData.Height - 180
End Sub

Private Sub Form_Unload(Cancel As Integer)
    Set frmPrintAR2 = Nothing
End Sub

โค้ดในส่วนของ ActiveReport Designer (DSR)

สรุปหลักการ: (เพราะผมอธิบายไว้หลายรอบแล้ว)
เริ่มต้นการทำงาน เมื่อรายงานถูกตั้งค่าเริ่มต้นต่างๆอยู่ที่ ActiveReport_Initialize() เรียบร้อยแล้ว ก็จะทำการเรียก (Fetch) หรือตรวจสอบข้อมูลที่ ActiveReport_FetchData(EOF As Boolean) หากมีข้อมูลก็ส่งไปพิมพ์ที่ Detail_Format แล้วก็วนกลับไป Fetch Data ใหม่อีกรอบ หากไม่มีข้อมูล (EOF = TRUE) ที่จะพิมพ์ก็จบงานซิครับ ...



โค๊ด: [Select]
' / -----------------------------------------------------------------------------------------------
' / Developer : Mr.Surapon Yodsanga (Thongkorn Tubtimkrob)
' / eMail : thongkorn@hotmail.com
' / URL: http://www.g2gnet.com (Khon Kaen - Thailand)
' / Facebook: www.facebook.com/g2gnet
' / Purpose:  Print 3 Inch Slip with ActiveReport 2.0
' / Microsoft Visual Basic 6.0 Service Pack 6
' / -----------------------------------------------------------------------------------------------
Option Explicit
Dim ItemNo As Long
Dim GrandTotal As Double

Private Sub ActiveReport_FetchData(EOF As Boolean)
    ItemNo = ItemNo + 1
    ' ตรวจสอบจำนวนการพิมพ์ทั้งหมด ด้วยการนับจำนวนแถวใน ListView Control
    ' อ้างถึง frmListData.lvwData.ListItems.Count
    If ItemNo > frmListData.lvwData.ListItems.Count Then
        EOF = True
        Exit Sub
    Else
        EOF = False
    End If
End Sub

Private Sub ActiveReport_Initialize()
    PageSettings.Orientation = ddOPortrait  ' พิมพ์กระดาษแนวตั้ง
    PageSettings.PaperSize = 256 ' Custom Paper หรือกำหนดขนาดกระดาษเอง
    PageSettings.LeftMargin = 150    ' ห่างจากระยะขอบซ้าย หน่วยวัดเป็น Twip เมื่อ 1440 Twip = 1 นิ้ว หรือ 2.54 ซม.
    PageSettings.RightMargin = 100
    PageSettings.BottomMargin = 300
    PageSettings.TopMargin = 300
    ' กำหนดความกว้างกระดาษ
    PageSettings.PaperWidth = (7.6 * 1440 / 2.54)
    ' ไม่ได้กำหนดความสูง เพราะว่าเครื่องพิมพ์สลิปโดยทั่วไปจะตัดกระดาษให้อัตโนมัติ
   
    ' เคลียร์ค่าก่อนพิมพ์
    txtItem.Text = ""
    txtProductName.Text = ""
    txtPrice.Text = ""
    txtGrandTotal.Text = ""
   
End Sub

' / -----------------------------------------------------------------------------------------------
' / รายละเอียดต่างๆก็จะนำมาแสดงใน Detail อยู่แล้ว
Private Sub Detail_Format()
' / -----------------------------------------------------------------------------------------------
    ' ItemNo จะเป็นการนับจำนวนแถว (ประกาศตัวแปรแบบ Public อยู่บนสุด)
    ' อ้างอิงค่าในการพิมพ์จากฟอร์ม โดยไม่จำเป็นต้องมีการส่งค่ามา เริ่มจากหลักที่ 1 (Index = 0)
    txtItem.Text = ItemNo
    txtProductName.Text = "" & frmListData.lvwData.ListItems(ItemNo).SubItems(2)
    txtPrice.Text = "" & Format(frmListData.lvwData.ListItems(ItemNo).SubItems(3), "#,##0.00")
    GrandTotal = GrandTotal + Val(txtPrice.Text)
End Sub

Private Sub GroupFooter1_Format()
    txtGrandTotal.Text = "รวมจำนวนเงิน: " & Format(GrandTotal, "#,##0.00") & ""
End Sub

Private Sub ActiveReport_ReportEnd()
   Set arPrint3inchSlip = Nothing
    Unload Me
End Sub

ดาวน์โหลดโค้ดต้นฉบับ Visual Basic 6 ได้ที่นี่

ดูวิธีการติดตั้ง ActiveReport 2.0 ได้ที่นี่ และ ดาวน์โหลด ActiveReport 2.0 ได้ที่นี่ (สำหรับสมาชิกเท่านั้น)

บันทึกการเข้า
สิ่งที่ดีกว่าการให้ คือการให้แบบไม่มีที่สิ้นสุด

ออฟไลน์ โจ้

  • Newbie
  • *
  • กระทู้: 21
ขอบคุณครับ  :D :D

บันทึกการเข้า

ออฟไลน์ Mr.Den

  • Jr. Member
  • **
  • กระทู้: 73
  • เพศ: ชาย
ขอบคุณมากครับอาจารย์  :'( :-*

บันทึกการเข้า

ออฟไลน์ hot2

  • Newbie
  • *
  • กระทู้: 16
ขอบคุณมากครับ

บันทึกการเข้า

ออฟไลน์ naien

  • Newbie
  • *
  • กระทู้: 36
ขอบคุณมากครับ

บันทึกการเข้า

ออฟไลน์ pankiat913

  • Newbie
  • *
  • กระทู้: 15
ขอบคุณครับ

บันทึกการเข้า

ออฟไลน์ fmmanchan

  • Newbie
  • *
  • กระทู้: 3
ลองเอาไปพิมพ์ใบเสร็จกับเครื่องพิมพ์ TMU 220 แล้วมันออกมาตัวเล็กมากแบบบีบย่อมากครับถ้าเป็น windows 8.1 แต่ถ้าเป็น windows 7 ลงมาตัวอักษรปกติไม่รู้ต้องแก้ที่ driver printer เอง หรือเปล่าเพราะผมลองมา 2 ตัวแล้วทั้ง Datareport กับ Active report ก็เป็นทั้ง 2 ตัวเลย ใครพอมีวิธีแก้บ้างครับ

บันทึกการเข้า

ออฟไลน์ ทองก้อน ทับทิมกรอบ

  • Administrator
  • *****
  • กระทู้: 245
  • เพศ: ชาย
  • Webmaster G2GNet
มีปัญหา 2 เรื่อง คือ ฟอนต์ กับ Driver ครับ ... แต่ผมคิดว่าเป็นที่ฟอนต์มากกว่า เพราะขึ้นกับชุดติดตั้ง Windows หากดาวน์โหลดจาก Microsoft จะได้มาตรฐานกว่า ส่วนพวกแผ่นนั่นมักชอบโมดิฟายมาก่อน โดยที่เราไม่รู้ครับ

บันทึกการเข้า
สิ่งที่ดีกว่าการให้ คือการให้แบบไม่มีที่สิ้นสุด

ออฟไลน์ fmmanchan

  • Newbie
  • *
  • กระทู้: 3
ขอบคุณครับ

บันทึกการเข้า