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

หรือติดต่อเข้ามาทาง 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
 5 1 0 9 6 1 7

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

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

การพิมพ์บาร์โค้ดด้วย Active Report 2.0 ออกกระดาษ A4

Category »  VB 6/VB.Net
โดย : Webmaster เมื่อ 25/1/2552   เวลา: 16:55
(อ่าน : 28016) 
ความดีก็เหมือนกางเกงใน คือ มีติดตัวไว้แต่ไม่เอาออกมาโชว์ เหอๆๆๆๆ ... หากคิดเปรียบเทียบแบบนี้กันหมด มีหวังประเทศชาติเราก็คงจะเจริญน่าดู น่าชมกันเลยล่ะครับ ... พี่น้อง บทความชิ้นนี้ไม่มีใครเปิดเผยมาก่อน ทั้งในประเทศไทยเอง รวมทั้งต่างประเทศด้วย แม้แต่ผู้ผลิต DataDynamics เอง ก็ยังไม่มีตัวอย่างไว้ให้ดูเลยครับ เรื่องการพิมพ์รหัสบาร์โค้ดเนี่ย จะว่าไปแล้วมีหลายคนให้ความสนใจกันอย่างมากมายเลยทีเดียว ไม่ว่าเป็นน้องๆที่นำไปทำโปรเจค หรือ กลุ่มคนทำงานที่ต้องการจัดเก็บข้อมูลวัสดุ ครุภัณฑ์ และ อื่นๆ ... ณ บัด Now ก็เลยได้ฤกษ์เปิดตัวบทความเกี่ยวกับบาร์โค้ดซ่ะเลย การนำบาร์โค้ดมาใช้งาน แท้ที่จริงก็เพื่อ ลดระยะเวลาในการป้อนข้อมูล และ รวมไปถึงมันมีความถูกต้องแม่นยำมากกว่าการใช้แรงงานคนคีย์ข้อมูลเข้าไป (Human Error) ... รายละเอียดต่างๆก็ลองไปหาอ่านกันเอาเองน่ะครับ ... เพราะผมจะสาธยายเกี่ยวกับการโค้ดโปรแกรม เพื่อให้นำไปใช้งานกันได้อย่างจริงๆจังๆซ่ะมากกว่า
บทความที่เกี่ยวข้อง
Visual Basic 6.0 กับการทำรายงานด้วย Active Report ตอนที่ 1
Visual Basic 6.0 กับการทำรายงานด้วย Active Report ตอนที่ 2
การแทรกปุ่มคำสั่ง ToolBar ใน ARViewer ของ Active Report 2.0
ดาวน์โหลด และ แนะนำวิธีการติดตั้ง Active Report Professional 2.0
ดาวน์โหลด
ดาวน์โหลด Source Code สำหรับ MS Visual Basic 6.0 - Service Pack 6
 ดาวน์โหลด Visual Basic 6.0 SP5: Run-Time Redistribution Pack
 ดาวน์โหลด Microsoft Data Access Object (MDAC) และ Jet 4.0 Update
 ดาวน์โหลด Microsoft Visual Basic Service Pack 6
    สาธยายเล็กน้อยเกี่ยวกับรหัสบาร์โค้ด
  1. Code39 มีตัวอักขระที่สามารถเข้ารหัสได้คือ 1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ-. *$/+% (รวมช่องว่าง หรือ space ด้วยน่ะครับ)
  2. Code128A มีตัวอักขระที่สามารถเข้ารหัสได้คือ ตัวเลข ตัวอักษร และสัญลักษณ์ (ยกเว้นตัวอักษรภาษาอังกฤษตัวเล็ก ซึ่งรหัส ASCII ถูกนำไปใช้อย่างอื่นแทน)
  3. Code128B มีตัวอักขระที่สามารถเข้ารหัสได้คือ ตัวเลข ตัวอักษร และสัญลักษณ์ รวมตัวอักษรภาษาอังกฤษตัวเล็กด้วยครับ
  • ปกติบาร์โค้ดมักจะใช้งาน ตัวเลข ตัวอักษรตัวใหญ่ และ ขีดกลาง เท่านั้นเอง
    เริ่มต้นกระบวนการทำงาน

    Project --> References ...


    Project --> Components ...


    Design Time


    Run Time


    ส่วนของ Detail ใน Active Report
    เลือก Shape แล้วคลิ๊กเมาส์ขวา ให้ไปอยู้ด้านหลัง (Send to back)

      คุณสมบัติ Barcode - CaptionPosition
    1. 0 - ddbcCaptionNone ' ไม่พิมพ์ป้ายรหัสบาร์โค้ด
    2. 1 - ddbcCaptionAbove ' พิมพ์ป้ายรหัสบาร์โค้ดด้านบนของแท่งบาร์โค้ด   
    3. 2 - ddbcCaptionBelow ' พิมพ์ป้ายรหัสบาร์โค้ดด้านล่างของแท่งบาร์โค้ด  
      คุณสมบัติ Barcode - Style คือกำหนดชนิดของบาร์โค้ด เช่น Code39, Code 128A, B หรือ C
      คุณสมบัติของ Shape - Shape
    1. 0 - ddSHRectangle ' สี่เหลี่ยม   
    2. 1 - ddSHEllipse ' วงรี
    3. 2 - ddSHRoundRectangle ' สี่เหลี่ยม โค้งตรงมุม  

    ความกว้างของกรอบ (Shape) ที่ครอบรหัสบาร์โค้ด
    วัดจากความกว้างของกระดาษ A4 (21 ซม.) หารด้วย 5 (ColumnCount = 5)


    ในกรณีที่นำไปพิมพ์บัตรสมาชิก บัตรนักศึกษา ฯลฯ ลงกระดาษ A4
    ก็ให้แบ่งออกเป็น 2 หลัก (ColumnCount = 2) นั่นปะไรล่ะครับ ก็จะได้ประมาณ 10 ซม. ต่อ 1 บัตร

    มาดูโค้ดกันเถอะ ...
    
    Option Explicit
    
    Dim rptPrint As Object
    
    ' ส่วนของฟอร์ม
    ' ===================================================================
    Private Sub Form_Load()
    On Error GoTo ErrHandler
        Me.Move (Screen.Width - Me.Width) \ 2, (Screen.Height - Me.Height) \ 2
        Me.KeyPreview = True    ' ต้องไปใช้กับเหตุการณ์ Form_KeyDown
        
        ' เคลียร์ค่า
        txtBarCode.Text = ""
        txtQuantity.Text = ""
        
        ' กำหนดให้เมนูการพิมพ์รูปแบบบาร์โค้ดเป็นแบบ Code128B ไว้ก่อน
        mnuCodeFormat(1).Checked = True
        ' BarcodeFormat เป็นตัวแปรแบบ Global ที่ผมเอาไปไว้ที่ gBarCode Module
        ' เพื่อต้องการให้ทุกๆฟอร์ม รวมทั้ง Actyive Report - arBarcode มองเห็นด้วย
        BarcodeFormat = "Code 128B"
        
    ExitProc:
        Exit Sub
    
    ErrHandler:
        MsgBox Err.Number & " : " & Err.Description
        Resume ExitProc
    End Sub
    
    Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
       Select Case KeyCode
          Case vbKeyF7: cmdPreview_Click
          Case vbKeyF10:    cmdExit_Click
       End Select
    End Sub
    ' ===================================================================
    
    ' ส่วนของการป้อนข้อมูลรหัสบาร์โค้ด (รับค่า 0 - 9 และตัวอักษรอังกฤษตัวใหญ่เท่านั้น)
    Private Sub txtBarCode_KeyPress(KeyAscii As Integer)
        If KeyAscii = 13 Then
            KeyAscii = 0
            SendKeys "{TAB}"
        Else
            ' สามารถกดตัวอักขระ 0 - 9, A - Z และ a - z ก็ได้... ไปดูใน gBarCode.Bas ครับผม
            ' แต่ KeyAscii ต้องรับค่ากลับมาเป็น Integer เสมอน่ะครับ ... พี่น้อง
            KeyAscii = Asc(UCase(Chr(CheckAlphaNumericUCase(KeyAscii))))
    	' กรณีของตัวอักษรตัวเล็ก a - z ที่ผมนำมาใช้งานด้วย
    	' หากต้องการใช้ตัวอักษรตัวเล็ก Code 128B จะรับได้เท่านั้น ส่วน Code 39/128A จะไม่ได้
    	' แต่ผมมีวิธีการแก้ปัญหา โดยกดคีย์ตัวเล็กแล้วให้แปลงเป็นตัวใหญ่แทนไงล่ะครับ
    	
        ' กฏเกณฑ์ธรรมชาติ ... ไล่จากขวามาซ้ายน่ะครับ
        ' จากเหตุการณ์ txtBarCode_KeyPress
        ' สมมุติกด a มา นั่นคือจะทำให้ (Ascii Code ของ a คือ 97)
        ' CheckAlphaNumericUCase(97))
    
        ' เปลี่ยน Ascii Code ให้กลายเป็นตัวอักขระด้วยฟังค์ชั่น Chr (Character)
        ' Chr(CheckAlphaNumericUCase(97)) = a
    
        ' แปลงเป็นตัวษรตัวใหญ่ ... ด้วยฟังค์ชั่น UCase (Upper Case)
        ' UCase(Chr(CheckAlphaNumericUCase(97))) = A
    
        ' แปลงตัวอักขระให้เป็น Ascii Code ด้วยฟังค์ชั่น Asc
        ' Asc(UCase(Chr(CheckAlphaNumericUCase(97)))) = 65
        ' เพราะว่า KeyAscii เป็นตัวแปรชนิดเลขจำนวนเต็ม (Integer)
        ' หรือ KeyAscii = 65 ... หรือ ตัวอัษร A ... มะแหล่มมั้ยครับพี่น้อง
    End If
    End Sub
    
    ' ===================================================================
    ' อยู่ใน gBarCode.bas น่ะครับ ผมตัดมาให้เห็นถึงการทำงาน
    Function CheckAlphaNumericUCase(Index As Integer) As Integer
        Select Case Index
            ' 0 - 9 (ASCII 48 - 57), A - B (ASCII 65 - 90), a - z (ASCII 97 - 122)
            Case 48 To 57, 65 To 90, 97 To 122
                CheckAlphaNumericUCase = Index
                ' หรือ ไม่ต้องมี Statement ในการคืนค่าตามข้างบนก็ได้ เพราะสั่งทีเดียวตามด้านล่างสุด
                
            Case 8          ' Back Space
            Case 13        ' Enter
            Case Else
                Index = 0
        End Select
        
        ' Return - คืนค่ากลับ
        CheckAlphaNumericUCase = Index
    
    End Function
    ' ===================================================================
    
    ' ส่วนของการป้อนจำนวนบาร์โค้ด (รับตัวเลขเท่านั้น)
    Private Sub txtQuantity_KeyPress(KeyAscii As Integer)
        If KeyAscii = 13 Then
            KeyAscii = 0
            cmdPreview_Click
        Else
            ' อันนี้ให้รับเฉพาะค่าตัวเลข 0 - 9 เท่านั้น
            KeyAscii = CheckDigitOnly(KeyAscii)
        End If
    End Sub
    
    ' ส่วนของการสั่งพิมพ์รหัสบาร์โค้ด
    Private Sub cmdPreview_Click()
    
        If Trim(txtBarCode.Text) = "" Or Trim(txtBarCode.Text) = "0" Or Len(Trim(txtBarCode.Text)) = 0 Then
            MsgBox "กรุณาป้อนค่ารหัสบาร์โค้ดให้เรียบร้อยก่อนด้วย.", vbOKOnly + vbInformation, "รายงานสถานะ"
            txtBarCode.SetFocus
            Exit Sub
        ElseIf Trim(txtQuantity.Text) = "" Or Trim(txtQuantity.Text) = "0" Or Len(Trim(txtQuantity.Text)) = 0 Then
            MsgBox "กรุณาป้อนจำนวนรหัสบาร์โค้ดให้เรียบร้อยก่อนด้วย.", vbOKOnly + vbInformation, "รายงานสถานะ"
            txtQuantity.SetFocus
            Exit Sub
        End If
        '
        ' Set ARViewer
        Set rptPrint = New arBarcode    ' ชื่อ Active Report Designer
        Set Me.ARViewBarCode.object = rptPrint  ' ผูกเข้ากับ ARViewer
    End Sub
    
    มาดูโค้ดในส่วนของ Active Report
    
    Option Explicit
    ' ตัวแปรแบบ Public in Form ไว้นับจำนวนที่ต้องการ
    Dim Count As Integer
    ' ตัวแปรที่ใช้รับค่าในการกำหนดจำนวนบาร์โค้ดที่ต้องการ
    Dim CountCode As Integer
    
    ' กำหนดชนิดตัวแปรเป็นตัวอักขระ
    Dim BeginCode As String
    
    ' ===================================================================
    ' ส่วนของการเริ่มต้นการตั้งค่าต่างๆให้กับรายงานของ Active Report (อ่านครั้งเดียว)
    Private Sub ActiveReport_Initialize()
        PageSettings.Orientation = ddOPortrait ' พิมพ์ในแนวตั้ง
        PageSettings.PaperSize = 9 ' A4 Paper
        ' ========== กำหนดค่าคงที่ ==============
        ' หน่วย Twip น่ะครับ
        ' 1440 Twip = 1 นิ้ว หรือ 2.54 ซม. (โดยประมาณ)
        ' อยากให้ออกมาเป็นหน่วยวัดแบบไหน ก็ย้อนยุคกลับไปเทียบบัญญัติไตรยางค์เอาเอง 55555+
        PageSettings.LeftMargin = 300   ' ซ้าย
        PageSettings.RightMargin = 200  ' ขวา
        PageSettings.BottomMargin = 500 ' ล่าง
        PageSettings.TopMargin = 500    ' บน
        ' จัดระยะห่างของแต่ละ Column
        Detail.ColumnSpacing = 0
        
        ' จัดการพิมพ์แท่งบาร์โค้ดตำแหน่งกลาง
        Barcode1.Alignment = ddTXCenter
        ' จัดการพิมพ์รหัสบาร์โค้ดไว้ข้างล่างของแท่งบาร์โค้ด
        Barcode1.CaptionPosition = ddbcCaptionBelow
        ' จัดการพิมพ์รหัสบาร์โค้ดไว้ด้านบนของแท่งบาร์โค้ด
        ' Barcode1.CaptionPosition = ddbcCaptionAbove
        ' ไม่แสดงผลรหัสบาร์โค้ด
        ' Barcode1.CaptionPosition = ddbcCaptionNone
        
        ' ตรวจสอบก่อนว่าในเมนูเลือกการพิมพ์รูปแบบรหัสบาร์โค้ดเป็นแบบใด
        ' แบบ Code 128A
        If frmBarcodeSample.mnuCodeFormat(0).Checked Then
            Barcode1.Style = ddbcCode_128_A
            BarcodeFormat = "Code 128A"
        ' แบบ Code 128B
        ElseIf frmBarcodeSample.mnuCodeFormat(1).Checked Then
            Barcode1.Style = ddbcCode_128_B
            BarcodeFormat = "Code 128B"
        ' แบบ Code39
        ElseIf frmBarcodeSample.mnuCodeFormat(2).Checked Then
            Barcode1.Style = ddbcAnsi39
            BarcodeFormat = "Code 3 of 9"
        End If
        '
        ' รับค่าเริ่มต้นงานพิมพ์รหัสบาร์โค้ดมาไว้ก่อน ... (พวกเซียนแล้วไม่ต้องใช้ก็ได้ ... ขอบอก)
        BeginCode = frmBarcodeSample.txtBarCode
        
        ' ไว้เพื่อนับ และ เปรียบเทียบสิ้นสุดการพิมพ์ - การลูปนั่นเอง (กำหนดจำนวนบาร์โค้ดที่ต้องการ)
        CountCode = Val(frmBarcodeSample.txtQuantity)
        
        ' ก็แสดงผลให้ผู้ใช้งานรู้ว่าทำอะไรไปเท่านั้นเองแหละครับ
        frmBarcodeSample.fraBarcode.Caption = " รายการพิมพ์บาร์โค้ด " & BarcodeFormat & " จำนวน " & _
                Val(frmBarcodeSample.txtQuantity) & " รายการ."
    End Sub
    ' ===================================================================
    ' *** ส่วนสำคัญในการวนรอบการทำงาน จนกว่าจะหมดข้อมูล ***
    ' หลักการมีอยู่ว่า หากค่า EOF = False อยู่มันจะกลับมา Fetch Data หรือ รับข้อมูลใหม่อีก
    ' แต่เมื่อไรก็ตามทีที่ EOF = True มันจะหยุดการทำงาน และ ออกจาก Active Report ไปในทันใด
    ' ===================================================================
    Private Sub ActiveReport_FetchData(EOF As Boolean)
        
        ' เพิ่มค่าการนับขึ้นทีละ 1
        Count = Count + 1
        
        ' ตรวจสอบว่าจำนวนที่พิมพ์ออกไปนั้นมากกว่าที่กำหนดเอาไว้แล้วหรือไม่
        ' กรณีนี้พิมพ์ยังไม่ครบตามจำนวน ... ตัวอย่างเช่น
        ' ถ้า 1 > 10 ...แสดงว่า เงื่อนไขเป็นเท็จ ... จะข้ามไปที่ Else
        If Count > CountCode Then
            ' พิมพ์ครบแล้วจ้า ... ไสหัวออกไปได้แล้ว 55555+
            EOF = True
            
        ' เงื่อนไขเท็จ ... จะมาที่ Else
        Else
            ' หากพิมพ์ยังไม่ครบ ต้องกำหนดให้ EOF = False เอาไว้ เพื่อที่มันจะกลับมา Fetch Data ใหม่อีกครั้ง
            ' จากนั้นมันจะกระโดดไปพิมพ์รายงานที่ส่วนของ Detail_Format
            EOF = False
        End If
        
    End Sub
    ' ===================================================================
    ' ส่วนนี้จะเป็นลูปในการพิมพ์จนกว่าจะหมดข้อมูล - Detail_Format
    ' มันจะมาส่วนนี้ได้ก็เพราะเงื่อนไข False จาก ActiveReport_FetchData
    ' ===================================================================
    Private Sub Detail_Format()
        
        Barcode1.Caption = BeginCode
        
        ' กรณีที่ต้องการพิมพ์ให้เพิ่มอัตโนมัติขึ้นอีกครั้งละ 1 ก็กำหนดให้รหัสบาร์โค้ดบวกเพิ่มขึ้นไป
        ' อนึ่งต้องระวังด้วยในการพิมพ์รหัส หากคุณเอาตัวอักษรไปต่อท้ายน่ะครับ เช่น 123A ... แล้วมันจะบวกให้ยังไงล่ะ 55555+
        ' แต่ทั้งนี้ ทั้งนั้น และ ทั้งโน้นเลย ... ผมก็เลยแนะนำเอาไว้ให้ก่อน
        ' แต่อีนี่นาย ... BeginCode ผมประกาศตัวแปรเป็น String แล้วไหงมันบวกตัวเลขได้ด้วยซ่ะงั้นล่ะ เอิ๊กๆๆๆๆ
        ' BeginCode = BeginCode + 1
    

    การเพิ่มค่าตัวเลขรหัสบาร์โค้ดขึ้นทีละ 1
    End Sub
    Conclusion:
    Active Report 2.0 ไฟล์ก็เล็กๆ เบาสบาย แต่ขีดความสามารถในการทำงานจัดได้ว่าเต็มเปี่ยมจริงๆ ซึ่ง ActiveX ตัวนี้มันตอบสนองต่อการใช้งานให้ผมได้เป็นอย่างดีเลยทีเดียวครับ เพียงแต่ ... ประเทศเรายังขาดแคลนแหล่งข้อมูล (ที่ถูกต้อง) ให้ได้เรียนรู้ศึกษากัน เพราะมักจะมีความดีเหมือนกางเกงใน มีติดตัวไว้แต่ไม่ต้องโชว์ ...

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