用Java语言编写一个方法,这个方法用来生成入库单编号
入库单编号格式为:KM20100926001分三部分:第一部分是KM为开头标记
第二部分是当天日期
第三部分是001开头,按顺序往下排,比如002、003...我数据库有入库单编号demoId这个字段。麻烦各位高手了!

解决方案 »

  1.   

    先查询demoId,如果没有数据,字符串拼接产生KM20100926001,
    如果有数据,则select max(demoId) from table,得到最大的Id后截取后3位转成int,加1,再字符串拼接产生KMyyyyMMdd,加上整型....OK~
      

  2.   


    对对对...我赞同,还是要看LZ具体的需求了,但是无论怎样都是字符串操作...LZ多思考思考就行了...
      

  3.   

    使用数据库的  sequence 序列
      

  4.   

    我用的是Sql server 2000数据库啊
      

  5.   

    先查询demoId,如果没有数据,字符串拼接产生KM20100926001,
    如果有数据,则select max(demoId) from table where demoId like ‘%yyyyMMdd%’,
    得到最大的Id后截取后3位转成int,加1,再字符串拼接产生KMyyyyMMdd,
     
    不够三位前面补00的方法
    String str ="00"+num;
    str.subString(str.length-3);
      

  6.   

    上面三位前面补0写错了,是 str ="000"+num   ;
      

  7.   

    结贴给分。如下… public static String testRandomCode() {
    String value = "KM";
    SimpleDateFormat dateFm = new SimpleDateFormat("yyMMddHHmmss");
    String dateTime = dateFm.format(new java.util.Date());
    value += dateTime;//这部分产生前面字符串
    //应该要有个时间的字段(插入记录的时间,因为要统计这单是今天的第几单了)createTime
    //我假设操作这个表的方法封装在CodeDao里面
    CodeDao codeDao = new CodeDaoImpl();//或者你是用spring的IOC注入就不是这么写,我想你懂的
    //codeDao.getCreateTimeCount这个办法是封装“select count(*) from 表 where createTime = getdate()”
    codeDao.getCreateTimeCount
    if(codeDao.getCreateTimeCount!=0)
    Integer num = getCreateTimeCount + 1;
    String num_ = num.toString();
    value += joint(num_,'0',false,3);
    return value;
    }

    //自己做项目用的一个方法,用于拼接的,第一个参数是源字符串,第二个参数是需要补的字符,第三个是补在哪一边,第四个是补完总长度是多少
    //比方说joint("asdf",'0',false,10)的返回值就是000000asdf
    public static String joint(String string, Character letter, boolean rightSide, int totalLength) {
    if (string.length() >= totalLength) {
    return string;
    }
    int range = totalLength - string.length();
    String temp = "";
    for (int i = 0; i < range; i++) {
    temp += letter;
    }
    return rightSide == true ? string + temp : temp + string;
    }
      

  8.   

    楼上的方法基本都有问题(除了6楼),因为我没看见“同步”关键字。怎样保证select max(demoId)得到的结果就是max的demoId?2个问题:
    1. demoId是字符串,里面包含不固定的日期,无法取max。当然这个是小问题,可以用函数取max(最后3位),也可以在表中加个sequence字段(类似ID列)解决,取max(sequence)取代max(demoId)。
    2. 关键:如果查询出来003最大,你就生成004?如果这时候其它操作已经插入004了呢?就出现重复编号了。正确方法是:
    1. 能用数据库的sequence就用它,如6L所说。
    2. 用代码模拟sequence。        private static long INIT_SEQ = 0l;
            //这个就是用于生成编号的sequence
            private static long seq = INIT_SEQ;
            /**
     * 获取sequence。
     */
    public synchronized static long getSeq() {
    if (seq == INIT_SEQ) {
    seq = getSequence();//此方法从数据库中获取当前最大的seq,系统启动后的第一次会去取,只有就不会再用了。
    }
    return ++_seq;
    }
    由于方法是同步的,所以不会出现重复。