用水晶报表做条码打印

      不知道各位有没有直接在WORD或EXCEL里直接设置过条码,然后打印出来? 如果直接把内容设置为条码字体,打印出来后是扫描枪是无法读取的. 我们都知道要在内容前后加上"*"(这里和""只起引用,实际不用). 当然,这种只是39码的起始字符. 但在实际应用途中,39码往往不能够满足要求,需要打印成CODE128码,但这时候就不能简单的在打印内容前后加入"*"后设置为CODE128字体就可以了. 这需要通过算法添加不同的起始符. 下面结合我在实际的应用中,讲一下这两种方法(实际上是一种,这两个函数的写法均来自互联网),

1. 是直接在SQL里取出相应的内容就已经添加.

2. 如果数据是在画面生成,但不需经过数据库获取的话,就只能在报表里直接实现了.

把函数放到SQL里

ALTER FUNCTION [dbo].[StrToCode128B](  
 @Str NVARCHAR(200)='GetonJew')--128B码:ChrW(204)   
 RETURNS NVARCHAR(200)   
AS  --  by GetonJew
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 

在报表中的【自定义函数】新建一个函数保存为Code128,名字随便定义,在代码框中输入如下代码(Basic语法):

Function Code128  ( strIn As string ) As String  

Dim intLoop As Number 
Dim intPosition as Number 
Dim intTotalVal as Number 
Dim strOut as String 
Dim strSpChr as String 
Dim strEndChr as String 
Dim intEndNo as Number 
strOut = "" 
for 
intLoop = 0 to Len(strIn) - 1 
intPosition = intLoop + 1  
strSpChr = Mid(strIn, intPosition, 1)  
intTotalVal = intTotalVal + (Asc(strSpChr) - 32) * intPosition 
next 

intTotalVal = intTotalVal + 104 

intTotalVal = intTotalVal mod 103 

If intTotalVal >= 95 Then 

Select Case intTotalVal 
Case 95 
strEndChr = "Ã" 
Case 96 
strEndChr = "Ä" 
Case 97 
strEndChr = "Å" 
Case 98 
strEndChr = "Æ" 
Case 99 
strEndChr = "Ç" 
Case 100 
strEndChr = "È" 
Case 101 
strEndChr = "É" 
Case 102 
strEndChr = "Ê" 
End Select 
Else 
intTotalVal = intTotalVal + 32 
strEndChr = Chr(intTotalVal) 
End If 
Code128 = "Ì" + strIn + strEndChr + "Î"   

End Function 

下面是水晶报表设计,为显示添加起始符后的数据,这里的批号就特意不以条码字体显示(Barlabel是添加了起始结束符号的LabelId)

 下图是调出来的结果.

看到了吗? 每一个批号的结束符都是不一样的.

 下面是该SP的代码.

ALTER procedure [dbo].[RPT_PrintLabel]
    @ponum varchar(50),@pronum varchar(50),@lot varchar(10),@label varchar(50),@prtnum varchar(5)
as 
declare @sql varchar(5000)
select @sql = 'select top '+@prtnum+ 'ID, PONum,VenNum,VenName,ProNum,Lot,ProDesc,Qty,Unit,BoxNum,LabelId,BarQty=dbo.StrToCode128B(Qty),BarLabel=dbo.StrToCode128B(LabelId)
into #t
from TEMPRT
where PONum= ''' +@ponum+ ''' and ProNum= ''' +@pronum+''' and Lot= ''' +@lot+''' order by ID desc;select * from #t order by ID ASC ;drop table #t'
print @sql
exec(@sql)

 

转载于:https://www.cnblogs.com/Geton/p/3951584.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值