我给公司作一个软件,里面涉及到了一个记录编号的问题。我不知道该如何解决。
是这样的,编号的格式是:
SG-20020821-001
SG-: 是固定格式,不用变,是公司名字的缩写
20020821-是固定的,但数字是当天的日期
001 :是固定三位,表示这是今天的第几条记录,或者说是接到的第几个定单。
可以肯定的是,这里用三位绝对够了。不存在格式变动的问题。想请问各位,改如何设计?关键是最后三位该如何确定知道?001就是今天的identity数据字段。每天都是从001开始,一直累加上去。该怎么作啊?请各位大侠指点一二,最好说明解决的办法,并给出一点原代码。
是这样的,编号的格式是:
SG-20020821-001
SG-: 是固定格式,不用变,是公司名字的缩写
20020821-是固定的,但数字是当天的日期
001 :是固定三位,表示这是今天的第几条记录,或者说是接到的第几个定单。
可以肯定的是,这里用三位绝对够了。不存在格式变动的问题。想请问各位,改如何设计?关键是最后三位该如何确定知道?001就是今天的identity数据字段。每天都是从001开始,一直累加上去。该怎么作啊?请各位大侠指点一二,最好说明解决的办法,并给出一点原代码。
20020821(日期)——today
00x(第几个记录) ——count然后作一个记录型数据类型,就两个字段,一个是string,表示日期,一个整型,表示第几个记录。每次程序启动的时候,先判断日期是不是今天,是:则读取记录个数。否:则更改日期为今天,并将记录的个数复位为零。然后是在新增记录的时候,都是SG-today+ 00+inttostr(count+1)
然后再写回文件中。基本上这样的,很麻烦,所以想求借一个更好的办法。而且这样作好象也不安全,很难。
replace(str(isnull(substring(max(fid),13,3),0)+1,3),' ','0')
from syslog
where fid like 'sg-'+convert(varchar(10), getdate(), 112) + '%'
Str:=SG+Format(today,yymmdd)+AddOne();
//使能数据自动加一的函数AddOne(),这是自定义的函数.
Create Table SerialNoTable
(TheDay VarChar(10),TheNum Int)
Go----------------------------------------------
Drop Procedure ExtractCurrentNo
Go
Create Procedure ExtractCurrentNo
@UseMode int,
@ReturnNo Varchar(20) outPut
As
Declare @TheDay VarChar(10)
Declare @TheNum Int
Declare MyCursor Cursor for
Select TheDay,TheNum from SerialNoTable
Open MyCursor
Fetch Next from MyCursor into @TheDay,@TheNum
if @@FETCH_STATUS=0
begin
if @TheDay<>convert(varchar(10),getdate(),112)
begin
Select @TheDay= convert(varchar(10),getdate(),112)
Select @TheNum=1
end
else
begin
Select @TheNum=@TheNum+1
end
end
else
begin
Select @TheDay= convert(varchar(10),getdate(),112)
Select @TheNum=1
Insert into SerialNoTable(TheDay,TheNum)
Values
(@TheDay,@TheNum)
end
Select @ReturnNo='SG-'+@TheDay+'-'+Right('000'+Convert(Varchar(3),@TheNum),3)
if @UseMode=1
begin
Update SerialNoTable
Set
TheNum=@TheNum,TheDay=@TheDay
end
Close MyCursor
Deallocate MyCursor
Go
----------------------------------
Declare @me varchar(20)
Exec ExtractCurrentNo 1,@me OutPut
Select @me
a,b:string
i:integer
a:=inttostr(bh);
for i:=1 to 3-length(a) do b:=b+'0';
b:=b+a;
编号就是'SG-'+formatdate('yymmdd',today)+'-'+b
字段二:日期
字段三:count
字段四:最后的序号
字段五:flag标志
备注字段:扩展用我们系统最多有100多客户端的时候,就要考虑到多客户端同步具体实现:
每次向表读取一次后就insert一条新的记录....根据SG和日期分组取到最大的
记得要先插新记录然后用,也就是先创建一个新的记录编号,如果你使用了这个编号那么flag为Y,如果创建后取消了那么flag为N,这样可以避免不同的客户端生成相同的记录编号!!!记得记录编号字段为主键,日期+SG为索引,很好用不知道说的是否明白