标签:
如今条码已经在各行各业被普遍的使用,下面介绍我在制造行业动态生成条码的方法。
对于一个条码来说,一般包含如下几个部分内容:日期、流水号、特殊字符。
要生成一个条码,首先要给这些内容设置一个组合规则,可以是日期+特殊字符+流水,也可能是其他的。我们将规则使用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)--电池片效率 ) AS declare @result nvarchar(500)--返回值 declare @Battery nvarchar(50)--电池片类型 declare @BarcodeType nvarchar(1)--流水号更新方式 declare @BarCodeSerial int--最新打印流水号 declare @Custome nvarchar(max)--打印自定义 ---开启事务 begin tran select @Battery=Battery,@BarcodeType=BarcodeType,@BarCodeSerial=BarCodeSerial,@Custome=Custome from AkWorkOrderPrint where OrderNumber=@OrderNumber --如果没有定义规则,不能生成条码 if @Custome is null or @Custome=‘‘ begin set @result=‘false:请先设置实时打印规则‘ end else begin --定义规则列表 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 end end --保存条码 if left(@result,5)<>‘false‘ begin insert into AkBarcodeCompInfo(Barcode,OrderNumber,PrintDate,LineCode) values(@result,@OrderNumber,GETDATE(),@LineCode) end commit tran--提交事务 select @result
标签:
原文地址:http://www.cnblogs.com/zhongxinWang/p/4187168.html