打算接下来的时间里把自己觉得用起来还比较好用的通用模块,在这里向大家介绍一下,如果你有更好的想法时,也希望你不吝指点。

1、数据库表及存储过程  

  在介绍这个通用流水号生成的模块前,我们先来看一下其相关的表结构:

Winform通用模块之流水号生成

  从上图中我们可以看到,该模块用到的数据表有两个,其实用一个表也可以实现这个功能,我想很多人用到的也只是一个表,但我为什么要分为两个表,请容许我先在这儿买一个关子,接下来我再向你说明一下我要这么做的原因。

  至于表的各字段是做什么用的我就不一 一解释了,如果对其中某些字段的用意不明白的话,待会看一下下面的系统界面截图,我相信你也大概就明白了。

ALTER PROCEDURE [dbo].[SysBillNoRule_GetNewNo] 
@RuleID        NVARCHAR(50)   
AS
  BEGIN
 
  DECLARE @NowDatePart AS NVARCHAR(20)
  
BEGIN --取得日期部分
    SELECT @NowDatePart = DateFormatString
    FROM   SysBillNoRule
    WHERE  RuleID = @RuleID

    IF @NowDatePart = 'yyMM'
      SET @NowDatePart=LEFT(CONVERT(VARCHAR(6), Getdate(), 12), 4)
    ELSE IF @NowDatePart = 'yyyyMM'
      SET @NowDatePart=CONVERT(VARCHAR(6), Getdate(), 112)
    ELSE IF @NowDatePart = 'yyMMDD'
      SET @NowDatePart=RIGHT(CONVERT(VARCHAR(100), Getdate(), 112), 6)
    ELSE IF @NowDatePart = 'yyyyMMDD'
      SET @NowDatePart=CONVERT(VARCHAR(100), Getdate(), 112)
    ELSE IF @NowDatePart = 'yyyy'
      SET @NowDatePart=CONVERT(VARCHAR(4), Getdate(), 112)
    ELSE IF @NowDatePart = 'yy'
      SET @NowDatePart=RIGHT(CONVERT(VARCHAR(4), Getdate(), 112), 2)
    ELSE
      SET @NowDatePart=''
END

      DECLARE @maxNum AS INT

      BEGIN TRAN

      BEGIN try 
          --在同一个事务中,执行了update语句之后就会启动锁
          UPDATE SysBillNoRule SET RuleID = RuleID WHERE RuleID = @RuleID

          SELECT @maxNum = maxnum
          FROM   SysBillNoRuleRecord
          WHERE  RuleID = @RuleID AND [DateFormat] = @NowDatePart

          IF @maxNum IS NULL   
            BEGIN
                INSERT INTO SysBillNoRuleRecord
                            (RuleID,
                             [DateFormat],
                             MaxNum)
                VALUES     (@RuleID,
                            @NowDatePart,
                            1)
            END
          ELSE
            BEGIN
                UPDATE SysBillNoRuleRecord
                SET    MaxNum = MaxNum + 1
                WHERE  RuleID = @RuleID AND [DateFormat] = @NowDatePart
            END

          COMMIT TRAN
               
        SELECT LTRIM(Prefix)+@NowDatePart+RIGHT(REPLICATE('0', NoDigits)+LTRIM(ISNULL(@maxNum, 0) + 1),NoDigits)  
        FROM SysBillNoRule
        where RuleID= @RuleID
        
      END try

      BEGIN catch
          ROLLBACK TRAN
      END catch
  END
View Code

相关文章: