|    
         
        
           
            |   | 
            
			 
   
     
        สร้างป้ายบาร์โค๊ตจากฟอร์น Code39 และ Crystal Report ด้วย Visual Basic 2013       | 
   
 
			
  บทความนี้จะนำเสนอแนวทางการสร้างบาร์โค๊ต โดยใช้ Font บาร์โค๊ต ซึ่งฟอร์นนี้มีชื่อว่า 3OF9_NEW.TTF ซึ่งเป็นฟอร์นเก่าดั้งเดิม คาดว่าน่าจะออกมานานแล้ว ซึ่งจะพัฒนาบน Visual Studio 2013 , .net 3.5 ทำคู่กับ Crystal Report For Visual Studio 2013 (หากใครยังไม่มีโหลดได้ที่นี่ https://www.aspsnippets.com/Articles/Download-Crystal-Reports-for-Visual-Studio-2013.aspx) 
 
    หลักการ จะทำการบันทึกข้อมูลลงในดาต้าเทเบิ้ล Z(DataTabel) และแสดงผลออกทาง Crystal Report โดย เพิ่ม * เข้าไปในส่วนหัวและท้ายของชุดตัวอักษรที่จะนำมาทำบาร์โค๊ต จากนั้นกำหนดให้แสดงผลโดยใช้ฟอร์น 3OF9_NEW.TTF ดังนั้นในเครื่องของผู้ใช้งานต้องติดตั้งฟอร์น 3OF9_NEW.TTF เข้าไปก่อน  
 
     เริ่มต้นด้วยการสร้าง Windows Form และ คอนโทรลข้อมาตารูปด้านล่าง  
 
 
 
     และสร้าง DataSet ขึ้นมา 1 ตัว ชื่อ DataSet1 
 
 
 
     จากนั้นสร้าง DataTabel ขึ้นมา 2 ตาราง ชื่อ txtLabel และ snlable_id  ตามรูป 
 
 
 
 
 
     โค๊ตใน Form1 
 
Code (VB.NET) 
Imports CrystalDecisions.CrystalReports.Engine
Imports System.Text
Public Class Form1
    ''' <summary>
    ''' สั่งปิด/เปิด คอนโทรลต่าง ๆ 
    ''' </summary>
    ''' <remarks></remarks>
    Private Sub rbCheck()
        If rbOneNum.Checked = True Then
            Me.NumericUpDown1.Enabled = True
            Me.txtOneNum.Clear()
            Me.txtOneNum.Enabled = True
        Else
            Me.txtOneNum.Clear()
            Me.txtOneNum.Enabled = False
        End If
        If rbCount.Checked = True Then
            Me.NumericUpDown1.Enabled = False
            Me.txtCountStart.Enabled = True
            Me.txtCountEnd.Enabled = True
        Else
            Me.NumericUpDown1.Enabled = True
            Me.txtCountStart.Enabled = False
            Me.txtCountEnd.Enabled = False
        End If
        If rbRanDom.Checked = True Then
            Me.NumericUpDown1.Enabled = True
            Me.cbbRandom.Enabled = True
            Me.NumericUpDown2.Enabled = True
        Else
            Me.cbbRandom.Enabled = False
            Me.NumericUpDown2.Enabled = False
        End If
    End Sub
    Dim snum As String = "123456789" & _
                            "123456789" & _
                            "123456789" & _
                            "123456789" & _
                            "123456789"
    Dim stext As String = "ABCDEFGHIJKLMNPQRSTUVWXYZ" & _
                            "ABCDEFGHIJKLMNPQRSTUVWXYZ" & _
                            "ABCDEFGHIJKLMNPQRSTUVWXYZ" & _
                            "ABCDEFGHIJKLMNPQRSTUVWXYZ" & _
                            "ABCDEFGHIJKLMNPQRSTUVWXYZ"
    ''' <summary>
    ''' ฟังก์ชั่นสุ่มตัวเลขและตัวอักษร
    ''' </summary>
    ''' <param name="s"></param>
    ''' <param name="n"></param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Private Function snRnd(ByVal s As String, ByVal n As Integer)
        Dim r As New Random
        Dim sb As New StringBuilder
        For i As Integer = 1 To n
            Dim idx As Integer = r.Next(0, s.Length)
            sb.Append(s.Substring(idx, 1))
        Next
        Return sb.ToString()
    End Function
    Private Sub rbCount_CheckedChanged(sender As Object,
                                         e As EventArgs) Handles rbCount.CheckedChanged, rbOneNum.CheckedChanged, rbRanDom.CheckedChanged
        Call rbCheck()
    End Sub
    Private Sub cbbRandom_KeyPress(sender As Object, e As KeyPressEventArgs) Handles cbbRandom.KeyPress
        'ปิด ComboBox ไม่ให้พิมพ์ได้
        e.Handled = True
    End Sub
    Private Sub SNLabelFrm_FormClosing(sender As Object, e As FormClosingEventArgs) Handles Me.FormClosing
        Me.Dispose()
    End Sub
    Private Sub SNLabelFrm_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        'เพิ่มไอเท็มเข้า ComboBox
        Me.cbbRandom.Items.Clear()
        Me.cbbRandom.Items.Add("ตัวเลขและตัวอักษร")
        Me.cbbRandom.Items.Add("ตัวเลข")
        Me.cbbRandom.Items.Add("ตัวอักษร")
        Me.cbbRandom.SelectedIndex = 0
    End Sub
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        'เคลียร์ตารางในดาต้าเทเบิ้ล textLabel
        Me.DataSet11.textLabel.Rows.Clear()
        'เพิ่มข้อมูลฉลากป้ายบาร์โค๊ตลงในดาต้าเทเบิ้ล
        Me.DataSet11.textLabel.Rows.Add(Me.TextBox1.Text)
        'เคลียร์ตารางในดาต้าเทเบิ้ล snlable_id
        Me.DataSet11.snlable_id.Rows.Clear()
        'ตรวจสอบเงื่อนไขตามการเลือก RadioButton
        'rbOneNum คือ กำหนดให้ป้ายฉลากทั้งหมด เหมือนกันทุกอัน
        If rbOneNum.Checked = True Then
            For r As Integer = 0 To Me.NumericUpDown1.Value - 1
                Dim newrowsss As DataSet1.snlable_idRow
                newrowsss = DataSet11.snlable_id.NewRow
                newrowsss.num_sn = Me.txtFrontNum.Text & Me.txtOneNum.Text
                Me.DataSet11.snlable_id.Rows.Add(newrowsss)
            Next
            'rbCount คือ กำหนดให้ป้ายฉลากทั้งหมด เรียงตามลำดับตัวเลข เช่น 00001, 00002, 00003 ฯ
        ElseIf rbCount.Checked = True Then
            If Me.txtCountStart.Text = Nothing And Me.txtCountEnd.Text = Nothing Then
                MessageBox.Show(Me, "กรุณาป้อนค่าตัวเลขเริ่มต้นและสิ้นสุดในช่องด้วย",
                                "ผิดพลาด", MessageBoxButtons.OK, MessageBoxIcon.Information)
                Exit Sub
            End If
            'เงื่อนไขการใส่ตัวเลขเรียงลำดับ
            'txtCountStart.Text ต้องมีค่าน้อยกว่า txtCountEnd.Text เสมอ ถ้าไม่ใช่จะแสดงข้อความเตือน
            If CInt(Me.txtCountStart.Text) > CInt(Me.txtCountEnd.Text) Then
                MessageBox.Show(Me, "ตัวเลขในช่องเริ่มมีค่ามากกว่าช่องถึง" & vbNewLine & "กรุณาใส่ค่าช่องตัวเลขเริ่มต้น ให้มีค่าน้อยกว่าค่า สิ้นสุด",
                                "ผิดพลาด", MessageBoxButtons.OK, MessageBoxIcon.Information)
                Exit Sub
            Else
                'หาค่าจำนวนการเรียงลำดับ
                Dim ccc As Integer = CInt(Me.txtCountEnd.Text) - CInt(Me.txtCountStart.Text)
                'เงื่อนไขถ้าเกิน 10000 จะแสดงข้อความเตือน (สร้างป้ายบาร์โค๊ตเยอะมากจะทำให้โปรแกรมทำงานช้าและอาจจะค้างได้ ฉะนั้นไม่เกินหมื่นก็น่าจะพอ)
                If ccc > 10000 Then
                    MessageBox.Show(Me, "สร้างป้ายแยะเกินไปแล้วแก ! ขนาดเกินหมื่น มันใช้เวลานานนะ",
                                  "สร้างทีล่ะนิด ทีละหน่อยนะ", MessageBoxButtons.OK, MessageBoxIcon.Information)
                    Exit Sub
                Else
                    'สร้างข้อมูลลงในดาต้าเทเบิ้ล
                    Dim num_start As Integer = Me.txtCountStart.Text
                    For r As Integer = CInt(Me.txtCountStart.Text) To CInt(Me.txtCountEnd.Text)
                        num_start = num_start + 1
                        Dim newrowsss As DataSet1.snlable_idRow
                        newrowsss = DataSet11.snlable_id.NewRow
                        newrowsss.num_sn = Me.txtFrontNum.Text & num_start
                        Me.DataSet11.snlable_id.Rows.Add(newrowsss)
                    Next
                End If
            End If
            ' rbRanDom คือ การส้รางรหัสบาร์โค๊ตจากการสุ่ม จาก ฟังก์ชั่น snRnd 
        ElseIf rbRanDom.Checked = True Then
            'สร้างข้อมูลลงในดาต้าเทเบิ้ล
            For r As Integer = 0 To Me.NumericUpDown1.Value - 1
                Dim newrowsss As DataSet1.snlable_idRow
                newrowsss = DataSet11.snlable_id.NewRow
                Dim nr As String = String.Empty
                If Me.cbbRandom.Text = "ตัวเลขและตัวอักษร" Then
                    nr = snRnd(snum & stext, Me.NumericUpDown2.Value)
                ElseIf Me.cbbRandom.Text = "ตัวเลข" Then
                    nr = snRnd(snum, Me.NumericUpDown2.Value)
                ElseIf Me.cbbRandom.Text = "ตัวอักษร" Then
                    nr = snRnd(stext, Me.NumericUpDown2.Value)
                End If
                Threading.Thread.Sleep(100)
                newrowsss.num_sn = Me.txtFrontNum.Text & nr
                Me.DataSet11.snlable_id.Rows.Add(newrowsss)
            Next
        End If
        Dim cry As ReportDocument = New ReportDocument
        'เลือกรีพอร์ต แบบที่มีป้ายฉากหรือไม่มีป้ายฉลาก
        If Me.cbLable.Checked = True Then
            cry.Load(Application.StartupPath & "\CrystalReport1.rpt")
        Else
            cry.Load(Application.StartupPath & "\CrystalReport2.rpt")
        End If
        cry.SetDataSource(Me.DataSet11)
        CrystalReportViewer1.ReportSource = cry
        cry.Refresh()
    End Sub
    Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
        'สั่งพิมพ์ออกทางเครื่องพิมพ์
        If Not CrystalReportViewer1.ReportSource Is Nothing Then
            CrystalReportViewer1.PrintReport()
        Else
            MessageBox.Show(Me, "ยังไม่มีข้อมูลที่จะพิมพ์ โปรดกด 'แสดงตัวอย่าง'", "ไม่มีข้อมูล",
                                 MessageBoxButtons.OK, MessageBoxIcon.None)
        End If
    End Sub
    Private Sub txtCountStart_KeyPress(sender As Object, e As KeyPressEventArgs) Handles txtCountStart.KeyPress
        'ทำให้ TextBox พิมพ์ได้เฉพาะตัวเลขเท่านั้น
        Select Case Asc(e.KeyChar)
            Case 48 To 57 ' key โค๊ด ของตัวเลขจะอยู่ระหว่าง48-57ครับ 48คือเลข0 57คือเลข9ตามลำดับ
                e.Handled = False
            Case 8, 13, 127 ' ปุ่ม Backspace = 8,ปุ่ม Enter = 13, ปุ่มDelete = 46
                e.Handled = False
            Case Else
                e.Handled = True
        End Select
    End Sub
    Private Sub txtCountEnd_KeyPress(sender As Object, e As KeyPressEventArgs) Handles txtCountEnd.KeyPress
        'ทำให้ TextBox พิมพ์ได้เฉพาะตัวเลขเท่านั้น
        Select Case Asc(e.KeyChar)
            Case 48 To 57 ' key โค๊ด ของตัวเลขจะอยู่ระหว่าง48-57ครับ 48คือเลข0 57คือเลข9ตามลำดับ
                e.Handled = False
            Case 8, 13, 127 ' ปุ่ม Backspace = 8,ปุ่ม Enter = 13, ปุ่มDelete = 46
                e.Handled = False
            Case Else
                e.Handled = True
        End Select
    End Sub
    Private Sub NumericUpDown1_KeyPress(sender As Object, e As KeyPressEventArgs) Handles NumericUpDown1.KeyPress
        'ปิด  NumericUpDown1 ไม่ให้ผู้ใช้สามารถพิมพ์อะไรลงไปได้
        e.Handled = True
    End Sub
    Private Sub NumericUpDown2_KeyPress(sender As Object, e As KeyPressEventArgs) Handles NumericUpDown2.KeyPress
        'ปิด  NumericUpDown2 ไม่ให้ผู้ใช้สามารถพิมพ์อะไรลงไปได้
        e.Handled = True
    End Sub
    Private Sub cbLable_CheckedChanged(sender As Object, e As EventArgs) Handles cbLable.CheckedChanged
        If Me.cbLable.Checked = True Then
            Me.TextBox1.Enabled = True
        Else
            Me.TextBox1.Enabled = False
        End If
    End Sub
    Private Sub txtFrontNum_KeyPress(sender As Object, e As KeyPressEventArgs) Handles txtFrontNum.KeyPress
        'ตัวอักษรนำหน้า เมื่อมีอักษรนำหน้า จะไปบวก ลบ กับรหัสตัวเลข ซึ่งรวมกันต้องไม่เกิน 10 ตัวอักษร หากเกินอาจจะยาวจะเกินขอบฉลากบาร์โค๊ต ทำให้สแกนไม่ได้
        Dim ml As Integer = 10 - (Me.txtFrontNum.Text.Length + 1)
        Me.txtOneNum.MaxLength = ml
        Me.txtCountStart.MaxLength = ml
        Me.txtCountEnd.MaxLength = ml
        Me.NumericUpDown2.Maximum = ml
    End Sub
End Class
 
 
     จากนั้นก็สร้าง Crystal Report  ชื่อ CrystalReport1 
  
 
     เลือกเป็น Mail Label จากนั้นกด ok 
 
  
 
     เลือก Databel ที่สร้างไว้ จากนั้นกด Finish  
 
  
 
      กำหนดขนาดของป้าย ตามขนาดที่ต้องการ โดยผมตั้งขนาด 4 * 1.8 cm  
 
  
 
  
 
     จากนั้นสร้าง Formula Fields เพื่อที่จะใส่เครื่องหมาย * ลงไปในส่วนหัวและท้ายของตัวอักษร เช่น *12345678908* 
 
  
 
     โดยผมจะกำหนดชื่อของ Formula Fields เป็น star 
 
  
 
     จากนั้นดับเบิ้ลคลิ๊กที่ Datable ชื่อ num_sn ที่สร้างเอาไว้ 
 
  
 
     จากนั้นเพิ่ม * เข้าไปที่หัวกับท้าย ตามรูป  
 
  
 
     จากนั้นกด บันทึก (มุมบนซ้ายของหน้าต่างโปรแกรม) ก็จะได้ Formula Fields ชื่อ star 
 
  
 
     ลากมาลงใน Crystal Report เลือกแบบอักษรเป็น 3 of 9 Barcode 
 
  
     
     จากนั้นลาก Databel ชื่อ num_sn ลงมาเพื่อทำเป็นอักษรกำกับด้านล่างของบาร์โค๊ต 
 
  
 
     ลาก text ลงมาเพื่อทำเป็นป้ายฉลากด้านบนของบาร์โค๊ต 
 
  
 
     จัดรูปแบบให้พอดี สวยงามตามต้องการ  
   
     เมื่อจะใช้งาน ต้องก็อปปี้ CrystalReport1.rpt ไปไว้ในโฟล์เดอร์ของโปรแกรมที่จะรันด้วย ผมได้ทำไว้ 2 ตัว คือ CrystalReport1.rpt และ CrystalReport2.rpt  แบบไม่มีป้ายฉลากด้านบนบาร์โค๊ต  
 
  
 
     เสร็จเรียบร้อยพร้อมใช้งาน ผู้ใช้งานต้องปริ๊นต์ด้วยกระดาษสติ๊กเกอร์แบบปริ๊นต์ได้ ถ้าต้องการนำไปติดกับสินค้าต่าง ๆ  
จะให้คม สแกนง่าย ๆ ต้องเป็นปริ๊นต์เตอร์เลเซอร์จึงจะดี 
 
  
 
ซอร์ทโค๊ต นำไปดูเป็นแนวทางประยุกต์ใช้งานกันต่อไป (VB.net, .net3.5, Crystal Report For Visual Studio 2013) 
 
https://drive.google.com/file/d/0B0tm4MRb-kmFTVZWVEdRRkpVcTQ/view?usp=sharing 
 
Download!!!      
		          
                 
    
                             					
			
              			             
                           
                             |   | 
                               | 
                             	
		                        | 
                            
                           
                             | 
 | 
                               | 
                              
                             			
 | 
           
         
           
          
            
              
                  
                     | 
                   
                  
                    |   | 
                    By :  | 
                    
                      
                      pakyaudio	
                     | 
                   
                  
                    |   | 
                    Article :  | 
                    บทความเป็นการเขียนโดยสมาชิก หากมีปัญหาเรื่องลิขสิทธิ์ กรุณาแจ้งให้ทาง webmaster ทราบด้วยครับ  | 
                   
				  
                  
                    |   | 
                    Score Rating :  | 
                    
                                               | 
                   
                  
                    |   | 
                    Create Date :  | 
                    2017-06-10 | 
                   
				  
                  
                    |   | 
                    Download :  | 
                    
                       No files                     | 
                   
                | 
             
           
		
		
        
        
       | 
     
   
 
		  
         | 
		
          
		   
		  
              
      
     |