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