我想做一个自动产生编号:如今天是2008-07-01,自动生成的编号为200807010001,下一日其为200807010002,当月编号以此类推.
新的月份编号从0001又开始.如2008-08-01 编号为200808010001,当月编号也是以此类推.
不知那位同学可以为此写个存储过程或函数来调用的,谢谢!

解决方案 »

  1.   

    下面的代码你稍微改下就可以了,这段代码得到的是单号+当天的日期+6位流水号
    //strPer:单据号前缀
    //fieldname:存放单据号的字段名称
    //tablename:表名称   PO20080128001
    function createno(strPer,fieldname,tablename: string):string;
    var
      strSql, temp:string;
      amyQuery:tmyquery;
    begin
      amyQuery:=tmyquery.create(nil );
      amyQuery.connection:=GV_Con;
      amyQuery.SQL.Clear ;
      strSql:='select max(' + fieldname + ')' + '  from '+ tablename;
      amyQuery.SQL.Add(strSql);
      amyQuery.Open;
      if amyQuery.Fields[0].AsString='' then
        createno:=strPer+getcurrq(0,'')+'000001'
      else
      begin
        //amyQuery.Fields[0].asstring
        temp := rightstr(amyQuery.Fields[0].asstring,6);
        createno:=strPer+getcurrq(0,'')+Format('%.6d',[StrToInt(temp)+1]); //流水号占6位
      end;
    end;
      

  2.   

    http://topic.csdn.net/u/20080214/09/107b0a7e-37c1-4597-b573-b70186c7c4c9.html
      

  3.   

    看了一下, 这种代码只能写在 SQL 方, 客户端要是存在以上代码就不能保证生成的唯一性
    下面是 SQL, 查询分析器里执行, 做成一个 SQLDECLARE @DT DATETIME
    DECLARE @DTPART VARCHAR(8)
    DECLARE @ID VARCHAR(12) /* OUTPUT 做成存贮过程用这个做输出 */
    DECLARE @MAX_ID VARCHAR(12)SET @DT = GETDATE()
    SET @DTPART = CAST(DATEPART(year, @DT) * 10000 + DATEPART(month, @DT) * 100 + (DATEPART(day, @dt)) AS VARCHAR(8))
    SET @ID = @DTPART + '0001'/* SELECT @MAX_ID = MAX(ident) FROM TABLE WHERE ident > @ID*/SELECT @MAX_ID = '200808080002' /* 测试值 */IF @MAX_ID IS NOT NULL
    BEGIN
      SET @MAX_ID = RIGHT(@MAX_ID, 4)
      SET @ID = RIGHT('0000' + CAST(CAST(@MAX_ID AS INT) + 1 AS VARCHAR(4)), 4)
    ENDSELECT @ID