【PB】條碼列印探討

來源:互聯網
上載者:User

在資訊系統開發時通常有使用者要求能夠列印條碼,筆者現在就power builder 工具開發的系統初略的介紹一下條碼的實現方式及其優缺點。本文主要討論code39和code128的實現方法。
       code39總共可表示的字元範圍:0~9,A~Z以及 +、-、*、/、%、$、.等特殊字元,在加上空格符‘ ’,共計44組編碼,條碼沒有長度限制。但code39碼能表示的字元的範圍挺小的,而且表示出來的條碼也比較長。然而,這種條碼這pb中實現起來很簡單。

       Code128相對較為複雜,支援的字元也相對較多,又有不同的編碼方式可供互動運用。它具有A、B、C三種不同的編碼類別型,可表示的範圍也很廣,具體特性大家可以到網上尋找相關資料。它能表示高密度資料,條碼不會太長。

一、使用條碼字型實現code39、code128
       需要在本機上安裝code39或code128字型,需要注意的是由於CODE128碼字串包含不可正常顯示的字元,你必須使用支援Unicode碼的PB版本,如PB10以上。
       對於code39來說,通常用“*”號作為起始、終止符,校正碼不用。如‘6921168509256’的值為:*6921168509256* 。在資料視窗中可以加一列計算資料行,表示為:'*'+yourcode+'*' ,然後在將計算資料行的字型選為:3 of 9 Barcode ,設定一下大小就可以了。需要注意的是code39條碼一般都會很長,最好不要用它來表示太長的條碼。在pb9和pb10中測試沒有問題,用雷射印表機打出來的條碼可以在普通的條碼掃描槍上正確識別。
       對於code128來說實現起來沒那麼容易,Code128編碼規則:開始位 + [FNC1(為EAN128碼時加)] + 資料位元 + 檢驗位 + 結束位。所以這要求我們先要計算出編碼結果,然後用128字型表示出來。筆者在網上找了一個實現code128B版本的轉換函式,使用它可以將字串輕鬆轉換。當然,如果大家有時間可以到網上好好查查code128的編碼規則,然後自己寫個函數。
附CODE128碼在PB中的實現原始碼。
/*******************************************************************/
//CODE128條碼基礎知識
//CODE128有三個版本
//CODE128A: 標準數字和字母, 控制符, 特殊字元
//CODE128B: 標準數字和字母, 小寫字母, 特殊字元
//CODE128C: [00]-[99]的數字對集合, 共100個
//本函數採用CODE128B版本
//條碼由開始位、資料位元、校正位、停止位組成
//計算過程:
//1.取各字元ASC碼乘以字元序號之和(以ASC=32為分界點,大於32減32,小於32加64)
//2.計算校正碼
//3.組合條碼:開始位+資料位元+校正位+停止位
int li_asc_total = 104
int li_asc_tmp,i
char lc_start=char(204)//採用CODE128B版本
char lc_stop=char(206)
int li_check_digit
string ls_check_digit

//1.取各字元ASC碼乘以字元序號之和(以ASC=32為分界點,大於32減32,小於32加64)
For i = 1 To len(as_sourcetext)
        li_asc_tmp = Asc(mid(as_sourcetext,i, 1))
        If li_asc_tmp >= 32 Then
                li_asc_total = li_asc_total + (li_asc_tmp - 32) * i
        Else
                li_asc_total = li_asc_total + (li_asc_tmp + 64) * i
        End If
Next
//2.計算校正碼
li_check_digit = mod(li_asc_total,103)
If li_check_digit >= 95 Then//特殊字元
       li_check_digit = li_check_digit + 100
Else
        li_check_digit = li_check_digit + 32
end if
ls_check_digit = char(li_check_digit)
//3.組合條碼:開始位+資料位元+校正位+停止位
Return lc_start + as_sourcetext + ls_check_digit  + lc_stop

       先感謝一下函數的作者辛苦勞動。將轉換後的字串以128字型的方式顯示即可。最後測試沒問題,雷射印表機打出來的條碼可以在普通的條碼掃描槍上正確識別。
二、使用MSBCODE9.OCX實現
       這是微軟提供的條碼控制項,可以表示多種條碼字型,具體資料大家可以查閱MSBCODE9.CHM,可以到office安裝目錄下尋找。
  msbcode9.ocx是微軟公司OFFICE內建的一個條碼控制項。不需要條碼字型直接就可以列印一些條碼,比如CODE128、CODE39等。而且對於開發環境沒有太多的限制,至少pb9、pb10都測試通過。
  1、首先你要註冊一下msbcode9.ocx控制項。regsvr32 msbcode9.ocx
  2、使用ole在PB中把註冊的控制項增加到視窗中或資料視窗中。
  3、雙擊控制項就會看到一些屬性,包括選擇條碼字型。
  4、不過也可以在程式中用代碼來控制。
    dw_1.o b j e c t.ole_1.o b j e c t.style = 7 //7代表CODE128 6代表CODE39

    dw_1.o b j e c t.ole_1.o b j e c t.value = '條碼值'

       然後就可以列印了,最後測試沒問題,雷射印表機打出來的條碼可以在普通的條碼掃描槍上正確識別,而且掃描效果很好,比用字型實現的要好。但存在另一個問題,如果想要列印一批單據,每個單據都帶條碼的話,用條碼字型比較好實現,用控制項的話不好實現。可以先把ole對象存在資料庫中,最後檢索出來,但日後資料庫檢索的速度會很慢,這是因為儲存ole對象的緣故。
三、其他
       還有一些使用圖片產生條碼的,其實質也是先通過字串編碼轉換為條碼編碼,然後以圖片的形式進行顯示,感覺倒不如使用控制項更直接。對於直接向印表機發送控制命令來實現條碼的方式,筆者沒有進行測試,希望有興趣的可以試試。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.