sqk流水号
  1. CREATE TABLE [dbo].[RUL_Sequence] (

  2. [SeqCode] varchar(60) NOT NULL ,  //编号规则代码

  3. [Descr] varchar(60) NULL ,  //描述

  4. [NowSeqValue] bigint NULL ,  //序号当前值

  5. [EditTime] datetime NULL ,  //取值日期

  6. [Length] int NULL ,  //序号长度,需和格式中的<XXX>位数配合

  7. [DataFormat] varchar(50) NULL ,  //规划格式,如<YY><MM><DD><XXX><ZZ>

  8. [DateMax] varchar(10) NULL , //日期最大值

  9. [Status] varchar(1) NULL , //是否可编辑(0-系统代码,不可编辑,1-可编辑)

  10. [InitValue] varchar(10) NULL , //归零值

  11. [ResetType] varchar(50) NULL , //归零方式(1不归零 2按日归零 3 按月归零 4按年归零)

  12. [IsRunning] char(1) NULL   //正在运行标记,控制并发(1-正在运行,2-没在运行)

  13. )

复制代码

示例示例中有一个orderno的流水号,如果再增加一个customeno记录,即可支持另一个流水号规则。存储过程:

  1. ALTER PROCEDURE [dbo].[Proc_GetSeqence]

  2. @SeqCode varchar(60),        -- 规则代码

  3. @NewValue varchar(60)=''

  4. AS

  5. /* Exec Proc_GetSeqence 'OrderNo','',''

  6. *****************************************************************

  7. 功能描述:        获取数据表的主键流水号(INV, ASN, SO...)

  8. 主要思路:        1.取得最新流水号信息

  9. 2.把所有固定的规则信息替换成具体值,其他保持不变

  10. eg:

  11. 规则为:        ASN<YYYY><YY><MM><XXX>ASN

  12. 当前日期为:        20170630

  13. 当前流水号为:12

  14. 最终流水号为:ASN201306013ASN

  15. ******************************************************************

  16. */

  17. /*

  18. * SET NOCOUNT ON 的作用:

  19. * 不返回受影响行数

  20. * 存储过程中包含的一些语句并不返回许多实际的数据,则该设置由于大量减少了网络流量,因此可显著提高性能。

  21. * */

  22. SET NOCOUNT ON

  23. DECLARE @SeqNowNumStr VARCHAR(20)        --当前值字符类型        

  24. DECLARE @SeqNowNum BIGINT        --当前值        

  25. DECLARE @year CHAR(4)        --年 YYYY

  26. DECLARE @month CHAR(2)        --月 MM

  27. DECLARE @day CHAR(2)        --日 DD

  28. DECLARE @Length INT        --流水号长度

  29. DECLARE @DataFormat VARCHAR(50)        --流水号规则

  30. DECLARE @IniValue INT        --归零值

  31. DECLARE @ResetType VARCHAR(10)        --归零方式

  32. DECLARE @LastDate        CHAR(8)        --日期最大值        

  33. DECLARE @WorkFLowStr VARCHAR(20) --前一次调用流水号时的日期值

  34. DECLARE @DataNow CHAR(8)        --当前日期

  35. DECLARE @i INT        --转换变量,作用参照代码上下文

  36. DECLARE @ReturnNum Varchar(40)

  37. DECLARE @MessageCode varchar(800)

  38. /*

  39. * SET XACT_ABORT ON 的作用:

  40. * 存储中的某个地方出了问题,整个事务中的语句都会回滚

  41. * */

  42. SET XACT_ABORT ON

  43. BEGIN TRY

  44. /* 初始化变量 */

  45. SET @MessageCode='999'

  46. SET @ReturnNum = '0'

  47. SET @Length=0

  48. SET @SeqNowNum =0;

  49. SET @DataNow=CONVERT(CHAR(8),GETDATE(),112) --得到 20130704 的时间格式

  50. SET @year=SUBSTRING(@DataNow,1,4)

  51. SET @month =SUBSTRING(@DataNow,5,2)

  52. SET @day =SUBSTRING(@DataNow,7,2)

  53. Set @i=1 

  54. /***********如果有并发的正在运行,最多等待0.06秒,然后继续运行 Start*******/ 

  55. BEGIN TRANSACTION 

  56. wait:

  57. Update dbo.RUL_Sequence Set [IsRunning]='2' where SeqCode=@SeqCode and IsRunning='1'

  58. If @@Rowcount=0        

  59. Begin

  60. Waitfor Delay '00:00:01'

  61. Set @i=@i+1

  62. If @i<6 goto wait

  63. End

  64. COMMIT TRANSACTION 

  65. /***********如果有并发的正在运行,最多等待0.06秒,然后继续运行 End*******/ 

  66. Select @Length = [Length],@SeqNowNum=NowSeqValue,@LastDate=DateMax,@DataFormat=DataFormat

  67. ,@ResetType=ResetType,@IniValue =InitValue

  68. From RUL_Sequence where SeqCode=@SeqCode

  69. if @SeqNowNum=0 --当前值正常情况下不可能是0

  70. begin

  71. Update dbo.RUL_Sequence Set [IsRunning]='1' where SeqCode=@SeqCode --新增处理并发问题,恢复时间***

  72. set @ReturnNum='-1'

  73. Set @MessageCode='100' --当前值 错误代码

  74. SELECT @ReturnNum as NumRetrun,@MessageCode as MessageCode

  75. return;

  76. END

  77. --@ResetType=1 不归零 2 按日归零 3 按月归零 4按年归零

  78. If (@ResetType=2 and @DataNow<>@LastDate AND @IniValue>0)

  79. OR (@ResetType=3 and @year+@month<>SUBSTRING(@LastDate,1,6) AND @IniValue>0)

  80. OR (@ResetType=4 and @year<>SUBSTRING(@LastDate,1,4) AND @IniValue>0 )

  81. BEGIN

  82. SET @SeqNowNum=@IniValue

  83. END 

  84. SET @i=@Length --@i 此时表示流水号的总长度

  85. /***********拼流水号格式 Start*******/ 

  86. SET @WorkFLowStr='<'

  87. WHILE @Length>0 

  88. BEGIN

  89. SET @WorkFLowStr=@WorkFLowStr+'X'

  90. SET @Length=@Length-1

  91. END 

  92. SET @WorkFLowStr=@WorkFLowStr+'>' 

  93. /***********拼流水号格式 End*******/

  94. set @SeqNowNumStr=CONVERT(VARCHAR(20),@SeqNowNum)

  95. SET @Length=@i-len(@SeqNowNumStr) --@Length 要补零的位数(eg:@SeqNowNumStr=148 当前流水号是五位,最后流水号为00148,00 就是需要补的两位)

  96. /***********补零操作 Start*******/ 

  97. WHILE @Length>0 

  98. BEGIN

  99. SET @SeqNowNumStr='0'+@SeqNowNumStr

  100. SET @Length=@Length-1

  101. END

  102. /***********补零操作 End*******/ 

  103. SET @ReturnNum=REPLACE( @DataFormat,'<YYYY>',@year);        -- 把规则中<YYYY>替换成相应年

  104. SET @ReturnNum=REPLACE( @DataFormat,'<YY>',right(CONVERT(VARCHAR(4),@year),2));        -- 把规则中<YY>替换成相应年

  105. SET @ReturnNum=REPLACE( @ReturnNum,'<MM>',@month);        -- 把规则中<MM>替换成相应月

  106. SET @ReturnNum=REPLACE( @ReturnNum,'<DD>',@day);        -- 把规则中<DD>替换成相应日

  107. SET @ReturnNum=REPLACE( @ReturnNum,'<ZZ>',@NewValue);        -- 把规则中<ZZ>替换成相应变量值

  108. SET @ReturnNum=REPLACE( @ReturnNum,@WorkFLowStr,@SeqNowNumStr);-- 把规则中的形如<XXX>的替换成相应流水号,

  109. /***********更新当前流水值为最大流水号、上一个流水号生成时间和运行标记(运行标记置为"1"(没有运行) ) Start*******/

  110. Begin transaction

  111. UPDATE RUL_Sequence SET NowSeqValue=@SeqNowNum+1,DateMax=@DataNow,ISRUNNING='1', EditTime=Getdate()

  112. WHERE IsRunning='2' AND SeqCode=@SeqCode

  113. --SELECT * FROM RUL_Sequence WHERE IsRunning='2' AND SeqCode=@SeqCode

  114. -- PRINT @SeqNowNum+1

  115. Commit transaction 

  116. /***********更新当前流水值为最大流水号、上一个流水号生成时间和运行标记(运行标记置为"1"(没有运行) ) End*******/

  117. select @ReturnNum as NumRetrun, @MessageCode as MessageCode;        

  118. END TRY

  119. --错误捕获

  120. BEGIN CATCH 

  121. ROLLBACK TRANSACTION 

  122. Set @ReturnNum='-2' 

  123. set @MessageCode='行号='+cast(ERROR_LINE() as varchar(10))+'错误信息'+ERROR_MESSAGE() 

  124. +'['+ERROR_PROCEDURE()+']'

  125. IF @@ROWcount<=0 

  126. set @MessageCode='无此编号规则'+@MessageCode

  127. SELECT @ReturnNum as NumRetrun,@MessageCode as MessageCode

  128. END CATCH

复制代码

fine调用 方式:

  1. SQL("runserver","Exec Proc_GetSeqence 'OrderNo',''",1,1)

复制代码

结果如下:170810001说明:<YYYY> 四位年<YY>      两位年<MM>     月份<DD>     日<XXXX> 序号<ZZ>      固定的字符,可由存储过程第二个参数传入,用途:比如人员代码,在流水号基础上,用这个识别人员。调用如:SQL("runserver","Exec Proc_GetSeqence 'OrderNo','ok',1,1),结果就像是170810001ok这几个组合顺序可以任意。上述代码也是引用网上其它人的成果,我只是做了简单的修改,肯定是可以运行,大家如果有什么好办法也欢迎大家提供。虽然这个功能可以使用,但离我之用使用的“勤哲”在功能还还是差距比较大的,如废号的自动回收等。这里,希望fine能重视这些和设计相关的基础功能的集成工作,虽然fine具有很强大的功能,但一些基础类工具,还是能提供解决办法。也有利于你们系统的推广。

________

上面的流水号方案在sqlserver中怎么实现?

FineReport chengli 发布于 2021-8-17 10:22
1min目标场景问卷 立即参与
回答问题
悬赏:3 F币 + 添加悬赏
提示:增加悬赏、完善问题、追问等操作,可使您的问题被置顶,并向所有关注者发送通知
共1回答
最佳回答
0
Z4u3z1Lv6专家互助
发布于2021-8-17 10:25

代码都有了 直接在image.png里面运行一次呗

  • chengli chengli(提问者) 消息 208,级别 16,状态 6,过程 Proc_GetSeqence,第 1 行 对象名 \'dbo.Proc_GetSeqence\' 无效。 为什么会出现这种提示
    2021-08-17 11:01 
  • Z4u3z1 Z4u3z1 回复 chengli(提问者) 因为你数据库中目前没得 [dbo].[Proc_GetSeqence]这个存储过程所以不能用ALTER PROCEDURE [dbo].[Proc_GetSeqence] 要用create PROCEDURE [dbo].[Proc_GetSeqence]
    2021-08-17 11:05 
  • 1关注人数
  • 270浏览人数
  • 最后回答于:2021-8-17 10:25
    请选择关闭问题的原因
    确定 取消
    返回顶部