给个更好的思路!(关于生成ID号)(88分)

  • 主题发起人 主题发起人 于小澜
  • 开始时间 开始时间

于小澜

Unregistered / Unconfirmed
GUEST, unregistred user!
数据库表中有ID和日期两个字段,其中ID为主键
,其生成是规则:前六位是日期(当天日期),
后四位是序号(每过一天序号从0001开始),这
样生成的ID号,例如:
今天ID号是0004250001、0004250002……
明天ID号是0004260001、0004260002……
我是在填加一条记录时,先查找和当前日期相等
的记录,将其结果的ID字段存入数组(只能是动
态的数组),取数组后四位存入另一数组(也只
能是动态的数组),找出其中最大的,将其+1,
如此生成ID号。
我觉得这个办法不容易实现,又比较笨,我想大
家会有更好的办法。(写的详细些)
 
with query do
begin
sql.clear;
sql.add('select max(id) from yourtable');
sql.add(' where id like '''+FormatDateTime('yymmdd',now)+'%''');
active:=True;
if fields[0].isnull then
id:=strtoint(formatdatetime('yymmdd')+'0001')
else
id:=fields[0].AsInteger+1;
end;
 
sql.add(' where id like '''+FormatDateTime('yymmdd',now)+'%''');

最好改为://有写数据哭不支持类型自动转换。

sql.add(' where cast(id as varchar(20)) like '''+FormatDateTime('yymmdd',now)+'%''');
 
以前回答过,记录流水号的表有两个字段,一个记录日期,一个记录ID
CREATE PROCEDURE TempGet (
@SerialNo Char(12) OUTPUT
) AS
DECLARE @dtLastday DateTime ,
@ID INT
BEGIN
Select @dtLastday = (select Mydate from MyTemp)
Select @ID = (select Serial from MyTemp)
IF CONVERT(char(8), @dtLastday,112) = CONVERT(char(8), GETDATE(), 112)
BEGIN
SELECT @SerialNo = CONVERT(char(8), @dtLastday,112) + SUBSTRING(CONVERT(char(5),10000+@ID),2,4)
Update MyTemp Set Serial=Serial+1
END
ELSE
BEGIN
SELECT @SerialNo = CONVERT(char(8), GetDate(),112) + '0001'
Update MyTemp Set MyDate=GetDate(),Serial=2
END
END
 
将每天的日期写入一个.ini文件,当系统日期不同与.ini文件中的日期时,从0001
开始重新计数。
 
沈前卫:
我试用了你的方法,生成ID时没有什么问题,但是我在applyupdata时,提示
“No SQL Statement available”,请帮忙看一看。
wgzhang:
我有看不懂,不知道怎么用,能解释一下吗?
 
我能看看用到applyupdata函数的这段程序吗?
 
谢谢bizzar的热心帮助,
“No SQL Statement available”错误提示我已解决。

现在的问题是用沈前卫的办法生成ID号时,总是生成0001
这一个号,并不执行id:=fields[0].AsInteger+1,不知
是何原因.

我怀疑' where id like '''+FormatDateTime('yymmdd',now)+'%'''
是否有问题。
 
如果多机同时处理如何防重号?
 
用我第二贴的方法:

sql.add(' where cast(id as varchar(20)) like '''+FormatDateTime('yymmdd',now)+'%''');
 
沈前卫:
我用你的第二贴,提示语法错误!我不知道错误在哪儿,请指教。
烂泥:
我这个问题不存在这中情况,
你的这个问题可以用编号+操作员代号来解决。
 
你市用的什么数据库???
 
给你一个函数,是三年前做的。我赖得去精简了。

Function Getname(dateT:TDate):String; //获取编号
Var Max,Num,MaxNum,MinNum ,First,Second,II:Integer;
MaxsumNO,Date :String;

Function TDMF.EditToInt(Text:String):Integer;
Begin
try
Result :=StrToInt (Text);
except
Result :=0;
end;
End;
Function Int2StrPad0( N:longInt ;Len:Integer;Replace:String):String;
Begin
FmtStr(Result,'%d',[N]);
While Length(Result) <Len do
Result :=Replace+Result;
End;

Begin
Date :=FormatDatetime('yyyymmdd',DateT);
MaxsumNO :='';
Query:=TQuery.Create (Self);
try
MaxNum :=0;
Query.Close;
Query.SQL.Clear ;
Query.SQL.Add ('Select ''max''=max(ID) From 〈yourtable〉where ID like :NO ');
Query.ParamByName('NO').AsString :=Date+'%';
Query.Open;

MaxsumNO :=Query.FieldByName('max').AsString;
if not Query.EOF then Max :=EditToInt(copy(Query.FieldByName('max').AsString,9,4))
else Max :=0;

Query.Close;
Query.SQL.Clear ;
Query.SQL.Add ('Select ID from 〈yourtable〉 where ID like :NO order by ID');
Query.ParamByName('NO').AsString :=Date+'%';
Query.Open;
if not Query.EOF then Num:=Query.RecordCount
else Num :=0;

if Max>Num then
Begin
II:=EditToInt(copy(MaxsumNO,9,4))+1;
MaxsumNO :=Date+Int2StrPad0(II,4,'0');

Query.First ;
if not Query.EOF then
repeat
First :=EditToInt(Copy(Query.FieldByName('ID').AsString,9,4));
if First >MaxNum then MaxNum :=First;

if not Query.EOF then
Begin
Query.Next ;
Second :=EditToInt(Copy(Query.FieldByName('ID').AsString,9,4));
if Second>MaxNum then MaxNum :=Second ;
if First<>(Second-1) then
Begin
MaxNum :=First+1;
Result :=Date+Int2StrPad0(MaxNum,4,'0');
Break;
End;
Query.Prior ;
End;
if not Query.EOF then Query.Next ;
until Query.EOF ;
End
else
Result :=Date+Int2StrPad0(Num+1,4,'0');
End;



 
我用的是ACCESS数据库
 
const
SQL_Text='select max(id) from yourtable'+
' where cstr(id) like ''%s*''';

with query do
begin
sql.clear;
sql.add(format(SQL_Text,[FormatDateTime('yymmdd',now)]);
active:=True;
if fields[0].isnull then
id:=strtoint(formatdatetime('yymmdd')+'0001')
else
id:=fields[0].AsInteger+1;
end;
 
少了')'

sql.add(format(SQL_Text,[FormatDateTime('yymmdd',now)]));
 
Access就没有子自增字段吗?
我觉得你这样的ID号实在没什么好处。ID作Primary Key,就用自增字段

如果又需要你那样的字段,再用计算字短处里不是好吗?
不让你这么设计,日期字段有什么用?
 
后退
顶部