码迷,mamicode.com
首页 > 其他好文 > 详细

实时打印与条码动态生成

时间:2014-12-26 18:36:23      阅读:378      评论:0      收藏:0      [点我收藏+]

标签:

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

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

技术分享

    要生成一个条码,首先要给这些内容设置一个组合规则,可以是日期+特殊字符+流水,也可能是其他的。我们将规则使用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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!