zoukankan      html  css  js  c++  java
  • 利用SQL为Code128码添加起始符和休止符

    在利用code128码字体打印条码是,打印出来的条形码,扫描枪会出现认不出的情况,这种情况是由于直接将文本设置为code128字体而没有给他们指定起始符和休止符引起的。

    经过查资料获发现好多人遇到这样的问题,特别是利用word,excel直接设置code128字体打印时,一般都会曲线这种问题。

    发现网上有个牛人在excel下用VBA写了一个为文本添加起始符和休止符的函数。确实好用

    代码如下:

    Function code128b(Tar As Range)   '128B码:ChrW(204).
    Dim s$, i%, ss$, j%, curR%, checkB%
    curR = Tar.Row
    s = Tar.Value
    checkB = 1  '开始位的码值为104 mod 103 =1
    For i = 1 To Len(s)
        ss = Mid(s, i, 1)
        j = Asc(ss) '不过滤无效字符,比如汉字.
        If j < 135 Then
            j = j - 32
        ElseIf j > 134 Then
            j = j - 100
        End If
        checkB = (checkB + i * j) Mod 103   '计算校验位
    Next
    If checkB < 95 And checkB > 0 Then  '有的资料直接求103的模,解说不充分,因为有的校验位超过127时,系统会"吃"掉它们(连带休止符).
        checkB = checkB + 32
    ElseIf checkB > 94 Then '字体设置时,字模被定义了2个值.观察字体文件时能发现.
        checkB = checkB + 100
    End If
    code128b = ChrW(204) & s & IIf(checkB, ChrW(checkB), Chr(32)) & ChrW(206)
    End FUNCTION

    根据这段代码,突然想到是不是可以直接移植到Sql Server能,经过打印,扫描试验确实可以,代码如下:

    create FUNCTION StrToCode128B(
     @Str NVARCHAR(200))--128B码:ChrW(204)
     RETURNS NVARCHAR(200) 
    AS
    BEGIN
     DECLARE @checkB INT 
     DECLARE @i INT ,@j INT
     DECLARE @str2 NVARCHAR(2)
     SET @i=1
     
     SET @checkB = 1  --开始位的码值为104 mod 103 =1
                      --
     WHILE @i <= LEN(@Str) 
     BEGIN
      SET @str2 = SUBSTRING(@Str,@i,1)
      SET @j = ASCII(@str2) --不过滤无效字符,比如汉字
      IF @j<135 
      BEGIN
       SET @j=@j-32
      END
      ELSE IF @j>134 
      BEGIN
       SET @j=@j-100
      END
      SET @checkB = (@checkB + @i * @j) % 103   --计算校验位
      SET @i=@i+1
     END  
     
     IF @checkB<95 AND @checkB>0 --有的资料直接求103的模,解说不充分,因为有的校验位超过127时,系统会"吃"掉它们(连带休止符).
     BEGIN
      SET @checkB = @checkB + 32
     END
     ELSE IF @checkB > 94  -- '字体设置时,字模被定义了2个值.观察字体文件时能发现.
     BEGIN
      SET @checkB = @checkB + 100
     END
     
         RETURN NCHAR(204) + @Str + CASE WHEN @checkB>0 THEN NCHAR(@checkB) ELSE NCHAR(32) END + NCHAR(206)
     
    END

    以上在转化的过程中主要遇到如下问题:

    1.VBA中的ASC()函数对应SQL的函数是ASCII()

    2.VBA中的ChrW()函数对应的SQL函数是 NCHAR()。这点需要特别注意,因为ChrW和HCHAR都是unicode字符。而如果用CHAR的话就是不行,刚开始没注意,用CHAR函数,拼接后,返回的字符串始终为空(或不可见字符), 结果调试好久都不知道问题出在哪里。

  • 相关阅读:
    DELPHI中Showmodal与Show的区别
    怎样把一个文件夹里面所有文件的文件名提取出来,放到Excel表格里呢
    Python基础之函数
    Python_Openpyxl
    设计模式
    【转】深入理解递归函数的调用过程
    Java集合的Stack、Queue、Map的遍历
    数据结构-String、char
    leetcode-位运算
    Java web入门
  • 原文地址:https://www.cnblogs.com/ilookbo/p/4807112.html
Copyright © 2011-2022 走看看