打算接下来的时间里把自己觉得用起来还比较好用的通用模块,在这里向大家介绍一下,如果你有更好的想法时,也希望你不吝指点。
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
上面这是生成流水号的存储过程,注明一下这个存储过程的实现原理是我在网上看到的,我用多线程测试过它是不会生成重复的号。
这个存储过程之前写的是要传两个参数的,除了现在的RuleID这个参数外,还有NowDatePart这个参数,之所以先前要用两个参数,是因为我觉得这样就显得很灵活了,以后使用时就不需要再修改存储过程了(主要是针对取日期部分的修改);而之所以后来把NowDatePart参数去掉,是因为调用这存储过程有点麻烦,加之日期部分一般情况下就那么几种,所以觉得没必要因为未来可能根本就不会碰到的情况,而使现在使用起来更麻烦,简单地说就是不要过度设计。
2、系统界面
下面是该系统模块的主、子界面及单据编号记录的截图。
个人觉得实现系统功能不是最让人费脑的,最让人费脑的是怎么去设计实现功能的界面。所以在这里就不讲具体代码了,再说这功能实现也就是一些普通的增删改查,没有什么值得一提的。
接下来我就先说一下开篇说的为什么要设计成两个数据表的原因吧。从上图中我们可以看到“单据编号记录”这个界面的截图,通过这里我们可以清楚地看到每个月的单据有多少条。这是我从一个ERP系统(具体名字不记得了)借鉴过来的,虽然这不是一个必要的功能,但我自己觉得有这么一个功能就显得更加完整了。
3、结束语
其实在网上有很多的权限管理系统,但我还是觉得自己写的好,这好并不是说我用的技术比别人好,而是仅仅是在功能上自己觉得更灵活、功能更完整;当然,这些功能的构想我也只是站在别人的基础上按自己的想法来优化,更甚至只是集“万”家之所长而已。
现在把它们分享在这里,一来是把别人的玫瑰传递给更多的人,二来也是希望有更好想法的人能提一些意见,好让自己把它完善得更好。