博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
用水晶报表做条码打印
阅读量:6687 次
发布时间:2019-06-25

本文共 2853 字,大约阅读时间需要 9 分钟。

      不知道各位有没有直接在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 GetonJewBEGIN   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 #tfrom TEMPRTwhere PONum= ''' +@ponum+ ''' and ProNum= ''' +@pronum+''' and Lot= ''' +@lot+''' order by ID desc;select * from #t order by ID ASC ;drop table #t'print @sqlexec(@sql)

 

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

你可能感兴趣的文章
多目标规划——fgoalattain
查看>>
常用SQL语句大全总结
查看>>
网上常用效果插件库
查看>>
GIT基本概念和用法总结【转】
查看>>
抽象类与接口
查看>>
[转]log4net 使用指南
查看>>
ios-NSRunLoop以及定时器NSTimer-理解
查看>>
centos常用命令
查看>>
Linux内存带宽的一些测试笔记【转】
查看>>
linux下c语言实现多线程文件复制【转】
查看>>
算法(Algorithms)第4版 练习 1.3.27 1.3.28
查看>>
C++各种类型的简单排序大汇总~
查看>>
私有云根本就称不上是云,云计算的本质是服务,如果不能够将计算资源规模化、大范围地进行共享,就根本算不上是云计算,传统IT巨头所谓的“私有云”就换汤不换药的升级版IT解决方案。...
查看>>
python 4.27
查看>>
swfupload 例子
查看>>
Eclipse搭建Python开发环境+Python中文处理
查看>>
java对象的序列化
查看>>
SRCNN(一)
查看>>
C# 对象转换为byte[] ,byte[]还原对象
查看>>
List、Set、Map常见集合遍历总结
查看>>