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