zoukankan      html  css  js  c++  java
  • 根据格式字符串自动生成单据号

     本代码为通过特定关键字的字符串自动生成单据号;解决编程中频繁编写代码自动生成单据号。

    • @SJ ---为格式字符串(以下是关键字含义)
      • "%Y"表示完整年 如:2012
      • "%y"表示简写年 如:12
      • "%M"表示两位月份 如:01
      • "%m"表示简写月份 如:1
      • "%D"表示天 如:08
      • "%d"表示简写天 如:8
      • "%W" 或者 "%w"表示周(全年52周) 如:05(全年第五周)
      • "%H"表示完整小时 如:08
      • "%h"表示简写小时 如:8
      • "%N"表示完整分钟 如:08
      • "%n"表示简写分钟 如:8
      • "%S"表示完整秒 如:08
      • "%s"表示简写秒 如:8
      • "%K"表示完整毫秒 如:008
      • "%04X"表示生成单据号的流水号
        • 04表示4为数字 如:流水号0005
        • % X 表示通配符
      • 其他非特定关键字可以任意组合
    • @TableName ---为单据号的数据库表
    • @ColName ----为数据表的单据号列
    • @Remove -----为剔除自动生成单据号的数组 如:格式为"1,2,3,4,5,"
    • @Mantissa ----为控制是否剔除包含还是匹配;"1"表示包含剔除的数据;"0"表示剔除完全匹配的单据号
    • @Where ---为自动生成单据号的查询条件
    • @ZD_date ---为单据号生成的单据日期
    • @SSN ----为生产的单据号

    例子:

    格式字符串:投诉单%Y%M%06XAAAsdsA

    自动生成的单据号:投诉单201206000001AAAsdsA

    View Code
    Create PROCEDURE [dbo].[ProcessAutoSN]
    (@SJ nvarchar(500),
    @TableName nvarchar(500),
    @ColName nvarchar(500),
    @Remove nvarchar(500),
    @Mantissa bit,
    @Where nvarchar(500),
    @ZD_date DATETIME ,
    @SSN nvarchar(500) OUTPUT)
    AS
    BEGIN 
    /*
    --自动生成单据号
    --@SJ 流水号格式字符串
    --@TableName 表名
    --@ColName 列名
    declare 
    @SJ nvarchar(500),
    @TableName nvarchar(500),
    @ColName nvarchar(500),
    @SSN nvarchar(500)
    set @TableName='Table1'
    set @ColName='id'--投诉单1009001
    set @SJ='投诉单%Y%M%04XAAAsdsA'
    */
    declare @SN nvarchar(500),
    @Year nvarchar(4),@MinYear nvarchar(2),
    @Month nvarchar(2),@Day nvarchar(2),@Hour nvarchar(2),@Minute nvarchar(2),@week nvarchar(2),
    @second nvarchar(2),@Msecond nvarchar(2),@Sp nvarchar(500),@int int,
    @SL nvarchar(500),@Zero nvarchar(500),@ZZZ nvarchar(500),@Xzero INT
    IF (@ZD_date IS NULL)
    SET @ZD_date=GETDATE()
    set @SN=@SJ
    set @Year=year(convert(nvarchar(10),@ZD_date,120))
    set @MinYear=right(year(convert(nvarchar(10),@ZD_date,120)),2)
    set @Month=month(convert(nvarchar(10),@ZD_date,120))
    set @Day=Day(convert(nvarchar(10),@ZD_date,120))
    SET @week=CEILING( DATEDIFF(d,CONVERT(NVARCHAR(4),YEAR(@ZD_date))+'-01-01',@ZD_date)/7.00)
    set @Hour=right('00'+convert(nvarchar(2),datepart(Hh,@ZD_date)),2)
    set @Minute=right('00'+convert(nvarchar(2),datepart(mi,@ZD_date)),2)
    set @second=right('00'+convert(nvarchar(2),datepart(ss,@ZD_date)),2)
    set @Msecond=right('00'+convert(nvarchar(4),datepart(ms,@ZD_date)),4)
    set @SN=replace(@SN COLLATE Chinese_PRC_CS_AS,'%Y',@Year)
    set @SN=replace(@SN COLLATE Chinese_PRC_CS_AS,'%y',@MinYear)
    set @SN=replace(@SN COLLATE Chinese_PRC_CS_AS,'%m' ,@Month)
    set @SN=replace(@SN COLLATE Chinese_PRC_CS_AS,'%M' ,right('00'+convert(nvarchar(2),@Month),2))
    set @SN=replace(@SN COLLATE Chinese_PRC_CS_AS,'%D',right('00'+convert(nvarchar(2),@Day),2))
    set @SN=replace(@SN ,'%d',@Day)
    
    
    set @SN=replace(@SN COLLATE Chinese_PRC_CS_AS,'%w',right('00'+convert(nvarchar(2),@week),2))
    set @SN=replace(@SN COLLATE Chinese_PRC_CS_AS,'%W',right('00'+convert(nvarchar(2),@week),2))
    
    set @SN=replace(@SN COLLATE Chinese_PRC_CS_AS,'%H',right('00'+convert(nvarchar(2),@Hour),2))
    set @SN=replace(@SN,'%h',@Hour)
    set @SN=replace(@SN COLLATE Chinese_PRC_CS_AS,'%N',right('00'+convert(nvarchar(2),@Minute),2))
    set @SN=replace(@SN,'%n',@Minute)
    set @SN=replace(@SN COLLATE Chinese_PRC_CS_AS,'%S',right('00'+convert(nvarchar(2),@second),2))
    set @SN=replace(@SN,'%s',@second)
    set @SN=replace(@SN,'%K',right('000'+convert(nvarchar(2),@Msecond),3))
    set @Zero=patindex('%[%]%X%',@SN)
    SET @Xzero=@Zero
    if (@Zero<=0)
    begin
    SET @SSN=@SN
    return
    end
    set @Sp=right(@SN,len(@SN)+1-charIndex('%',@SN))
    set @SL=left(@Sp,charindex('X',@Sp))
    set @ZZZ=@Sp
    if (charIndex('X',@Sp)<=0)
    begin
    SET @SSN=@SN
    return
    end
    set @Sp=left(@Sp,charIndex('X',@Sp)-1)
    set @Sp=replace(@Sp,'%','')
    if(isnumeric(@Sp)=0)
    begin
    SET @SSN=''
    return
    end
    IF Not EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].['+@TableName+']') AND type in (N'U'))
    BEGIN
    SET @SSN=@SN
    return 
    end
    else
    begin
     IF Not EXISTS (select [name] from syscolumns   where  
     [name]=@ColName   and   OBJECTPROPERTY(id,'IsUserTable')=1   and  
     object_name(id)=@TableName)
    begin
    SET @SSN=@SN
    return 
    end
    end
    declare @SQL nvarchar(4000),@Max nvarchar(500),@Start int,@End int 
    set @Zero=Replicate('0',@Sp)
    set @Start=charIndex('%',@SN)-1
    set @End=charIndex('X',@SN)
    SET @End=@End+@Sp-(@End-@Start)
    --SELECT @Xzero
    --set @SN=replace(@SN,@SL,@Zero)
    set @SQL='left(right('+@ColName+',len('+@ColName+')-'+convert(nvarchar(50),@Start)+'),'+convert(nvarchar(50),@Sp)+')'
    set @SQL='select @Max=max(case when isnumeric('+@SQL+')=1 then '+@SQL+'else '''+@Zero+''' end ) from '+@TableName+' where len('+@ColName+')=len(replace('''+@SN+''','''+@SL+''','''+@Zero+'''))'
    set @SQL=@SQL+' and left('+@ColName+','+convert(nvarchar(50),@Start)+')=left(replace('''+@SN+''','''+@SL+''','''+@Zero+'''),'+convert(nvarchar(50),@Start)+')'
    set @SQL=@SQL+' and left('+@ColName+','+convert(nvarchar(50),@Xzero-1)+')+right('+@ColName+',len('+@ColName+')-'+convert(nvarchar(50),@Xzero-1+LEN(@Zero))+')=replace('''+@SN+''','''+@SL+''','''+''+''')'
    
    --set @SQL=@SQL+' and right('+@ColName+',len('+@ColName+')-'+convert(nvarchar(50),@Xzero-1)+')=right(replace('''+@SN+''','''+@SL+''','''+@Zero+'''),len(replace('''+@SN+''','''+@SL+''','''+@Zero+'''))-'+convert(nvarchar(50),@End)+')'
    IF (@Where<>'' AND @Where IS NOT NULL)
    SET @sql=@sql+' and '+@Where
    
    --SELECT @sql
    
    EXEC sp_executesql @sql, N'@Max nvarchar(500) OUTPUT', @Max OUTPUT 
    if (@Max is null)
    set @Max=0
    set @Start=convert(int,@Max)+1
    if (@Remove is not null and ltrim(@Remove)<>'')
    begin 
    if (@Mantissa is not null and @Mantissa=0)
    begin
    while(dbo.CheckArrInStr(' '+convert(nvarchar(50),@Start),@Remove,',')=1)
    begin
    set @Start=@Start+1
    end
    end
    else
    begin
    while(dbo.CheckArrInStr(' '+right(convert(nvarchar(50),@Start),1),@Remove,',')=1)
    begin
    set @Start=@Start+1
    end
    end
    end
    
    set @SN=replace(@SN,left(@SL,charindex('X',@SL)),right(@Zero+convert(nvarchar(500),@Start),len(@Zero)))
    SET @SSN=@SN
    END

    检查完全匹配剔除数据

    View Code
    Create function [dbo].[CheckArrInStr](@s as varchar(500),@sArr as varchar(5000),@Split varchar(500)) 
    returns int
    as 
    begin
     declare @next int  
     declare @ret int
     set @ret=0
     set @next=1
     while @next<=dbo.Get_StrArrayLength(@sArr,@Split)
     begin
    if (ltrim(dbo.Get_StrArrayStrOfIndex(@sArr,@Split,@next))<>'')
    begin
       if (charindex(dbo.Get_StrArrayStrOfIndex(@sArr,@Split,@next),@s)>0)
      begin
      set @ret=1;
      break;
      end
    end
       set @next=@next+1
     end
    
     return @ret
    end

    检查包含剔除数据

    View Code
    Create function [dbo].[CheckStrInArr](@s as varchar(50),@sArr as varchar(5000),@Split varchar(500)) returns int
    as 
    begin
     declare @next int  
     declare @ret int
     set @ret=0
     set @next=1
     while @next<=dbo.Get_StrArrayLength(@sArr,@Split)
     begin
       if dbo.Get_StrArrayStrOfIndex(@sArr,@Split,@next)=@s 
      begin
      set @ret=1;
      break;
      end
       set @next=@next+1
     end
     return @ret
    end

    字符串分割长度

    View Code
    Create function [dbo].[Get_StrArrayLength]
    (
      @str varchar(5000),  --要分割的字符串
      @split varchar(10)  --分隔符号
    )
    returns int
    as
    begin
      declare @location int
      declare @start int
      declare @length int
    
      set @str=ltrim(rtrim(@str))
      set @location=charindex(@split,@str)
      set @length=1
      while @location<>0
      begin
        set @start=@location+1
        set @location=charindex(@split,@str,@start)
        set @length=@length+1
      end
      return @length
    end

    取分割数组数据

    View Code
    Create function [dbo].[Get_StrArrayStrOfIndex]
    (
      @str varchar(5000),  --要分割的字符串
      @split varchar(10),  --分隔符号
      @index int --取第几个元素
    )
    returns varchar(5000)
    as
    begin
      declare @location int
      declare @start int
      declare @next int
      declare @seed int
    
      set @str=ltrim(rtrim(@str))
      set @start=1
      set @next=1
      set @seed=len(@split)
      
      set @location=charindex(@split,@str)
      while @location<>0 and @index>@next
      begin
        set @start=@location+@seed
        set @location=charindex(@split,@str,@start)
        set @next=@next+1
      end
      if @location =0 select @location =len(@str)+1 
      
      return substring(@str,@start,@location-@start)
    end
  • 相关阅读:
    Dynamics CRM 给视图配置安全角色
    统计分析中的假设检验
    OLAP工作的基本概念(结合个人工作)
    Dynamics CRM 导入用户数据错误 could not retrieve salesperson role
    HTTP状态码汇总
    HTTP状态码汇总
    PHP超级全局变量——Session 变量
    PHP超级全局变量——Session 变量
    RESTful架构详解
    RESTful架构详解
  • 原文地址:https://www.cnblogs.com/DesignIvan/p/No.html
Copyright © 2011-2022 走看看