应客户需求:记录数据,数据编号应该是这样的,按照格式 形如“04090001”,那么下一笔记录编号则是"04090002"以此类推"04090003",其中前面四位是后两位年份加月份两位.难度在这,当月份为下一月份时,即为10月份时,后四位则应重新开始计数,即后四位又从0001开始计数--“04100001”。怎么样才能做到这一点呢,望高手指点。有完整代码当然最好啦。高分回报,呵呵。

解决方案 »

  1.   

    这有段代码,不过是用PB写的,相信你能看懂原理:
    http://www.pdriver.com/bbs2004/dispbbs.asp?boardID=14&replyID=733870&ID=115300&skin=1
      

  2.   

    给你格菜菜得办法,表中加上一个tempID用来记录本月单号数,就是流水号得最后一个部分,
    这就好弄多了
      

  3.   

    可以做
    04090001分为2个部分,04年09月0001流水号0409做为一个部分可以通过程序生成
    然后到数据库中查找有没有04090001,有的话为max(字段)+1,没有的话为04090001(当前月第一条数据)oracle里我都在sql里写
    select decode('','0409'||'0001',max(字段)+1) from 表 where 字段='0409'||'0001'
      

  4.   

    建立存储过程
    CREATE PROCEDURE   Sp_bhAS
    /*
    --------------------------------------------------------
    --返回表的编号,四位流水号
    -------------------------------------------------------
    */
    Declare  @str1 varchar(20),@str2  varchar(20),  @str_ret  varchar(20)
    Declare  @num  intset  @str1=right('00'+ltrim(rtrim(str(month(getdate())))),2)+right('00'+ltrim(rtrim(str(day(getdate())))),2)
    select  @str2=max(编号)  from  表 where 编号 like  @str1+'____'if @str2 is  Null  OR   ltrim(rtrim(@str2))=''  
       set  @str2='0000'set @str2=right(@str2,4)
    set @num=cast(@str2   as  int)
    set @num=@num+1
    set @str2=right('0000'+ltrim(rtrim(cast(@num as varchar(12)))),4)
    set  @str_ret=@str1+@str2select  @str_retGO
      

  5.   

    建立存储过程
    CREATE PROCEDURE   Sp_bhAS
    /*
    --------------------------------------------------------
    --返回表的编号,四位流水号
    -------------------------------------------------------
    */
    Declare  @str1 varchar(20),@str2  varchar(20),  @str_ret  varchar(20)
    Declare  @num  intset  @str1=right('00'+ltrim(rtrim(str(year(getdate())))),2)+right('00'+ltrim(rtrim(str(month(getdate())))),2)
    select  @str2=max(编号)  from  表 where 编号 like  @str1+'____'if @str2 is  Null  OR   ltrim(rtrim(@str2))=''  
       set  @str2='0000'set @str2=right(@str2,4)
    set @num=cast(@str2   as  int)
    set @num=@num+1
    set @str2=right('0000'+ltrim(rtrim(cast(@num as varchar(12)))),4)
    set  @str_ret=@str1+@str2select  @str_retGO
      

  6.   

    public class RegID
    {

    int id;
    int year;
    int month;
            
    public virtual string CreateID(int ID)
    {     

       string connectionSQL=System.Configuration.ConfigurationSettings.AppSettings["BUS_CSTRING"];
       string SQL = "SELECT MAX(SUBSTRING(BUS_RecordID,13,4)) AS i FROM BUS_RECORD WHERE (PROC_ID = @id) AND (DATEPART(year, BUS_SUBMIT_TIME) = @year) AND (DATEPART(month, BUS_SUBMIT_TIME) = @month)";

    SqlConnection connect1;
    connect1 = new SqlConnection(connectionSQL);
    SqlCommand cmd;
    cmd = new SqlCommand(SQL,connect1);

    connect1.Open();
    cmd.Parameters.Add("@id",SqlDbType.Int,5);
               
                cmd.Parameters.Add("@year",SqlDbType.Int,5);
                cmd.Parameters.Add("@month",SqlDbType.Int,5);


    year=DateTime.Now.Year;
                month=DateTime.Now.Month;
    cmd.Parameters["@id"].Value =ID;
    cmd.Parameters["@year"].Value =year;
    cmd.Parameters["@month"].Value =month;
    SqlDataReader reader = cmd.ExecuteReader();

    string j;


    if(reader.Read())
    {
    j=reader["i"].ToString();
    if (j=="")
    {
    id=1;
    }
    else
    {
    id=Convert.ToInt32(j)+1;

    }
                }
                reader.Close();
        connect1.Close();

      
    string procID=ID.ToString("0000");

    //select database to set userCount where busId=busID
    string strDate=DateTime.Now.ToString("yyyyMM");
    string strUserCount=id.ToString("0000");
    return procID +"-"+strDate+"-"+strUserCount;
    }
    }
      

  7.   

    建议建一张表就存一个ID字段,每回月份增加时清0,每月内的流水号大家都从这个字段取,当然取值时先update此字段加1再取,这样大家的流水号不会有冲突。
      

  8.   

    对,我比较赞同楼上JafyLiu(JafyLiu)的做法,但这样会出现流水号不一定连续的问题,就是说,假设我现在Update操作,把当前号码加1,然后计算出所需要的流水,但因为某种原因,本来想添加新记录的操作取消了,这个新流水号也跟着取消了,下次再操作,已经是下一个流水号了,跳空了一个,当然,如果没有对流水号的连续要求的话,这个方案算是比较合理(个人认为),因为没有同步异步的问题,毕竟如果用户数比较多的话,同时去申请一个新的流水号的情况是绝对可能的
      

  9.   

    TO wtadminxjeri(P42.4):
    你误会我意思了,按我理解,我觉得单纯用程序代码或者存储过程去计算新的流水号,一样会有同步异步的问题,就像你所说的“代码执行期间,有另外一笔数据进入”,我觉得应该有一个核心问题,无论是在代码中,还是在存储过程中,应该都用到一个互斥的思想,就是说,当前我正在计算一个新的流水号时,保存有当前最新流水号的变量(或者是数据库中的记录)是不允许其它人去访问修改的,就像上面JafyLiu(JafyLiu) 所说的,用一个表了保存当前月最新的流水号,计算新流水号的时候,先UPDATE加1,然后再用UPDATE后生成的号来生成流水号,利用数据库中访问数据的互斥性来解决冲突,当然,流水号字段建立唯一索引来产生约束是必要的,但在计算流水号的过程中就应该保存计算出来的流水号是唯一的也是必要的,要不然,计算出新流水号之后,利用这个流水号在其它表添加新记录的时候才发现流水号已经重复了,那就更麻烦了,特别是Web程序
      

  10.   

    如果单从流水号的计算来说,计算机的处理速度(数据库处理也一样)的时间间隔
    远远小于几个用户同时操作一个事件的间隔
    换句话说 第一个用户点击按钮,按钮计算编号的时间
    是<<<<<<<< 另外一个用户点击按钮之间的这一段时间
    所以担心是没有必要的,自动编号方法很多也没见过出过错,然而加唯一索引也是必要的
      

  11.   

    关于"wtadminxjeri"给的存储过程
    CREATE PROCEDURE   Sp_bh 
    @table varchar(20)
    AS
    /*
    --------------------------------------------------------
    --返回表的编号,四位流水号
    -------------------------------------------------------
    */
    Declare  @str1 varchar(20),@str2  varchar(20),  @str_ret  varchar(20)
    Declare  @num  intset  @str1=right('00'+ltrim(rtrim(str(month(getdate())))),2)+right('00'+ltrim(rtrim(str(day(getdate())))),2)
    select  @str2=max(编号)  from  @table where 编号 like  @str1+'____'if @str2 is  Null  OR   ltrim(rtrim(@str2))=''  
       set  @str2='0000'set @str2=right(@str2,4)
    set @num=cast(@str2   as  int)
    set @num=@num+1
    set @str2=right('0000'+ltrim(rtrim(cast(@num as varchar(12)))),4)
    set  @str_ret=@str1+@str2select  @str_retGO
    为什么我增加一输入参数@table却通不过语法检查,这是为什么呀?
    提示为“必须增加变量@table"
      

  12.   

    CREATE PROCEDURE   Sp_bh (
    @table varchar(20)  )
    AS
      

  13.   

    我想这样可以,oracle下select decode(MAX(t.glide),
                        null,'0409' || '0001',
                            to_number(t.glide)+1)
    from table1 t
    where substr(t.glide,0,4) like '0409'