大侠:单据号?

jwdream2008 2010-01-27 03:58:07
问题描述:
单据号生成规则:yyyymmdd(年月日)+ 000001(六位流水号,并且自增),
单据号要求:1.每天从000001开始 2. 单据号要连续啊。
客户端体现:
用户每次打开画面要显示按照上面自动生成的单据号。
疑难点:
多用户操作时画面生成的单据号可能重复啊,这样插入数据库单据号就重复了!
求解决方法??
...全文
379 25 打赏 收藏 转发到动态 举报
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhangjing1979666 2010-03-16
  • 打赏
  • 举报
回复
路过,学习了,正遇到此类问题
fcuandy 2010-01-27
  • 打赏
  • 举报
回复
建一个类似的表

tb_identity

tbid int, maxid int

为每个要算号的表分配一个id, maxid存放每个表中自定义编号数字部分最大值

就算你的库中有上千个需要自动算号的表,那这么个表中也只有几千条记录(而事实上一个系统中这样自动算号的表并不多一般几十个),每次算号时先update, 因为只update一条记录, 所以锁等待时间是很短的,也排除了断号问题。
ACMAIN_CHM 2010-01-27
  • 打赏
  • 举报
回复
建议这个表的主键仍用identity 自动生成。

然后再触发器,或者查询中根据  单据日期,显示这个序列号。
这样实现起业比较容易,也容易解决冲突!
jwdream2008 2010-01-27
  • 打赏
  • 举报
回复
[Quote=引用 21 楼 beirut 的回复:]
引用 20 楼 jwdream2008 的回复:
谢谢,各位回复,继续顶!

老虎光顶不行,还得加分。加满200分
[/Quote]
谢谢提醒啊!呵呵,貌似帖子要沉啊!
黄_瓜 2010-01-27
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 jwdream2008 的回复:]
谢谢,各位回复,继续顶!
[/Quote]
老虎光顶不行,还得加分。加满200分
jwdream2008 2010-01-27
  • 打赏
  • 举报
回复
谢谢,各位回复,继续顶!
黄_瓜 2010-01-27
  • 打赏
  • 举报
回复
可以保证货号不会重复,但是不能保证用户操作时画面生成的单据号
就是最终的货运单号
黄_瓜 2010-01-27
  • 打赏
  • 举报
回复
--种子表 num_tb 
if object_id('num_tb') is not null
drop table num_tb
go
create table num_tb(d datetime,id int)
insert num_tb select getdate(),1
if object_id('tb') is not null
drop table tb
go
create table tb(id varchar(20),name varchar(10))

create clustered index idx_clu_tb on tb(id)
go

create trigger tri_tb on tb
INSTEAD OF INSERT
as
begin
set nocount on
declare @i int,@id varchar(20),@j int
select @i=count(*) from inserted
begin tran
update num_tb with(TABLOCKX) set
id=(case when convert(char(8),d,112)=convert(char(8),getdate(),112)
then id+@i else @i end),
@j=(case when convert(char(8),d,112)=convert(char(8),getdate(),112) then id else 0 end),
d=getdate()
commit tran
select * into #t from inserted
update #t set id=convert(varchar(8),getdate(),112)+right('00000'+rtrim(@j),5),@j=@j+1
insert tb select * from #t
end
go




--插入记录测试

insert into tb(name) values('张三')
insert into tb(name) values('李四')
select * from tb
/*
id name
-------------------- ----------
2010012700002 张三
2010012700003 李四
*/
insert into tb select '2010012700003','王五'
/*
id name
-------------------- ----------
2010012700002 张三
2010012700003 李四
2010012700004 王五

*/


看看这个可以满足吧?
jwdream2008 2010-01-27
  • 打赏
  • 举报
回复
Up!
黄_瓜 2010-01-27
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 jwdream2008 的回复:]
引用 12 楼 acmain_chm 的回复:
单据号要求:1.每天从000001开始 2. 单据号要连续啊。

如果删除了一个后,是不仍要保持连续?

比如 20100122 000001, 20100122 000002,20100122 000003,20100122 000004 删除20100122 000002 会如何操作? 

不允许物理删除!
[/Quote]

得用s lock 你问问大大吧,我也不太清楚
jwdream2008 2010-01-27
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 acmain_chm 的回复:]
单据号要求:1.每天从000001开始 2. 单据号要连续啊。

如果删除了一个后,是不仍要保持连续?

比如 20100122 000001, 20100122 000002,20100122 000003,20100122 000004 删除20100122 000002 会如何操作? 
[/Quote]
不允许物理删除!
guguda2008 2010-01-27
  • 打赏
  • 举报
回复
如果在编号里记录上个GETDATE()一般就不会重复了...
guguda2008 2010-01-27
  • 打赏
  • 举报
回复
这个好像是应该插入时判断是否成功,如果因为编号重复失败的话就提示一下,然后要么更新编号让客户重新插入要么直接换个新编号插入然后提示新的编号

如果想保证看到的就是插入的那就要在新建客户单据时就插入一条只有编号的空记录,插入时更新这条记录
ACMAIN_CHM 2010-01-27
  • 打赏
  • 举报
回复
单据号要求:1.每天从000001开始 2. 单据号要连续啊。

如果删除了一个后,是不仍要保持连续?

比如 20100122 000001, 20100122 000002,20100122 000003,20100122 000004 删除20100122 000002 会如何操作? 
jwdream2008 2010-01-27
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 beirut 的回复:]
引用 7 楼 jwdream2008 的回复:
客户端体现:
    用户每次打开画面要显示按照上面自动生成的单据号。

--不是插入数据时才生成单据号,而是用户再打开画面是,就可以看到单据号,!

还得用锁
[/Quote]

详解???
黄_瓜 2010-01-27
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 sql77 的回复:]
引用 5 楼 beirut 的回复:
引用 3 楼 fredrickhu 的回复:
SQL code--下面的代码生成长度为8的编号,编号以BH开头,其余6位为流水号。
--得到新编号的函数CREATEFUNCTION f_NextBH()RETURNSchar(8)ASBEGINRETURN(SELECT'BH'+RIGHT(1000001+ISNULL(RIGHT(MAX(BH),6),0),6)FROM tbWITH(XLOCK,PAGLOCK))ENDGO--在表中应用函?-

不错

小爱不错,是俺老大的歌,依靠
[/Quote]
黄_瓜 2010-01-27
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 jwdream2008 的回复:]
客户端体现:
    用户每次打开画面要显示按照上面自动生成的单据号。

--不是插入数据时才生成单据号,而是用户再打开画面是,就可以看到单据号,!
[/Quote]
还得用锁
SQL77 2010-01-27
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 beirut 的回复:]
引用 3 楼 fredrickhu 的回复:
SQL code--下面的代码生成长度为8的编号,编号以BH开头,其余6位为流水号。
--得到新编号的函数CREATEFUNCTION f_NextBH()RETURNSchar(8)ASBEGINRETURN(SELECT'BH'+RIGHT(1000001+ISNULL(RIGHT(MAX(BH),6),0),6)FROM tbWITH(XLOCK,PAGLOCK))ENDGO--在表中应用函?-

不错
[/Quote]
小爱不错,是俺老大的歌,依靠
jwdream2008 2010-01-27
  • 打赏
  • 举报
回复
客户端体现:
用户每次打开画面要显示按照上面自动生成的单据号。


--不是插入数据时才生成单据号,而是用户再打开画面是,就可以看到单据号,!
feixianxxx 2010-01-27
  • 打赏
  • 举报
回复
关注

加载更多回复(5)

22,209

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧