求教:关于自动编号的自定义函数使用问题

想到才能做到 2011-07-29 10:53:48
从朋友处复制了一个自动编号的自定义函数回来,加到我的工程某窗体中使用时调用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;

...全文
153 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
gxgyj 2011-07-29
  • 打赏
  • 举报
回复

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] OFF



procedure 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;
想到才能做到 2011-07-29
  • 打赏
  • 举报
回复
应该不用 pzlb_id:=i; 吧
想到才能做到 2011-07-29
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 jyb_9 的回复:]
pzlb_id这个参数就是为了一个空值?
[/Quote]

嗯,再看看这个函数发现这位朋友好像道出了点什么东西来了。功能目的是为了自动编号写入DBEit1.text,请问是不是该赋个什么给pzlb_id ?怎么写?
想到才能做到 2011-07-29
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 babydog01 的回复:]
begin
DBEdit1.Text:=newid(cnlistid);
end;
这个也是有问题的,原则上应该修改数据源
adoquery1.edit;
adoquery1.fieldbyname('你的字段').asstring:=newid(cnlistid);
adoquery1.post;
[/Quote]

非常感谢你的回答,至于你这个引用说明我知道的。我的情况是不直接写入数据库的,后面我点击保存后会用到“adoquery1.fieldbyname('你的字段').asstring:=DBEdit1.Text;”的。
我现在的问题其实是弄不明白为什么DBEdit1.Text为什么得不到newid(cnlistid)的返回信息,就算SQL取不到信息与应该返回“d_day+'001'”吧,不是吗?原因是什么?
jyb_9 2011-07-29
  • 打赏
  • 举报
回复
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)+'';
jyb_9 2011-07-29
  • 打赏
  • 举报
回复
pzlb_id这个参数就是为了一个空值?
babydog01 2011-07-29
  • 打赏
  • 举报
回复
不好意思,有点错误。
ADOSetTmp.CommandText := 'SELECT MAX(spbm) AS maxid FROM spbm where substring(spbm,1,8)=''''+d_day+'''';
babydog01 2011-07-29
  • 打赏
  • 举报
回复
begin
DBEdit1.Text:=newid(cnlistid);
end;
这个也是有问题的,原则上应该修改数据源
adoquery1.edit;
adoquery1.fieldbyname('你的字段').asstring:=newid(cnlistid);
adoquery1.post;
babydog01 2011-07-29
  • 打赏
  • 举报
回复
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)='+d_day+'''';
山东蓝鸟贵薪 2011-07-29
  • 打赏
  • 举报
回复
你可以通过这个Button8点击后,先读取数据库中最后一条记录并得到那个“编号”
字段信息,
DELPHI代码
if 编号为空 then
begin
//添加新记录
DBEDit1.text:=‘1107290001’;
end
else
begin
DBEDit1.text:=数据库中最后一条记录的编号+1;
end;
想到才能做到 2011-07-29
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 sgzhou12345 的回复:]
这个自动编号要写到数据库中吗
若MSSQL的标准数据的话,你就里的INT吧这个有自动编号的功能
不是的话,你可以以当前的日期做为编号
比如:
销售
XS201107280001
[/Quote]

我要的是按日期(6位数)+001。。。。。这个的规率,如:1107290001,1107290002
现在我要问的是为什么我点击Button8后,DBEDit1.text没有任何显示?也没有其它异常提示。
山东蓝鸟贵薪 2011-07-29
  • 打赏
  • 举报
回复
这个自动编号要写到数据库中吗
若MSSQL的标准数据的话,你就里的INT吧这个有自动编号的功能
不是的话,你可以以当前的日期做为编号
比如:
销售
XS201107280001
iDeputy 2011-07-29
  • 打赏
  • 举报
回复
你还是自己设置几个断点看下:
1,是否进入方法了
2,返回值是什么吧
山东蓝鸟贵薪 2011-07-29
  • 打赏
  • 举报
回复
adoquery1.edit;
adoquery1.fieldbyname('你的字段').asstring:=newid(cnlistid);
adoquery1.post;

5,379

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧