您的位置:首页 > 编程语言

写了一个能自定义并自动按照规则生成单据号码的程序及相关存储过程和表,及示范,附全部源代码!

2009-12-02 11:23 651 查看
/*----------------------------------------------------------------
Copyright (C) 2009 上海藏拙科技有限公司
版权所有。
All rights reserved.
文件名:T0023.sql
文件功能描述:单据号码管理表

创建标识:黄智 2009-09-21

修改标识:
修改描述:
----------------------------------------------------------------*/

USE cangzhuowebos
GO

IF OBJECT_ID('T0023', 'U') IS NOT NULL
DROP TABLE T0023
GO

CREATE TABLE T0023
(
F0001 varchar(50) not null primary key, --序号
F0002 varchar(100) not null, --单据名称
F0003 varchar(200) null, --单号
F0004 varchar(200) , --单号组成
F0005 varchar(1000), --备注
F0006 varchar(100), --录入人
F0007 datetime not null default GETDATE(), --录入日期
F0008 varchar(100), --备用字段1
F0009 varchar(100), --备用字段2
F0010 varchar(100), --备用字段3
F0011 varchar(100), --备用字段1
F0012 varchar(100), --备用字段2
F0013 varchar(100) --备用字段3
)
GO

--建立单据号码管理表名称唯一非聚集索引
IF EXISTS(SELECT 1 FROM sysindexes WHERE name='T0023_F0002_INDEX')
DROP INDEX T0023_F0002_INDEX ON T0023
GO
CREATE UNIQUE INDEX T0023_F0002_INDEX ON T0023(F0002);

--Get Documents's NO calc by F0004
--F0004 组成 $D 返回日期 $N N(1~9)表示返回 几位数的流水号
IF OBJECT_ID('GetDocumentsNo_T0023_Proc', 'P') IS NOT NULL
DROP procedure GetDocumentsNo_T0023_Proc
GO
create procedure GetDocumentsNo_T0023_Proc
--生成单据号码之后是否更新单号表中的单号,以作为最后的单号,
--为生成下一个单号做准备,考虑到并发问题,
--所以获取单号并不一定更新单号表,只有当提交发生的时候建议 @isupdate = 1 以确认更新
@isupdate int = 0, --是否更新
@F0002 varchar(100), --单据名称
@F0003U varchar(100), --(单据号)只有@isupdate=1 的时候才用,用来进行更新单号表中的最新单据号
@F0003 varchar(200) output --生成的单据号
as
begin
if(@isupdate=0)
begin
declare @$d varchar(10)

declare @$9 varchar(9) = '000000001'
declare @$8 varchar(8) = '00000001'
declare @$7 varchar(7) = '0000001'
declare @$6 varchar(6) = '000001'
declare @$5 varchar(5) = '00001'
declare @$4 varchar(4) = '0001'
declare @$3 varchar(3) = '001'
declare @$2 varchar(2) = '01'
declare @$1 varchar(1) = '1'

declare @r$d varchar(10)
declare @r$9 varchar(9)
declare @r$8 varchar(8)
declare @r$7 varchar(7)
declare @r$6 varchar(6)
declare @r$5 varchar(5)
declare @r$4 varchar(4)
declare @r$3 varchar(3)
declare @r$2 varchar(2)
declare @r$1 varchar(1)

declare @p$db int = 0
declare @p$9b int = 0
declare @p$8b int = 0
declare @p$7b int = 0
declare @p$6b int = 0
declare @p$5b int = 0
declare @p$4b int = 0
declare @p$3b int = 0
declare @p$2b int = 0
declare @p$1b int = 0

declare @p$de int = 0
declare @p$9e int = 0
declare @p$8e int = 0
declare @p$7e int = 0
declare @p$6e int = 0
declare @p$5e int = 0
declare @p$4e int = 0
declare @p$3e int = 0
declare @p$2e int = 0
declare @p$1e int = 0

declare @F3 varchar(200)
declare @F4 varchar(200)
set @$d = CONVERT (date, SYSDATETIME())
select @F3 = F0003, @F4 = F0004 from T0023 where F0002=@F0002

declare @np int = 0
declare @i int = 0
while @i<LEN(@F4)
begin
if(SUBSTRING(@f4, @i, 1)='$')
begin
if(SUBSTRING(@f4, @i+1, 1)='D')
begin
set @p$db = @np
set @p$de = @np + 9
set @np = @np + 10
end
else if(SUBSTRING(@f4, @i+1, 1)='9')
begin
set @p$9b = @np + @i
set @p$9e = @np + @i + 8
set @np = @np + 9
end
else if(SUBSTRING(@f4, @i+1, 1)='8')
begin
set @p$8b = @np
set @p$8e = @np + 7
set @np = @np + 8
end
else if(SUBSTRING(@f4, @i+1, 1)='7')
begin
set @p$7b = @np
set @p$7e = @np + 6
set @np = @np + 7
end
else if(SUBSTRING(@f4, @i+1, 1)='6')
begin
set @p$6b = @np
set @p$6e = @np + 5
set @np = @np + 6
end
else if(SUBSTRING(@f4, @i+1, 1)='5')
begin
set @p$5b = @np
set @p$5e = @np + 4
set @np = @np + 5
end
else if(SUBSTRING(@f4, @i+1, 1)='4')
begin
set @p$4b = @np
set @p$4e = @np + 3
set @np = @np + 4
end
else if(SUBSTRING(@f4, @i+1, 1)='3')
begin
set @p$3b = @np
set @p$3e = @np + 2
set @np = @np + 3
end
else if(SUBSTRING(@f4, @i+1, 1)='2')
begin
set @p$2b = @np
set @p$2e = @np + 1
set @np = @np + 2
end
else if(SUBSTRING(@f4, @i+1, 1)='1')
begin
set @p$1b = @np
set @p$1e = @np + 0
set @np = @np + 1
end
set @i = @i + 1;
end
else
begin
set @np = @np + 1
end
set @i = @i + 1;
end

if (@F3='' or @F3 is NULL)
begin
set @F0003 = REPLACE(@F4, '$D', @$d)
set @F0003 = REPLACE(@F0003, '$9', @$9)
set @F0003 = REPLACE(@F0003, '$8', @$8)
set @F0003 = REPLACE(@F0003, '$7', @$7)
set @F0003 = REPLACE(@F0003, '$6', @$6)
set @F0003 = REPLACE(@F0003, '$5', @$5)
set @F0003 = REPLACE(@F0003, '$4', @$4)
set @F0003 = REPLACE(@F0003, '$3', @$3)
set @F0003 = REPLACE(@F0003, '$2', @$2)
set @F0003 = REPLACE(@F0003, '$1', @$1)
--update T0023 set F0003 = @F0003 where F0002=@F0002
end
else
begin
set @r$d = SUBSTRING(@F3, @p$db, @p$de - @p$db+1)
if(@r$d=@$d)
begin
set @r$9 = SUBSTRING(@F3, @p$9b, @p$9e - @p$9b+1)
set @r$8 = SUBSTRING(@F3, @p$8b, @p$8e - @p$8b+1)
set @r$7 = SUBSTRING(@F3, @p$7b, @p$7e - @p$7b+1)
set @r$6 = SUBSTRING(@F3, @p$6b, @p$6e - @p$6b+1)
set @r$5 = SUBSTRING(@F3, @p$5b, @p$5e - @p$5b+1)
set @r$4 = SUBSTRING(@F3, @p$4b, @p$4e - @p$4b+1)
set @r$3 = SUBSTRING(@F3, @p$3b, @p$3e - @p$3b+1)
set @r$2 = SUBSTRING(@F3, @p$2b, @p$2e - @p$2b+1)
set @r$1 = SUBSTRING(@F3, @p$1b, @p$1e - @p$1b+1)

set @$9 = CONVERT(varchar(9), CONVERT(int, @r$9)+1)
set @$9 = REPLACE(SPACE(9-len(@$9))+@$9,' ', '0')

set @$8 = CONVERT(varchar(8), CONVERT(int, @r$8)+1)
set @$8 = REPLACE(SPACE(8-len(@$8))+@$8,' ', '0')

set @$7 = CONVERT(varchar(7), CONVERT(int, @r$7)+1)
set @$7 = REPLACE(SPACE(7-len(@$7))+@$7,' ', '0')

set @$6 = CONVERT(varchar(6), CONVERT(int, @r$6)+1)
set @$6 = REPLACE(SPACE(6-len(@$6))+@$6,' ', '0')

set @$5 = CONVERT(varchar(5), CONVERT(int, @r$5)+1)
set @$5 = REPLACE(SPACE(5-len(@$5))+@$5,' ', '0')

set @$4 = CONVERT(varchar(4), CONVERT(int, @r$4)+1)
set @$4 = REPLACE(SPACE(4-len(@$4))+@$4,' ', '0')

set @$3 = CONVERT(varchar(3), CONVERT(int, @r$3)+1)
set @$3 = REPLACE(SPACE(3-len(@$3))+@$3,' ', '0')

set @$2 = CONVERT(varchar(2), CONVERT(int, @r$2)+1)
set @$2 = REPLACE(SPACE(2-len(@$2))+@$2,' ', '0')

set @$1 = CONVERT(varchar(1), CONVERT(int, @r$1)+1)
set @$1 = REPLACE(SPACE(1-len(@$1))+@$1,' ', '0')

set @F0003 = REPLACE(@F4, '$D', @$d)
set @F0003 = REPLACE(@F0003, '$9', @$9)
set @F0003 = REPLACE(@F0003, '$8', @$8)
set @F0003 = REPLACE(@F0003, '$7', @$7)
set @F0003 = REPLACE(@F0003, '$6', @$6)
set @F0003 = REPLACE(@F0003, '$5', @$5)
set @F0003 = REPLACE(@F0003, '$4', @$4)
set @F0003 = REPLACE(@F0003, '$3', @$3)
set @F0003 = REPLACE(@F0003, '$2', @$2)
set @F0003 = REPLACE(@F0003, '$1', @$1)
--update T0023 set F0003 = @F0003 where F0002=@F0002
end
else
begin
set @F0003 = REPLACE(@F4, '$D', @$d)
set @F0003 = REPLACE(@F0003, '$9', @$9)
set @F0003 = REPLACE(@F0003, '$8', @$8)
set @F0003 = REPLACE(@F0003, '$7', @$7)
set @F0003 = REPLACE(@F0003, '$6', @$6)
set @F0003 = REPLACE(@F0003, '$5', @$5)
set @F0003 = REPLACE(@F0003, '$4', @$4)
set @F0003 = REPLACE(@F0003, '$3', @$3)
set @F0003 = REPLACE(@F0003, '$2', @$2)
set @F0003 = REPLACE(@F0003, '$1', @$1)
--update T0023 set F0003 = @F0003 where F0002=@F0002
end
end
end
else
begin
declare @T0023UpdateTran varchar(20) = 'T0023UpdateTran'
begin transaction @T0023UpdateTran
begin try
update T0023 set F0003 = @F0003U where F0002=@F0002
commit transaction @T0023UpdateTran
set @F0003 = 'T0023UpdateSuccess'
end try
begin catch
rollback transaction @T0023UpdateTran
set @F0003 = 'T0023UpdateFailure'
end catch

end
end

/*
--插入一个单据名称为 dd 单号生成规则是 ABC$D$3 的记录,意思就是生成的单号=ABC+日期+三位流水号
--当然日期更换后流水好会从 1开始
insert into T0023(F0001,F0002,F0004) values ('497706f5770147c3b64d947d4cc0bbb5', 'buy', 'buy$D$4')

--具体调用方式 获取单据 dd 的下一个号码
declare @F0002 varchar(100) = 'buy'
declare @F0003 varchar(200)
--取一个单据号码
exec GetDocumentsNo_T0023_Proc 0, 'buy', '', @F0003 output
--更新一个单据号码
--exec GetDocumentsNo_T0023_Proc 1, 'buy', 'buy2009-09-220004', @F0003 output
--输出单据 dd 的下一个号码
select @F0003

--生成的第一个号码如下: ABC2009-09-21001
我的口号:没有我不会的,只有你不知道的
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐