首页 > 代码库 > 实时打印与条码动态生成

实时打印与条码动态生成

    如今条码已经在各行各业被普遍的使用,下面介绍我在制造行业动态生成条码的方法。

    对于一个条码来说,一般包含如下几个部分内容:日期、流水号、特殊字符。

技术分享

    要生成一个条码,首先要给这些内容设置一个组合规则,可以是日期+特殊字符+流水,也可能是其他的。我们将规则使用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)<>falsebegin    insert into AkBarcodeCompInfo(Barcode,OrderNumber,PrintDate,LineCode)    values(@result,@OrderNumber,GETDATE(),@LineCode)endcommit tran--提交事务select @result

 

实时打印与条码动态生成