首页 > 代码库 > BarCode128B字符转换函数(PB,SQL)

BarCode128B字符转换函数(PB,SQL)

PB

 1 //CODE128条码基础知识
 2 //CODE128有三个版本
 3 //CODE128A: 标准数字和字母, 控制符, 特殊字符
 4 //CODE128B: 标准数字和字母, 小写字母, 特殊字符
 5 //CODE128C: [00]-[99]的数字对集合, 共100个
 6 //本函数采用CODE128B版本
 7 //条码由开始位、数据位、校验位、停止位组成
 8 //计算过程:
 9 //1.取各字符ASC码乘以字符序号之和(以ASC=32为分界点,大于32减32,小于32加64)
10 //2.计算校验码
11 //3.组合条码:开始位+数据位+校验位+停止位
12 int li_asc_total = 104
13 int li_asc_tmp,i
14 char lc_start=char(204)//采用CODE128B版本
15 char lc_stop=char(206)
16 int li_check_digit
17 string ls_check_digit
18 
19 //1.取各字符ASC码乘以字符序号之和(以ASC=32为分界点,大于32减32,小于32加64)
20 For i = 1 To len(as_sourcetext)
21 li_asc_tmp = Asc(mid(as_sourcetext,i, 1))
22 If li_asc_tmp >= 32 Then
23 li_asc_total = li_asc_total + (li_asc_tmp - 32) * i
24 Else
25 li_asc_total = li_asc_total + (li_asc_tmp + 64) * i
26 End If
27 Next
28 //2.计算校验码
29 li_check_digit = mod(li_asc_total,103)
30 If li_check_digit >= 95 Then//特殊字符
31 li_check_digit = li_check_digit + 100
32 Else
33 li_check_digit = li_check_digit + 32
34 end if
35 ls_check_digit = char(li_check_digit)
36 //3.组合条码:开始位+数据位+校验位+停止位
37 Return lc_start + as_sourcetext + ls_check_digit + lc_stop

SQL

 1 create FUNCTION [dbo].[UDF_GetStr2Code128](
 2  @Str NVARCHAR(200))--128B码:ChrW(204)
 3  RETURNS NVARCHAR(200) 
 4 AS
 5 BEGIN
 6  DECLARE @checkB INT 
 7  DECLARE @i INT ,@j INT
 8  DECLARE @str2 NVARCHAR(2)
 9  SET @i=1
10  
11  SET @checkB = 1  --开始位的码值为104 mod 103 =1
12                   --
13  WHILE @i <= LEN(@Str) 
14  BEGIN
15   SET @str2 = SUBSTRING(@Str,@i,1)
16   SET @j = ASCII(SUBSTRING(@Str,@i,1))--ASCII(@str2) --不过滤无效字符,比如汉字
17   IF @j<135 
18   BEGIN
19    SET @j=@j-32
20   END
21   ELSE IF @j >=135 
22   BEGIN
23    SET @j=@j-100
24   END
25   SET @checkB = @checkB +  @i * @j
26   SET @i=@i+1
27  END  
28  
29  
30  SET @checkB = @checkB % 103   --计算校验位
31  IF @checkB<95 AND @checkB>0 --有的资料直接求103的模,解说不充分,因为有的校验位超过127时,系统会"吃"掉它们(连带休止符).
32  BEGIN
33   SET @checkB = @checkB + 32
34  END
35  ELSE IF @checkB > 94  -- ‘字体设置时,字模被定义了2个值.观察字体文件时能发现.
36  BEGIN
37   SET @checkB = @checkB + 100
38  END
39  
40      RETURN NCHAR(204) + @Str + CASE WHEN @checkB>0 THEN NCHAR(@checkB) ELSE NCHAR(32) END + NCHAR(206)
41     
42 END