หากมีคำถาม ขอให้ไปโพสต์ลง เว็บบอร์ดจีทูจีเน็ตดอตคอม ตัวใหม่แทนน่ะครับ

หรือติดต่อเข้ามาทาง Inbox ที่ เฟซบุ๊ค ผมครับ

หน้าหลัก
ข่าวสาร - บทความ ทั้งหมด
VB 6/VB.Net
ASP/ASP.Net
จับฉ่ายคอมพิวเตอร์
เรียนรู้ผ่าน Flash Movie
บทความที่มีผู้ตอบล่าสุด  
 RSS Feeds
 ดาวน์โหลดโปรแกรม RSS Reader ได้ที่นี่ ...   Download โปรแกรม RSS Reader

Forum - www.g2gnet.com
Webmaster - www.g2gnet.com
Visitors - Session views
 4 7 6 3 6 1 7

7 ธันวาคม พ.ศ.2549
80 Users On-Line.
Visitors - Page views
 7 9 8 8 2 8 9
1 กุมภาพันธ์ พ.ศ.2551

Google   
เว็บ g2gnet.com
ขนาดตัวอักษร:  

การพิมพ์บาร์โค้ดด้วย ActiveReport.Net ออกกระดาษ A4 (VB.Net-2008)

Category »  VB 6/VB.Net
โดย : Webmaster เมื่อ 21/10/2554   เวลา: 09:41
(อ่าน : 22627) 
หลายปีก่อนผมได้เขียนบทความเพื่อพิมพ์รายงานของ ActiveReports 2 สำหรับ MS Visual Basic 6 ออกมา ก็เป็นที่รู้จักกันแพร่หลายมากขึ้น (โดยเฉพาะนักพัฒนาซอฟท์แวร์รุ่นใหม่ๆ) สำหรับ Component ตัวนี้ ก็เหมือนออกมาค้ำยัน Crystal Report เอาไว้ (ไม่ต่างจาก Intel ที่มี AMD มาขวางคออยู่ 55555+) ผมก็ไม่สรุปหรอกว่าตัวไหนมันดีกว่ากัน เพราะขึ้นอยู่กับความนิยมชมชอบของแต่ละคนไป คราวนี้จะมาว่ากันถึงเรื่อง ActiveReports.Net (Version 6) สำหรับใช้งานบน .NET เพื่อทำการพิมพ์รหัสบาร์โค้ดขนาด 5 หลักลงบนกระดาษ A4 ภาพโดยรวมมีหลักการทำงานไม่ได้ต่างไปจาก AR2 เลยแม้แต่น้อยครับพี่น้อง เพียงแต่เพิ่มเติมขีดความสามารถหลายๆอย่างเข้ามาอีกเพียบ ... ดังนั้นผมขอไม่สาธยายให้มากนัก คลิ๊กที่นี่ ... เพื่อไปอ่านหลักการทำงาน ... สำหรับมือใหม่พยายามหัดใช้ Debugger ให้เป็นด้วยน่ะครับ เพื่อไล่เรียงการทำงานไปทีละขั้นตอน ไม่ใช่รันพรวดเดียวจบ อ้าววว ... สรุปฉันเขียนโปรแกรมเป็นแล้วนี่หว่า 55555+
บทความที่เกี่ยวข้อง
Visual Basic 6.0 กับการทำรายงานด้วย ActiveReports ตอนที่ 1
Visual Basic 6.0 กับการทำรายงานด้วย ActiveReports ตอนที่ 2
ActiveReports 2.0 กับการพิมพ์บาร์โค้ด
การแทรกปุ่มคำสั่ง ToolBar ใน ARViewer ของ Active Report 2.0
ดาวน์โหลด ActiveReports.Net 6 ... (สำหรับสมาชิกเท่านั้น)
ดาวน์โหลด
ดาวน์โหลด Source Code สำหรับ MS Visual Basic.NET (2008)
เริ่มต้นกระบวนการทำงาน (หลังจากติดตั้ง AR.Net เรียบร้อย)

สร้าง Project ขึ้นมาใหม่


Project --> Properties (เหมือน VB6)


ตอนนี้เราจะใช้ Viewer ยังไม่ได้ จำเป็นต้องเลือกเข้ามาก่อน คลิ๊กที่ปุ่ม Add ...


เลือกตัวที่เราจำเป็นต้องใช้งาน หากต้องการ Export เป็น PDF หรือ Excel ก็ค่อยนำมาด้วยครับ


เลือกมาเรียบร้อย


จาก ToolBox ของ AR6 คลิ๊กเลือก Viewer แล้วนำมาวางไว้บนฟอร์ม


การนำเอา Toolbox ของ ActiveReports.Net เข้ามา (ทำเพียงครั้งแรกครั้งเดียวหลังติดตั้ง AR.Net เข้าไป)
ToolBox กลุ่มนี้จะนำไปใช้ใน ARDesigner น่ะครับ


การเพิ่ม Item หรือ สร้าง ARDesigner ขึ้นมาใหม่ ... เรียงตามลำดับตามภาพมาเลยน่ะครับ


คลิ๊กเลือก Barcode จาก ToolBox AR.Net มาวางไว้ในส่วนของ Detail ของ ARDesigner


การกำหนดคุณสมบัติ (Properties) ของส่วน Detail
กำหนดจำนวน 5 หลัก (Column) ในการพิมพ์
AcrossDown คือ การพิมพ์แนวขวางก่อนแล้วค่อยเลื่อนตำแหน่งลงมาในแถวต่อไป


การตั้งค่ากระดาษแบบ Design Time


Run Time

มาดูโค้ดกันเถอะ ...

' ส่วนของฟอร์ม
Imports DataDynamics.ActiveReports

Public Class frmPrintBarcode

    Private Sub btnPrintPreview_Click( _
        ByVal sender As System.Object, _
        ByVal e As System.EventArgs _
        ) Handles btnPrintPreview.Click
        ' ดัก error จากการป้อนข้อมูล
        If Trim(txtStartCode.Text) = "" Or Len(Trim(txtStartCode.Text)) = 0 Then   ' VB6 Style
            MessageBox.Show("กรุณาป้อนค่ารหัสเริ่มต้นให้เรียบร้อยก่อนด้วย.")
            txtStartCode.Focus()
            Exit Sub
        ElseIf Trim(txtEndCode.Text) = String.Empty Then   ' VB.Net Style
            MessageBox.Show("กรุณาป้อนค่ารหัสสิ้นสุดให้เรียบร้อยก่อนด้วย.")
            txtEndCode.Focus()
            Return
        End If
        ' ค่ารหัสสิ้นสุดน้อยกว่าค่าเริ่มต้นไม่ได้
        If (Val(txtEndCode.Text) - Val(txtStartCode.Text) < 0) Then
            MessageBox.Show("ค่ารหัสสิ้นสุดมีค่าน้อยกว่ารหัสเริ่มต้น กรุณาป้อนใหม่ก่อนด้วย.")
            txtEndCode.Focus()
            Return
        End If

        ' Instance name ARDesigner มันจะชี้ไปที่ไฟล์ arBarcode.vb
        Dim rpt As New arBarcode()
        ' Run Report
        rpt.Run()
        ' โหลดรายงาน document (arBarcode) เข้าสู่ ActiveReports Viewer
        Me.Viewer1.Document = rpt.Document

    End Sub

    Private Sub frmPrintBarcode_KeyDown( _
        ByVal sender As Object, _
        ByVal e As System.Windows.Forms.KeyEventArgs _
        ) Handles Me.KeyDown

        Select Case e.KeyCode
            Case Keys.F7
                Call btnPrintPreview_Click(sender, New System.EventArgs())
            Case Keys.F10
                Call btnExit_Click(sender, New System.EventArgs())
        End Select
    End Sub

    Private Sub frmPrintBarcode_Load( _
        ByVal sender As System.Object, _
        ByVal e As System.EventArgs _
        ) Handles MyBase.Load
        With txtStartCode
            .Text = "999999900"
            .MaxLength = 9
        End With
        With txtEndCode
            .Text = "999999999"
            .MaxLength = 9
        End With

        ' กำหนดความยาวของรหัสบาร์โค้ด
        cmbLength.Items.Add("6")    ' Index = 0
        cmbLength.Items.Add("7")    ' Index = 1
        cmbLength.Items.Add("8")    ' Index = 2
        cmbLength.Items.Add("9")    ' Index = 3
        ' เลือกรายการแรก คือ 6 เป็นค่าตั้งต้น
        cmbLength.SelectedIndex = 0
    End Sub

    Private Sub btnExit_Click( _
        ByVal sender As System.Object, _
        ByVal e As System.EventArgs _
        ) Handles btnExit.Click
        ' จบการทำงานของโปรแกรม
        Application.Exit()
    End Sub

    ' Function บังคับให้ผู้ใช้งานกดได้เฉพาะ 0-9 เท่านั้นใน TextBox
    ' ผมใช้ ASCII Code เป็นเงื่อนไขในการทดสอบ
    ' ขอให้พิจารณาถึงความแตกต่างของการใช้ IF-THEN-ELSE กับ SELECT CASE
    Function CheckDigitOnly(ByVal index As Integer) As Boolean
        Select Case index
            Case 48 To 57 ' Numeric 0 - 9
                CheckDigitOnly = False
            Case 8, 13, 46 ' Backspace = 8, Enter = 13, Delete = 46
                CheckDigitOnly = False
            Case Else
                CheckDigitOnly = True
        End Select
    End Function

    Private Sub txtStartCode_KeyPress( _
        ByVal sender As Object, _
        ByVal e As System.Windows.Forms.KeyPressEventArgs _
        ) Handles txtStartCode.KeyPress

        ' อ่านรายละเอียดเพิ่มเติม 
        ' ตรวจสอบการกดแป้นคีย์บอร์ดเพื่อให้รับค่าเฉพาะตัวเลข (VB.Net)
        e.Handled = CheckDigitOnly(Asc(e.KeyChar))
    End Sub

    Private Sub txtEndCode_KeyPress( _
        ByVal sender As Object, _
        ByVal e As System.Windows.Forms.KeyPressEventArgs _
        ) Handles txtEndCode.KeyPress

        ' จะกระโดดไปทดสอบค่าที่ฟังค์ชั่น CheckDigitOnly
        ' ASCII Code ของตัวอักขระ 0 - 9 โดยที่ 0 = 48, 1 = 49, 2 = 50, ... 9 = 57
        e.Handled = CheckDigitOnly(Asc(e.KeyChar))
    End Sub

    Private Sub frmPrintBarcode_Resize( _
        ByVal sender As Object, _
        ByVal e As System.EventArgs _
        ) Handles Me.Resize

        ' ปรับ Control Size แบบง่ายๆ
        With Me.Viewer1
            .Width = Me.Width - 9.5
            .Height = Me.Height - 110
        End With
    End Sub
End Class
มาดูโค้ดในส่วนของ ActiveReports

Imports DataDynamics.ActiveReports 
Imports DataDynamics.ActiveReports.Document 

Public Class arBarcode
    ' ตัวแปรแบบ Global ซึ่งเราจะมองเห็นได้หมดในโปรแกรมย่อยทุกตัว แต่เฉพาะ ARDesigner ตัวนี้เท่านั้น
    Dim BeginCode As Long
    Dim Count As Integer
    Dim CountCode As Integer

    Private Sub arBarcode_DataInitialize( _
        ByVal sender As Object, _
        ByVal e As System.EventArgs _
        ) Handles Me.DataInitialize

        ' จะเริ่มต้นการทำงานที่โปรแกรมย่อยตัวนี้

        ' การตั้งค่าแบบ Run Time (มีหน่วยวัดเป็นนิ้ว ... แต่สามารถเปลี่ยนได้)
        With PageSettings
            .Margins.Left = 0.5
            .Margins.Right = 0.3
            .Margins.Top = 0.5
            .Margins.Bottom = 0.5
            ' ตั้งค่ากระดาษแนวตั้ง
            .Orientation = PageOrientation.Portrait
            ' กระดาษขนาด A4
            .PaperKind = Drawing.Printing.PaperKind.A4
            ' กรณีที่กำหนดขนาดกระดาษเอง
            ' .PaperKind = Drawing.Printing.PaperKind.Custom
        End With

        ' กำหนดรูปแบบบาร์โค้ด (Barcode Style) ... ตัวอย่างนี้ใช้ Code128B
        Barcode1.Style = BarCodeStyle.Code_128_B

        ' เคลียร์ค่าตัวแปรเพื่อความแน่ใจ
        ' Count = 0 : CountCode = 0 : BeginCode = 0

        ' รับค่ารหัสบาร์โค้ดตัวแรกเข้ามา
        BeginCode = Val(frmPrintBarcode.txtStartCode.Text)

        ' นับจำนวนของการพิมพ์บาร์โค้ดทั้งหมด
        ' CountCode = End - Begin + 1
        ' ต้องบวกเพิ่มอีก 1 เพื่อให้ได้ค่าที่ถูกต้อง และจะใช้ตัวแปรนี้ในโปรแกรมย่อย FetchData events
        CountCode = Val(frmPrintBarcode.txtEndCode.Text) - Val(frmPrintBarcode.txtStartCode.Text) + 1

    End Sub

    Private Sub Detail1_Format( _
        ByVal sender As System.Object, _
        ByVal e As System.EventArgs _
        ) Handles Detail1.Format

        ' จัดรูปแบบการพิมพ์รหัสบาร์โค้ดออกมา เช่น BeginCode = 199, ความยาว 9 ตัว
        ' "0000000000" & 199 ... จะได้ ... "0000000000199"
        ' พอนับจากทางขวามา 9 ตัว ก็จะถูกตัดเหลือ "000000199"
        Barcode1.Text = Right("0000000000" & BeginCode, Val(frmPrintBarcode.cmbLength.Text))

        ' การวางตำแหน่งของชุดคำสั่งนี้สำคัญมาก เพราะหากคุณวางไว้ก่อนบรรทัดข้างบน ผลที่ได้จะเกิด Logical Error
        ' หรือได้ผลลัพธ์ออกมาไม่ตรงตามที่ต้องการ
        BeginCode = BeginCode + 1

        ' จากจุดนี้มันก็จะกระโดดไป arBarcode_FetchData
        ' เพื่อตรวจสอบว่า Count นับได้ครบตาม CountCode หรือไม่

    End Sub

    Private Sub arBarcode_FetchData( _
        ByVal sender As Object, _
        ByVal eArgs As DataDynamics.ActiveReports.ActiveReport.FetchEventArgs _
        ) Handles Me.FetchData

        Count = Count + 1
        ' หากนับได้ตรงตามจำนวนแล้วก็จะจบการทำงานในส่วนของการพิมพ์
        If Count > CountCode Then
            eArgs.EOF = True
            Exit Sub

        Else
            ' End Of File เป็นเท็จ ก็คือมันยังไม่หมดข้อมูลของการพิมพ์
            eArgs.EOF = False
            ' กระโดดไปทำงานต่อที่ Detal1_Format เพื่อทำการพิมพ์รหัสบาร์โค้ดต่อ
        End If
    End Sub

End Class
Conclusion:
หากพี่น้องท่านใดที่เคยสัมผัสมาทั้ง VB6 และมาถึง VB.Net ก็จะมองเห็นภาพได้อย่างชัดเจนเลยสำหรับ ActiveReports ว่า หลักการออกแบบ และ แนวคิดนั้นมันไม่ได้เปลี่ยนแปลงไปแต่อย่างใดเลย มันก็ยังคงเหมือนเดิมอยู่ ดังนั้นสำหรับผู้เริ่มต้นการเรียนรู้นั้น มันก็ไม่ได้จำเป็นเลยที่จะต้องใช้ของหนัก กินทรัพยากรเปลือง อย่าง Visual Studio.NET สำคัญที่คุณเริ่มต้น หรือ ถูกสร้างมาอย่างถูกทิศทางหรือไม่ ... คำที่ชอบพูดๆกัน "เขาว่ากันว่า ตัวนั้นดีกว่าตัวนี้" ผมว่าเลิกปลูกฝังแนวคิดผิดๆกันได้แล้วล่ะครับ เหอๆๆๆๆ

จี ทู จี เน็ต ดอต คอม - g2gNet Dot Com
เลขทะเบียนพาณิชย์อิเล็กทรอนิกส์ 0407314800231
CopyLeft © 2004 - 2099 g2gNet.Com All rights reserved.
Email: [email protected] หรือ โทร. 08-6862-6560