zoukankan      html  css  js  c++  java
  • 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、结束语

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

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

      

  • 相关阅读:
    Axure chrome 安装及已损坏的解决方法
    Ubuntu16.04上使用git
    ubuntu初探
    nginx入门笔记
    更改element-UI按钮默认样式
    js深拷贝与浅拷贝的区别及实现
    安装mysql-python的遇到的问题
    facebook atc弱网环境搭建和踩坑总结
    验证码识别 Tesseract的简单使用和总结
    selenium 基础(一)
  • 原文地址:https://www.cnblogs.com/Lau7/p/4911957.html
Copyright © 2011-2022 走看看