编号的困惑(50分)

  • 主题发起人 主题发起人 LanzeServer
  • 开始时间 开始时间
L

LanzeServer

Unregistered / Unconfirmed
GUEST, unregistred user!
各位我在设计中遇到如下问题。数据库为SQL SERVER 采用C/S结构。单号取上一张单的单号加1
如进仓单0001号,A用户增加一张进仓单,按上面的原理这时单号为0002。此时B用户也增加一张进仓单
按上面的原理这时单号也为0002。说明A用户没有存盘退出。请问如何解决。
 
你可以用trigger阿,搞一个全局变量表,after insert后触发trigger,update单号,全局变量+1
就ok啦
 
用触发器就搞定
 
orderno char(10) identity(1000,1) primary key
 
1.表级锁
2.单号使用较大随机数,可考虑设计成与时间有关的
 
cb422和CHOCOLATE二位能否在明细一点
 
认为以时间为单号生成方法,方便,简单,设为12位:yymmddhhMMss,
一秒之内重复的可能性很小.
 
时间故然好用,可编号就显得乱了。我这种情况,用了一个字段做为全句变量。
 
象这种顺序生成的唯一性标号,应该是在用户提交存盘时生成,不能在用户选择录入记录时
就生成。这样就不会有你所描述的问题。

如果确实有需要,我的做法是在用户选择增加记录时,表中马上进行insert操作,得到唯一
标号,后面用户提交存盘时的动作实际上是update。只是此时状态下要考虑用户可以选择不
存盘。
 
用存储过程获取每次的新编号!
 
Update的時候再決定單號就OK了
insert into table1 set 单号=(select max(单号)from table1 ),...
 
我的做法是,采用了一张表专门存放编号,每次增加一张单时从表中取。如
增加一张进仓单时。取得最大号时,立马更新表中的单号。但如果取消这张单时,在增加单号就不
连续了
 
TO :XSPANKER请问表级锁如何做
 
其实可以这么做
建一张表如 PubSequence(TABLENAME, LASTVAL)
表TableName保存表名, LastVal保存序列号值
如入库单记录为
TABLENAME LASTVAL
-----------------------
INSTORE 1
.....
写一个方法
FUNCTION PubGetNexSerial(I_TABLENAME:STRING):INTEGER
var NewID
BEGIN
select LastVal+1 into NewID from PubSequence where TABLENAME=I_TableName;
Result:= NewID;
Update PubSequence set LastVal=NewID where TableName=I_TableName
END;

当要新增一个入库单,则调用上面的过程取得新的单号
NewId:= PubGetNewSerial('INSTORE');

这样你的系统中所有类似的问题都可以解决了
 
同意新建一张表,里面放各种KEY,我们的系统就是如此解决的!
 
可以在数据保存时在计算该表单的序号,开始输入状态时用一个固定的编号替代
 
多人接受答案了。
 
后退
顶部