从朋友处复制了一个自动编号的自定义函数回来,加到我的工程某窗体中使用时调用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; 

解决方案 »

  1.   

    这个自动编号要写到数据库中吗
    若MSSQL的标准数据的话,你就里的INT吧这个有自动编号的功能
    不是的话,你可以以当前的日期做为编号
    比如:
    销售
     XS201107280001
      

  2.   


    我要的是按日期(6位数)+001。。这个的规率,如:1107290001,1107290002
    现在我要问的是为什么我点击Button8后,DBEDit1.text没有任何显示?也没有其它异常提示。
      

  3.   

    你可以通过这个Button8点击后,先读取数据库中最后一条记录并得到那个“编号”
    字段信息,
    DELPHI代码
     if  编号为空  then
        begin
         //添加新记录
         DBEDit1.text:=‘1107290001’;
        end
     else
        begin
         DBEDit1.text:=数据库中最后一条记录的编号+1; 
        end;
      

  4.   

    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+'''';
      

  5.   

    begin  
      DBEdit1.Text:=newid(cnlistid);
    end;  
    这个也是有问题的,原则上应该修改数据源
    adoquery1.edit;
    adoquery1.fieldbyname('你的字段').asstring:=newid(cnlistid);
    adoquery1.post;
      

  6.   

    不好意思,有点错误。
    ADOSetTmp.CommandText := 'SELECT MAX(spbm) AS maxid FROM spbm where substring(spbm,1,8)=''''+d_day+'''';
      

  7.   

    pzlb_id这个参数就是为了一个空值?
      

  8.   

    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)+'';
      

  9.   


    非常感谢你的回答,至于你这个引用说明我知道的。我的情况是不直接写入数据库的,后面我点击保存后会用到“adoquery1.fieldbyname('你的字段').asstring:=DBEdit1.Text;”的。
    我现在的问题其实是弄不明白为什么DBEdit1.Text为什么得不到newid(cnlistid)的返回信息,就算SQL取不到信息与应该返回“d_day+'001'”吧,不是吗?原因是什么?
      

  10.   


    嗯,再看看这个函数发现这位朋友好像道出了点什么东西来了。功能目的是为了自动编号写入DBEit1.text,请问是不是该赋个什么给pzlb_id ?怎么写?
      

  11.   

    应该不用  pzlb_id:=i;   吧
      

  12.   


     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;
      

  13.   

    adoquery1.edit;
    adoquery1.fieldbyname('你的字段').asstring:=newid(cnlistid);
    adoquery1.post;