Winform通用模块之流水号生成

摘要:
1.数据库表和存储过程在介绍通用序列号生成模块之前,让我们看看它的相关表结构:从上图中,我们可以看到该模块中使用了两个数据表。事实上,也可以使用一个表来实现此功能。我想很多人只使用一张桌子,但我为什么要把它分成两张桌子?请允许我先在这里买一把钥匙,接下来,我会向你解释我为什么要这样做。

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

1、数据库表及存储过程  

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

Winform通用模块之流水号生成第1张

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

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

Winform通用模块之流水号生成第2张Winform通用模块之流水号生成第3张
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、系统界面

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

Winform通用模块之流水号生成第4张

Winform通用模块之流水号生成第5张

Winform通用模块之流水号生成第6张

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

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

3、结束语

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

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

  

免责声明:文章转载自《Winform通用模块之流水号生成》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇tp5做的excel导入导出(用的PHPexcel类)IOS 学习:UITableView 使用详解1下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

MySQL 新建用户,为用户授权,指定用户访问数据库

1.登录MySQL mysql -u root -p 2.添加新用户(允许所有ip访问) create user 'test'@'%' identified by '123456'; #test:用户名,%:所有ip地址,123456:密码 3.创建数据库 CREATE DATABASE test_db DEFAULT CHARSET utf8mb4...

怎样能使winform窗体的大小固定住,不能调整其大小

窗体FormBorderStyle属性设置为:FixedSingle,再把最大化禁用就可以了 使用.Net编写Windows程序,对于窗体控制常见项目 属性:1、让窗体在启动时在指定位置出现 form1.StartPosition Manual CenterScreen WindowsDefaultLocation (default) Window...

mysql存储过程性能监控和分析

公司当前版本的系统大量的使用了存储过程,有些复杂的过程套过程,一个主调用者可能最多调用其它几十个小的业务逻辑和判断,不要说这么做很不合理,在大陆,目前至少30%的证券交易系统代码都是用存储过程写业务逻辑的,包括sql server/oracle/mysql,三个版本都有,所以BS把业务写在存储过程的同学们不要小看,很可能你每天都在用着用存储过程开发的世界上...

C# Winform 窗体美化

1 using System; 2 using System.ComponentModel; 3 using System.Diagnostics; 4 using System.Drawing; 5 using System.Drawing.Drawing2D; 6 using System.Runtime.InteropServ...

Winform布局开源框架,Winform控件框架,插件化框架

  什么是Winform框架?   Winform框架是基于.NET开发平台研发的用于快速开发软件项目的软件模板或开发平台,常用的程序语言有C#.NET, VB.NET。   通常Winform框架界面组件使用第三方控件,如:DevExpress,该控件功能强调,用户体验友好。 若全部采用.NET原生组件,开发效率低,界面不美观,用户体验差,特别是基于数...

存储过程的调用

一、SQL中调用存储过程语句:call procedure_name(); 注:调用时”()”是不可少的,无论是有参数还是无参数.              定义对数据库存储过程的调用时1、无参数存储过程:{call procedure_name}2、仅有输入参数的存储过程:{call procedure_name(?,?...)}。这里?表示输入参数,创...