从朋友处复制了一个自动编号的自定义函数回来,加到我的工程某窗体中使用时调用DBEdit1.Text没有任何显示?函数如下:
function newid(pzlb_id: string): string;
var
cnlistid,d_year,d_month,d_day:string;
i:integer;
ADOSetTmp: TADODataSet;
begin
d_year:=formatfloat('00',strtoint(formatdatetime('yy',SYS_sjrq)));
d_month:=d_year+formatfloat('00',strtoint(formatdatetime('mm',SYS_sjrq)));
d_day:=d_month+formatfloat('00',strtoint(formatdatetime('dd',SYS_sjrq)))+pzlb_id;
ADOSetTmp := nil;
ADOSetTmp := TADODataSet.Create(ADOSetTmp);
ADOSetTmp.CommandText := 'SELECT MAX(spbm) AS maxid FROM spbm where substring(spbm,1,8)=''d_day''';
ADOSetTmp.Connection := DM1.ADOConnection1;
ADOSetTmp.Open;
if ADOSetTmp.fieldbyname('maxid').AsString='' then
begin
cnlistid:=d_day+'001';
end
else
begin
i:=strtoint(copy(ADOSetTmp.fieldbyname('maxid').asstring,9,3))+1;
cnlistid:=d_day+formatfloat('000',i);
end;
result:=cnlistid;
end;
调用如下:procedure Tspbm.Button8Click(Sender: TObject);
var
cnlistid:string;
begin
DBEdit1.Text:=newid(cnlistid);
end;
function newid(pzlb_id: string): string;
var
cnlistid,d_year,d_month,d_day:string;
i:integer;
ADOSetTmp: TADODataSet;
begin
d_year:=formatfloat('00',strtoint(formatdatetime('yy',SYS_sjrq)));
d_month:=d_year+formatfloat('00',strtoint(formatdatetime('mm',SYS_sjrq)));
d_day:=d_month+formatfloat('00',strtoint(formatdatetime('dd',SYS_sjrq)))+pzlb_id;
ADOSetTmp := nil;
ADOSetTmp := TADODataSet.Create(ADOSetTmp);
ADOSetTmp.CommandText := 'SELECT MAX(spbm) AS maxid FROM spbm where substring(spbm,1,8)=''d_day''';
ADOSetTmp.Connection := DM1.ADOConnection1;
ADOSetTmp.Open;
if ADOSetTmp.fieldbyname('maxid').AsString='' then
begin
cnlistid:=d_day+'001';
end
else
begin
i:=strtoint(copy(ADOSetTmp.fieldbyname('maxid').asstring,9,3))+1;
cnlistid:=d_day+formatfloat('000',i);
end;
result:=cnlistid;
end;
调用如下:procedure Tspbm.Button8Click(Sender: TObject);
var
cnlistid:string;
begin
DBEdit1.Text:=newid(cnlistid);
end;
若MSSQL的标准数据的话,你就里的INT吧这个有自动编号的功能
不是的话,你可以以当前的日期做为编号
比如:
销售
XS201107280001
我要的是按日期(6位数)+001。。这个的规率,如:1107290001,1107290002
现在我要问的是为什么我点击Button8后,DBEDit1.text没有任何显示?也没有其它异常提示。
字段信息,
DELPHI代码
if 编号为空 then
begin
//添加新记录
DBEDit1.text:=‘1107290001’;
end
else
begin
DBEDit1.text:=数据库中最后一条记录的编号+1;
end;
这个不会返回正确的记录,是不是应该这样
ADOSetTmp.CommandText := 'SELECT MAX(spbm) AS maxid FROM spbm where substring(spbm,1,8)='+d_day+'''';
DBEdit1.Text:=newid(cnlistid);
end;
这个也是有问题的,原则上应该修改数据源
adoquery1.edit;
adoquery1.fieldbyname('你的字段').asstring:=newid(cnlistid);
adoquery1.post;
ADOSetTmp.CommandText := 'SELECT MAX(spbm) AS maxid FROM spbm where substring(spbm,1,8)=''''+d_day+'''';
这个写的本身就有问题。改成下面的
ADOSetTmp.CommandText := 'SELECT MAX(spbm) AS maxid FROM spbm where substring(spbm,1,8)='+Quotedstr(d_day)+'';
非常感谢你的回答,至于你这个引用说明我知道的。我的情况是不直接写入数据库的,后面我点击保存后会用到“adoquery1.fieldbyname('你的字段').asstring:=DBEdit1.Text;”的。
我现在的问题其实是弄不明白为什么DBEdit1.Text为什么得不到newid(cnlistid)的返回信息,就算SQL取不到信息与应该返回“d_day+'001'”吧,不是吗?原因是什么?
嗯,再看看这个函数发现这位朋友好像道出了点什么东西来了。功能目的是为了自动编号写入DBEit1.text,请问是不是该赋个什么给pzlb_id ?怎么写?
CREATE TABLE [TestTable] ( [AutoID] [int] IDENTITY (1, 1) NOT NULL , [id] [varchar] (15) NOT NULL )
ALTER TABLE [TestTable] WITH NOCHECK ADD CONSTRAINT [PK_TestTable] PRIMARY KEY NONCLUSTERED ( [AutoID] ) SET IDENTITY_INSERT [TestTable] ON INSERT [TestTable] ( [AutoID] , [id] ) VALUES ( 1 , '110729002' ) SET IDENTITY_INSERT [TestTable] OFFprocedure TForm1.Button1Click(Sender: TObject);
begin
Edit1.Text:=newid;
end;function TForm1.newid: string;
var
qt_:Tadoquery;
dt_:TDateTime;
s_:string;
begin
qt_:=TADOQuery.Create(nil);
dt_:=now;
try
with qt_ do
begin
try
Connection:=ADOConnection1; sql.Text:='select top 1 [id] from [TestTable] where substring([id],1,6)=:temp order by [id] desc';
Parameters.ParamByName('temp').Value:=FormatDateTime('yymmdd',dt_);
Open; if qt_.Fields.Fields[0].IsNull then
s_:=FormatDateTime('yymmdd',dt_)+FormatFloat('0000',1)
else
s_:=FormatDateTime('yymmdd',dt_)+FormatFloat('0000',(StrToInt(copy(qt_.Fields.Fields[0].value,7,4))+1)); Result:=s_;
except
on E:exception do
begin
ShowMessage('操作被中断,原因:生成标识号失败,请稍候再试,原因:'+e.Message);
end;
end;
end;
finally
qt_.Free;
end;
end;
adoquery1.fieldbyname('你的字段').asstring:=newid(cnlistid);
adoquery1.post;