Winform通用模块之流水号生成

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

1、数据库表及存储过程  

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

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

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

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

上面这是生成流水号的存储过程,注明一下这个存储过程的实现原理是我在网上看到的,我用多线程测试过它是不会生成重复的号。

  这个存储过程之前写的是要传两个参数的,除了现在的RuleID这个参数外,还有NowDatePart这个参数,之所以先前要用两个参数,是因为我觉得这样就显得很灵活了,以后使用时就不需要再修改存储过程了(主要是针对取日期部分的修改);而之所以后来把NowDatePart参数去掉,是因为调用这存储过程有点麻烦,加之日期部分一般情况下就那么几种,所以觉得没必要因为未来可能根本就不会碰到的情况,而使现在使用起来更麻烦,简单地说就是不要过度设计。

2、系统界面

下面是该系统模块的主、子界面及单据编号记录的截图。

 

  个人觉得实现系统功能不是最让人费脑的,最让人费脑的是怎么去设计实现功能的界面。所以在这里就不讲具体代码了,再说这功能实现也就是一些普通的增删改查,没有什么值得一提的。

  接下来我就先说一下开篇说的为什么要设计成两个数据表的原因吧。从上图中我们可以看到“单据编号记录”这个界面的截图,通过这里我们可以清楚地看到每个月的单据有多少条。这是我从一个ERP系统(具体名字不记得了)借鉴过来的,虽然这不是一个必要的功能,但我自己觉得有这么一个功能就显得更加完整了。

3、结束语

  其实在网上有很多的权限管理系统,但我还是觉得自己写的好,这好并不是说我用的技术比别人好,而是仅仅是在功能上自己觉得更灵活、功能更完整;当然,这些功能的构想我也只是站在别人的基础上按自己的想法来优化,更甚至只是集“万”家之所长而已。

  现在把它们分享在这里,一来是把别人的玫瑰传递给更多的人,二来也是希望有更好想法的人能提一些意见,好让自己把它完善得更好。

  

posted @ 2015-10-27 08:39  Eric-Lau  阅读(1440)  评论(0编辑  收藏  举报