我给公司作一个软件,里面涉及到了一个记录编号的问题。我不知道该如何解决。
是这样的,编号的格式是:
               SG-20020821-001
SG-: 是固定格式,不用变,是公司名字的缩写
20020821-是固定的,但数字是当天的日期
001 :是固定三位,表示这是今天的第几条记录,或者说是接到的第几个定单。
   可以肯定的是,这里用三位绝对够了。不存在格式变动的问题。想请问各位,改如何设计?关键是最后三位该如何确定知道?001就是今天的identity数据字段。每天都是从001开始,一直累加上去。该怎么作啊?请各位大侠指点一二,最好说明解决的办法,并给出一点原代码。

解决方案 »

  1.   

    我以前作了一个,勉强是可以用。代码倒不记得了。是通过本地的一个文本文件来实现。文本文件的记录内容是:
    20020821(日期)——today
    00x(第几个记录) ——count然后作一个记录型数据类型,就两个字段,一个是string,表示日期,一个整型,表示第几个记录。每次程序启动的时候,先判断日期是不是今天,是:则读取记录个数。否:则更改日期为今天,并将记录的个数复位为零。然后是在新增记录的时候,都是SG-today+ 00+inttostr(count+1)
    然后再写回文件中。基本上这样的,很麻烦,所以想求借一个更好的办法。而且这样作好象也不安全,很难。
      

  2.   

    select 'sg-'+convert(varchar(10), getdate(), 112) +'-'+ 
    replace(str(isnull(substring(max(fid),13,3),0)+1,3),' ','0') 
    from syslog
    where fid like 'sg-'+convert(varchar(10), getdate(), 112) + '%'
      

  3.   

    如:
    Str:=SG+Format(today,yymmdd)+AddOne();
    //使能数据自动加一的函数AddOne(),这是自定义的函数.
      

  4.   

    --使用存储过程,你在调试一下
    Create Table SerialNoTable
    (TheDay VarChar(10),TheNum Int)
    Go----------------------------------------------
    Drop Procedure ExtractCurrentNo
    Go
    Create Procedure ExtractCurrentNo
      @UseMode int,
      @ReturnNo Varchar(20) outPut
    As
      Declare @TheDay VarChar(10)
      Declare @TheNum Int
      Declare MyCursor Cursor for 
        Select  TheDay,TheNum from SerialNoTable
      Open MyCursor 
      Fetch Next from MyCursor into @TheDay,@TheNum
      if @@FETCH_STATUS=0
      begin
        if @TheDay<>convert(varchar(10),getdate(),112)
        begin
          Select @TheDay= convert(varchar(10),getdate(),112)
          Select @TheNum=1
        end
        else
        begin
          Select @TheNum=@TheNum+1
        end 
      end
      else
      begin
        Select @TheDay= convert(varchar(10),getdate(),112)
        Select @TheNum=1
        Insert into SerialNoTable(TheDay,TheNum)
        Values
        (@TheDay,@TheNum) 
      end
      Select @ReturnNo='SG-'+@TheDay+'-'+Right('000'+Convert(Varchar(3),@TheNum),3)
      if @UseMode=1 
      begin
        Update SerialNoTable
        Set
        TheNum=@TheNum,TheDay=@TheDay 
      end
      Close MyCursor
      Deallocate MyCursor
    Go
    ----------------------------------
    Declare @me varchar(20)
    Exec ExtractCurrentNo 1,@me OutPut
    Select @me
      

  5.   

    将每次最大的记录编号记入一个文本文件中,每次生成编号是取出加1即可。我通常是用.ini文件的某项记录
    a,b:string
    i:integer
    a:=inttostr(bh);
    for i:=1 to 3-length(a) do b:=b+'0';
    b:=b+a;
    编号就是'SG-'+formatdate('yymmdd',today)+'-'+b
      

  6.   

    最简单的是新加一个表来实现....我们系统就是如此字段一:SG
    字段二:日期
    字段三:count
    字段四:最后的序号
    字段五:flag标志
    备注字段:扩展用我们系统最多有100多客户端的时候,就要考虑到多客户端同步具体实现:
    每次向表读取一次后就insert一条新的记录....根据SG和日期分组取到最大的
    记得要先插新记录然后用,也就是先创建一个新的记录编号,如果你使用了这个编号那么flag为Y,如果创建后取消了那么flag为N,这样可以避免不同的客户端生成相同的记录编号!!!记得记录编号字段为主键,日期+SG为索引,很好用不知道说的是否明白