如何实现 单号:20021004001, 20021004002 ,20021005001这样的数据.(50分)

  • 主题发起人 主题发起人 李锦江
  • 开始时间 开始时间

李锦江

Unregistered / Unconfirmed
GUEST, unregistred user!
如何实现 单号:20021004001, 20021004002 ,20021005001这样的数据.
在 DELPHI 6 + SQL 2000 SERVER 如何实现以上数据.
我要的SQL 2000 SERVER 中创建一个数据表.想数据自动生成.
是在创建表时设置还是利用程序的来实现.
在SQL 2000 中有不类型 BIGINT 用公式可以实现吗?日期 + 当天累加数.
 
我是用程序实现的

function TIntrain.getnewid(newid:integer;s:string):string;
var
i:integer;
begin
for i:=1 to 3-length(inttostr(newid)) do
begin
S:=S+'0';
end;
result:=datets+S+inttostr(newid);
end;
其中newid为当天累加数,写入注册表就行了
s是区分各种不同的单据号的
dates就是当天日期的字串
 
用存储过程实现. 不难
 
自套用函數實現
 
一定要用存储过程(最好用触发器)来实现,

如果用客户程序来设定的话,日期时间会一团糟,序号肯定全乱!
 
日期型应该不难取,DateToStr(Date())就可了(我用的C++Builder,Delphi下是不是这个函数
我就不知道了,呵),关键是后面的流水号,我知道有二种办法,一种是专门建一表存放当前
的流水号,每当对单据存放的表进行数据增加的操作后(AfterInsert),就让流水号表的
数据相应的增加一次,而单据号就为DateToStr(Date())+流水号表中的流水号,这样能实现
你的要求,但缺点是可能产生空的号,
第二种办法是用存储过程,每当单据表要增加新记录时,就调用存储过程,读出当前最大的
流水号,然后判断日期是否为当前日期,以决定是重新记录日期开始,还是流水号加1,这个
方法不会产生空号,速度也不错,但是在网络时如何解决数据冲突的问题,我也不知道。
我用的是第一种方法,对于空号还没有用户表示不能接受。
 
利用存储过程取得Date=20021005 + table:001,然后,update table 001+1
绝对不能用客户端来控制流水号
 
客户端控制和服务端控制都一样,客户端更灵活一点,关键是在处理累加时要对记录进行加
锁,否则有可能会重号。
 
用存储过程加流水号表来可以的!!!
同意dingyuan.
不过流水号要在存储过程中作,不会乱的。我公司就上、是如此作的。
 
我不是用sql server,但对于序号的问题,我们一般是用序号表来解决的,
至于数据操作的冲突问题,可以简单的通过行级锁来解决,只是需要注意
死锁的问题。
其次,指出一点,在一个系统中,对于时间如何确定,按照一般的原则,是
以数据库时间为准的,绝对不能使用客户端时间,这是一个基本原则。
如果照dingyuan的做法,那么只能是说你的运气比较好,你可以设想一下,
如果有一个客户端的时间是2004年的话,你的编号会出现什么结果?
 
用Formatdatetime('yyyymmdd',date)+累计数
 
试试下面的,经过调试的
function TForm1.getid: string;
var
mdata,rq:String;
mData1:integer;
begin
rq:=Formatdatetime('yyyymmdd',date);
AdoQuery1.Close;
AdoQuery1.Sql.Clear;
AdoQuery1.Sql.Add('Select isNull(max(convert(numeric(9),right(rTrim(field1),3))),0)+1 as maxvalue From Table1 Where field1>'''+rq+'''');
AdoQuery1.Open;
Mdata:=AdoQuery1.fieldbyname('maxvalue').asstring;
Mdata1:=strtoint(mdata);
case mdata1 of
1..9: showmessage('10');
10..99:showmessage('100');
100..999:showmessage('1000');
end;
result:=rq+Trim(mdata);
end;

调用只需label1.caption:=getid;
 
用函数!最好在另一个表里做一个像计数一样的int,
我用的方法和HANFI的很相似!
 
给你一段参考代码
var
i: integer;
strN, strY,strR: string;
STime: TSystemTime;
begin
GetLocalTime(STime);//取得系统时间
strN := inttostr(stime.wYear);//取四位的年
strY := inttostr(stime.wMonth);//取两的月
strR:=inttostr(stime.wDay);//取日
with DBQ do
begin
sql.Clear;
sql.Add('select max(SUBSTRING(bh, 9, 3)) as MX from Atable where substring(bh,1,8)='''+StrN+StrY+'''');
open;
if trim(fieldbyname('mx').AsString) = '' then
i := 1
else
i := strtoint(trim(fieldbyname('mx').AsString)) + 1;
result:=strN+strY+strR+ GetCodeNo(inttostr(i), 4);
end;
end;
其中函数getcodeNo如下
function GetCodeNo(NoStr: string; NoLen: integer): string;
begin //生成一个在数字前面自动补零编码
NoStr := Trim(NoStr);
Result := copy('00000000000000000000', 1, NoLen - length(NoStr)) + NoStr;
end;
 
给你一段参考代码
var
i: integer;
strN, strY,strR: string;
STime: TSystemTime;
begin
GetLocalTime(STime);//取得系统时间
strN := inttostr(stime.wYear);//取四位的年
strY := inttostr(stime.wMonth);//取两的月
strR:=inttostr(stime.wDay);//取日
with DBQ do
begin
sql.Clear;
sql.Add('select max(SUBSTRING(bh, 9, 3)) as MX from Atable where substring(bh,1,8)='''+StrN+StrY+'''');
open;
if trim(fieldbyname('mx').AsString) = '' then
i := 1
else
i := strtoint(trim(fieldbyname('mx').AsString)) + 1;
result:=strN+strY+strR+ GetCodeNo(inttostr(i), 3);//这里应该是三
end;
end;
其中函数getcodeNo如下
function GetCodeNo(NoStr: string; NoLen: integer): string;
begin //生成一个在数字前面自动补零编码
NoStr := Trim(NoStr);
Result := copy('00000000000000000000', 1, NoLen - length(NoStr)) + NoStr;
end;
 
是我老师写的,我现在一直在用的
CREATE PROCEDURE GetFpid
@nfpid varchar(12) output
AS

declare @d int,@m int,@y int,
@ds varchar(2),@ms varchar(2),@ys varchar(4),
@s varchar(12),@fpid varchar(12)

set @d=day(getdate())
set @m=month(getdate())
set @y=year(getdate())
if @y<50 set @y=@y+2000
set @ds=ltrim(str(@d,2,0))
set @ms=ltrim(str(@m,2,0))
set @ys=ltrim(str(@y,4,0))
while len(@ds)<2 set @ds='0'+@ds
while len(@ms)<2 set @ms='0'+@ms
while len(@ys)<4 set @ys='0'+@ys
set @s=@ys+@ms+@ds

select @fpid=max(fpid) from fp where (fpid between @s+'0001' and @s+'9999')
if @fpid is null set @fpid=@s+'0001'
else begin
set @s=substring(@fpid,9,4)
set @fpid=substring(@fpid,1,8)
set @s=ltrim(str(cast(@s as int)+1,4,0))
while len(@s)<4 set @s='0'+@s
set @fpid=@fpid+@s
end

set @nfpid=@fpid



GO
 
值得学习的贴子,好!
 
思想:读系统时间,不过系统时间一定是每天核对一下!
 
只有cxz9发的才是正确的方法!其他的都不好,本来我也想发跟cxz9类似的解答的,看他发的解答已经
很完美了,所以就不再灌水了。
 
后退
顶部