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