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

  • 主题发起人 主题发起人 于小澜
  • 开始时间 开始时间
沈前卫:
我试过你后来给的方法还是同样的问题,不执行ELSE。
可是,我把你的代码注释了一行(WHERE所在那行),结
果是ID号能累加了,但是不能保证每天从0001开始,这说
明问题就在WHERE所在那行,你看看该怎么办。
另外,我对WHERE这句话的意思也不太理解,你能解释一
下吗?
曹晓钢:
客户的要求,而且日期编在编号中方便知道开票据时
间。
 
我一直以为ID为数值型,你应该是Char或Varchar型吧,不然前套00回自动消失。


下面方法叫繁,其他人简化简化吧。


procedure TForm1.Button1Click(Sender: TObject);
const
SQL_Text='select max(id) from test'+
' where id like ''%s*''';
var
id:string;
begin
with Query1 do
begin
SQL.Clear;
SQL.Add(format(SQL_Text,[FormatDateTime('yymmdd',now)]));
Active:=True;
if Fields[0].IsNull then
id:=formatdatetime('yymmdd',now)+'0001'
else begin
id:=Fields[0].AsString;
id:=Copy(IntToStr(10000+StrToInt(Copy(id,Length(id)-3,4))+1),2,4);
id:=formatdatetime('yymmdd',now)+id;
end;
end;
ShowMessage(id);
end;
 
沈前卫:
我本来是想让ID为char型,但是在找
最大ID号就麻烦了,就那你所说的MAX
(ID),这样找的可不一定是最大的ID
,例如:29和3。MAX结果为3。
让ID为字符型是最好的,可我暂时想
不到找ID的好办法。还是考虑用数值型
解决这个问题吧!
另外,你最后给的这段代码还是不执
行ELSE。
 
》例如:29和3。MAX结果为3
那是因为你3前面没有前导0,如果为03就真确了。

》另外,你最后给的这段代码还是不执行ELSE。
兄弟,你看看你的数据库中ID是否有000506为前导的ID(景天5.6日运行次程序)

》考虑用数值型
那前导00就就回丢失,还不如200005050001.


 
沈前卫:
我后来试了试,可是还有问题:
现在这段代码不管你的字段中是否数据
最后ID返回总是0005060001,我实验的
字段中有0005060003和0005060029两个
值,ID返回还是0005060001,搞不懂!
你能不能把你实验的程序全部给我寄过
来!
 
哎,受不了啦!在我这里一切正常,全部代码就是上面。其他都是数据库了。
仔细检查检查你的数据库吧。实在不幸,将你的数据库压缩后寄哥我把。
 
读取BIOS的序列号(每台主板只有一个号)
 
直接用两各字段就OK,何必浪费那么多的时间……-……
 
把日期和ID号分别记录在一数据库(文件)中
如: Date ID
000425 0001
在程序中判断当前日期是否和数据库中的日期一样,如不同则更新Date字段,ID号为
0001,如一样,则Date不变,ID号加1。
不是很方便吗?
 
我认为上面说的都是在单用户上运行的,如果是多用户就恐怕就不行。在并发处理有
如何做呢?下面介绍并发处理的问题,数据库是mssql7:
就是象你这样的 199905250001、199905250002.........
我在一个小库里放一条记录, 这个小库专门保存 19990525 0001 中的0001
这个序号
每一个操作员在录入的时候使用一个存储过程,类似下面
前端:
var id: String;
try
database1.starttransaction; //启动事务
storedproc1.execproc; //执行存储过程得到一个序号
id:= format('0.4d',[storedproc1.Parambyname('result').AsInteger]); //格式化为 0001, 0002 这样的字符串
storedproc2.parambyname('@id').AsString:=id;
storedproc2.parambyname('@xx').AsInteger:=......;
.........;
storedproc2.ExecProc; //存储过程2 写真正的数据保存入库
database1.commit; //确认事务
except
database1.rollback; //如有异常,回滚整个事务,两个存储过程做的
//改动都不会生效
end;

存储过程里
第一个存储过程 取序号
declare @id_count int
update dbo.idcount set id=id+1 // 先将序号加1
select @id_count=id from dbo.idcount // 得到序号
return @id_count

第二个存储过程 写真实数据 传入参数有刚才生成的'0001'

declare @id_str char(12)
select @id_str= convert(char(8),getdate(),112) + @id
{ 由当前时间生成 '19990524' 这样的字符后再和'0001'相加 }


insert into............... values(@id_str,.....)

祝你好运!
 
多人接受答案了。
 
后退
顶部