想在添加记录时自动生成编号,取‘年份后两位’+‘月份’(两位)+‘流水号’(三位)生成。流水号同一月份逐次加一。
如2005年4月流水号为5:0504005
请问怎么实现呀

解决方案 »

  1.   

    id:=FormatDateTime('yymm',now)+Format('%.3d',[MonthOfTheYear(now)+1]);
      

  2.   

    添加一个表或ini文件,专门记录当前最大的流水号
      

  3.   

    拜托说详细点呀,怎么记录当前最大的流水号呢?
    还有Format('%.3d',[MonthOfTheYear(now)+1]);是什么意思呀
      

  4.   

    你可以通过取流水号的前4位,来判断当前要生成的账单是否是本月的第1笔帐单IF 要生成账单流水号前4位<>流水号最大值前4位 Then
        年份后两位’+‘月份’(两位)+001 来生成流水号
    ElSE
        就去现有帐单流水号最大值+1当然你要有一个来用来记录流水帐号的最大值得表或其他什么的文件。也可以用select max(id) from 表名 的形式来取流水号最大值,不过这样如果表很大就不行了。方法比较笨,仅供参考。
      

  5.   

    还问怎么写,晕了,很清楚了,一个变量T当作当前最大的流水号会不会,初始值为零,每次需要用的时候先+1,然后使用,因为你的程序需要退出,多次使用,只是放在变量T里肯定不行的了,所以使用数据库或者ini文件存下来了,每次程序启动的时候首先从库里把值读到T里,程序里继续用上面的办法使用,程序关闭的时候,把T再写回库里,这样够明白了吧
      

  6.   

    var
      AdoifExist,AdoGetMaxid : TADOQuery;
      maxid : String;
    begin
      AdoifExist := TADOQuery.Create(nil);
      AdoGetMaxid := TADOQuery.Create(nil);  AdoifExist.Connection := .....//此处是连接字符串或者连接到TADOConnection
      AdoifExist.Close;
      AdoifExist.sql.clear;
      AdoifExist.sql.add('select * from table1 where id like ''' + format('yymm',now) + '%''');
      AdoifExist.open;  if AdoifExist.IsEmpty then
        maxid := format('yymm',now) + '001'
      else
        begin
          AdoGetMaxid.close;
          AdoGetMaxid.sql.clear;
          AdoGetMaxid.sql.add('select max(yourid)+1 as myid from table1 where left(yourid,4)=''' + format('yymm',now)+'''' );   //这里可能要将yourid转成int型,没试过,自己试试
          AdoGetMaxid.open;      maxid := format('yymm',now) + Format('%.3d',AdoGetMaxid.FieldbyName('myid').asinteger);  
        end;/////////////////////
    //maxid就是你要的流水号。
    //全凭想像写的代码,如有不对,请高手指教
    ////////////////////
      

  7.   

    建个触发器
    CREATE trigger tab_addid on dbo.table
    for insert
    as
     DECLARE @str char(7)
     declare @str1 char(3)
     select  @str=substring(cast(year(getdate()) as char(4)),3,2)
                 +right('00'+rtrim(cast(month(getdate()) as char(2))),2)             
     select @str1=convert(char(3),inserted.id) from inserted
     select @str1=right('000'+ltrim(rtrim(@str1)),3)
     select @str=@str+@str1
     Update table set 编号=@str from inserted where table.id=inserted.id
     
    注:id为自增字段。这样你就不用去关心插入编号的问题了
      

  8.   

    AdoGetMaxid.sql.add('select max(yourid)+1 as myid from table1 where left(yourid,4)=''' + format('yymm',now)+'''' );   
    请问这句里的myid是什么呀
      

  9.   

    yourid呢?
    都是指id字段把,一样的?
      

  10.   

    AdoifExist.sql.add('select * from table1 where id like ''' + format('yymm',now) + '%''');
    运行时这句语法有错,怎么回事呢?
      

  11.   

    myid是别名,yourid是指你存id的那个字段名
      

  12.   

    试试这个:
    AdoifExist.sql.add('select * from table1 where id like ' + format('yymm',now) + '%');
      

  13.   

    maxid := formatdatetime('yymm',now()) + floattostr(Formatfloat('%.3d',AdoGetMaxid.FieldbyName('工资单号').Asfloat));
    现在这句总出错,因为我的工资单号是float型,这样写有什么错呢?
      

  14.   

    现在这样了,adoifexit,adogetmaxid都已经和工资单表连上
    编译通过,可是添加的时候总是出错,费解??
    var
      i:real;
      maxid : String;
    begin
      AdoifExist.sql.clear;
      AdoifExist.sql.add('select * from 工资单 where 工资单号 like ''' + formatdatetime('yymm',now())+ '%''' );
      AdoifExist.open;
      if AdoifExist.IsEmpty then
        maxid := formatdatetime('yymm',now()) + '001'
      else
        begin
          Adogetmaxid.close;
          AdoGetMaxid.sql.clear;
          AdoGetMaxid.sql.add('select max(工资单号)+1 as i from 工资单 where left(yourid,4)=''' + formatdatetime('yymm',now())+'''' );
          AdoGetMaxid.open;
          maxid:= formatdatetime('yymm',now()) +  Formatfloat('000',i);
        end;
      

  15.   

    整个代码如下
    总是说重复的工资单号,数据库里面设的主键不能重复就出错了
    procedure TForm1.BitBtn1Click(Sender: TObject);
    var
      i:real;
      maxid : String;
    begin
      AdoifExist.sql.clear;
      AdoifExist.sql.add('select * from 工资单 where 工资单号 like '+'''' + formatdatetime('yymm',now())+ '%'+'''' );
      AdoifExist.open;
      if AdoifExist.IsEmpty then
        maxid := formatdatetime('yymm',now()) + '001'
      else
        begin
          Adogetmaxid.close;
          AdoGetMaxid.sql.clear;
          AdoGetMaxid.sql.add('select max(工资单号)+1 as i from 工资单 where left(yourid,4)=''' + formatdatetime('yymm',now())+'''' );
          AdoGetMaxid.open;
          maxid:= formatdatetime('yymm',now()) +  Formatfloat('000',i);
        end;     ADOQuery1.Append;     ADOQuery1.FieldByName('工资单号').Asfloat:=strtofloat(maxid);
         ADOQuery1.FieldByName('员工编号').Asfloat:=StrTofloat(Label16.Caption);
          ADOQuery1.FieldByName('发放日期').AsString:= formatdatetime('yyyymmdd',now());
          ADOQuery1.FieldByName('姓名').AsString:= Label17.Caption;
         ADOQuery1.FieldByName('性别').AsString:=Label6.Caption;
          ADOQuery1.FieldByName('基本工资').Asinteger:=StrToInt(Edit1.text);
         ADOQuery1.FieldByName('奖金').Asinteger:=StrToInt(Edit2.text);
         ADOQuery1.FieldByName('加班费').Asinteger:=StrToInt(Edit3.text);
          ADOQuery1.FieldByName('其他费用').Asinteger:=StrToInt(Edit4.text);
         ADOQuery1.FieldByName('扣除费用').Asinteger:=StrToInt(Edit5.text);
         ADOQuery1.FieldByName('工时工资').Asinteger:=StrToInt(Edit6.text);
         ADOQuery1.FieldByName('合计').Asinteger:=ADOQuery1.FieldByName('基本工资').Asinteger+ADOQuery1.FieldByName('奖金').Asinteger+ADOQuery1.FieldByName('加班费').Asinteger+ADOQuery1.FieldByName('其他费用').Asinteger-ADOQuery1.FieldByName('扣除费用').Asinteger+ADOQuery1.FieldByName('工时工资').Asinteger;
         ADOQuery1.Post;
         ADOQUERY1.active:=false;
         ADOquery1.active:=true;
    end;
      

  16.   

    procedure setsql(adoquery:TADOQuery;sqlstr:string;cn:integer);
    begin
      adoquery.close;
      adoquery.sql.clear;
      adoquery.sql.add(sqlstr);
      if cn = 1 then adoquery.open
    else adoquery.ExecSQL;
    end;function getid(str:string):string; ///str即为0504005中前四位
    begin
      setsql(dm.tmpquery,'select max(编号') as 编号 from 入库表 where substring(编号,1,4)='+''''+str+'''',1);
      if dm.tmpquery.fieldbyname('编号').asstring = '' then
         result:=str+'001'
      else
        result:=str+rightstr('000'+inttostr(strtoint(rightstr(dm.tmpquery.fieldbyname('编号').asstring,3))+1),3);
    end;试试看吧,没有调试,应该正确的.
      

  17.   

    AdoGetMaxid.sql.add('select max(工资单号)+1 as i from 工资单 where left(工资单号,4)=''' + formatdatetime('yymm',now())+'''' );
      

  18.   

    maxid:= formatdatetime('yymm',now()) +  Formatfloat('000',i);
    改成 
    maxid:= formatdatetime('yymm',now()) +  Formatfloat('000',ADOQuery1.Fields[0].asString);