首页 > 代码库 > 实时打印与条码动态生成
实时打印与条码动态生成
如今条码已经在各行各业被普遍的使用,下面介绍我在制造行业动态生成条码的方法。
对于一个条码来说,一般包含如下几个部分内容:日期、流水号、特殊字符。
要生成一个条码,首先要给这些内容设置一个组合规则,可以是日期+特殊字符+流水,也可能是其他的。我们将规则使用Custom字段保存在数据库中。为了方便取值,规则名称统一设置成4个字符,下面是规则设置界面。
下面是Custom保存的数据内容:
工厂代码SK&班次代码&玻璃种类0&电池类型P&电池厂家&电池效率&生产日期SUBSTRING(CONVERT(varchar(100),DATEADD(HH,-8,GETDATE()),120),3,2)+SUBSTRING(‘ABCDEFGHIJKLMNOPQRSTUVWXYZ‘,MONTH(DATEADD(HH,-8,GETDATE())),1)+SUBSTRING(CONVERT(varchar(100),DATEADD(HH,-8,GETDATE()),120),9,2)&序列号码4
然后,就是要在一个查询里面,解析这组规则动态生成条码。比较关键的点在于,条码的重复性处理方式。一旦判断生成的条码是存在的,就要将工单流水号+1,使用goto语句重新生成。
sql代码如下:
--生成实时条码ALTER PROCEDURE [dbo].[proc_GetRealtimeBarCode]( @OrderNumber nvarchar(50),--工单号 @LineCode nvarchar(50),--班次代码 @SupplierCode nvarchar(50),--厂家代码 @Eff decimal(18,2)--电池片效率)ASdeclare @result nvarchar(500)--返回值declare @Battery nvarchar(50)--电池片类型declare @BarcodeType nvarchar(1)--流水号更新方式declare @BarCodeSerial int--最新打印流水号declare @Custome nvarchar(max)--打印自定义---开启事务begin transelect @Battery=Battery,@BarcodeType=BarcodeType,@BarCodeSerial=BarCodeSerial,@Custome=Customefrom AkWorkOrderPrint where OrderNumber=@OrderNumber--如果没有定义规则,不能生成条码if @Custome is null or @Custome=‘‘begin set @result=‘false:请先设置实时打印规则‘endelsebegin --定义规则列表 declare @SplitTable table ( Id int, Value nvarchar(max) ) --获取规则 insert into @SplitTable select Id,Value from SplitString(@Custome,‘&‘, 0) --循环表变量 declare @customCount int select @customCount=COUNT(*) from @SplitTable declare @Id int --其他变量 declare @date nvarchar(max)--时间格式 declare @PrintDate datetime--最后打印时间 --标签 lable: set @Id=1 set @result=‘‘ --构造结果 while @Id<=@customCount begin --当前自定义项 declare @Value nvarchar(max) select @Value=Value from @SplitTable where Id=@Id --定义项的名称和值 declare @itemTitle nvarchar(max) set @itemTitle=left(@Value,4)--自定义项的名称的长度必须为4,这个在前台设置的时候就要规范好,不能随便添加 declare @itemValue nvarchar(max) set @itemValue=right(@Value,LEN(@Value)-4)--自定义项的值 --生成规则 if @itemTitle=‘班次代码‘ begin if @LineCode is null or @LineCode=‘‘ begin set @result=‘false:无法获取班次代码‘ break; end else begin set @result=@result+@LineCode end end else if @itemTitle=‘电池厂家‘ begin if @SupplierCode is null or @SupplierCode=‘‘ begin set @result=‘false:无法获取电池厂家代码‘ break; end else begin set @result=@result+@SupplierCode end end else if @itemTitle=‘电池效率‘ begin if @Eff is null or @Eff<=0 begin set @result=‘false:无法获取电池效率‘ break; end else begin if @Battery=‘单晶‘ begin set @result=@result+substring(‘ABCDEFGHIJKLMNOPQRSTUVWXYZ‘,(((@Eff*100)-1800)/20)+1,1) end else begin set @result=@result+substring(‘ABCDEFGHIJKLMNOPQRSTUVWXYZ‘,(((@Eff*100)-1500)/20)+1,1) end end end else if @itemTitle=‘生产日期‘ begin set @itemValue=‘select @a=‘+@itemValue exec sp_executesql @itemValue,N‘@a nvarchar(max) output‘,@date output set @result=@result+@date end else if @itemTitle=‘序列号码‘ begin set @result=@result+right(cast(power(10,CAST(@itemValue as int)) as varchar)+@BarCodeSerial,CAST(@itemValue as int)) end else begin set @result=@result+@itemValue end --变量+1 set @Id=@Id+1 end --条码已经存在的情况 while left(@result,5)<>‘false‘ and exists(select * from AkBarcodeCompInfo where Barcode=@result) begin --变更流水号 if @BarcodeType=‘是‘ begin --用当前时间和最后一次打码时间对比 2013-12-31 08:00-->2013-12-31 07:55 select @PrintDate=BarcodeDate from AkWorkOrderPrint where OrderNumber=@OrderNumber if CONVERT(varchar(100),dateadd(HH,-8,getdate()),111)<>CONVERT(varchar(100),dateadd(HH,-8,@PrintDate),111) begin --不相同时清零,不相同表示本次打印为新的一天 update AkWorkOrderPrint set BarCodeSerial=0 where OrderNumber=@OrderNumber end end --流水号+1 update AkWorkOrderPrint set BarCodeSerial=BarCodeSerial+1,BarcodeDate=GETDATE() where OrderNumber=@OrderNumber --更新变量 select @BarCodeSerial=BarCodeSerial from AkWorkOrderPrint where OrderNumber=@OrderNumber --重新生成条码 Goto lable endend--保存条码if left(@result,5)<>‘false‘begin insert into AkBarcodeCompInfo(Barcode,OrderNumber,PrintDate,LineCode) values(@result,@OrderNumber,GETDATE(),@LineCode)endcommit tran--提交事务select @result
实时打印与条码动态生成
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。