当前位置:Gxlcms > 数据库问题 > 利用SQL为Code128码添加起始符和休止符

利用SQL为Code128码添加起始符和休止符

时间:2021-07-01 10:21:17 帮助过:3人阅读

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函数,拼接后,返回的字符串始终为空(或不可见字符), 结果调试好久都不知道问题出在哪里。

利用SQL为Code128码添加起始符和休止符

标签:

人气教程排行