本文中引用的技巧来自于wex5.com(

虽然时间有些老,但是非常实用。COPY如下:


1、X5为自动编号提供了一组函数    
     Integer nextSeq(String key); //按照关键字产生一个自动递增的整型序号
    String nextSeqString(String key, String format); //按照关键字和序号格式,产生一个自动递增的组合编号
    Integer tempNextSeq(String key); //按照关键字产生一个临时的递增整型序号
    String tempNextSeqString(String key, String format); //按照关键字和序号格式,产生一个临时的递增组合编号
    String createSerialNumberByCurrentDate(); //产生一个'yyyyMMdd00000'格式的递增组合编号

2、技术实现
    所有自动编号的产生,其实依赖于数据库中的SA_KVSequence这张表,这张表只有两个字段(k-string, v-integer)。


    Integer nextSeq(String key); //按照关键字产生一个自动递增的整型序号
        这个函数会在SA_KVSequence表中创建一行数据k=key、v=1,每次执行v=v+1,获取v做为返回的递增整型序号(1,、2、3、4、...) 
    String nextSeqString(String key, String format); //按照关键字和序号格式,产生一个自动递增的组合编号
        = key + new java.text.DecimalFormat(format).format(nextSeq(key))
        这个函数首先基于nextSeq获取key对应的递增序号,然后进行数字格式化,最后与key组合形成自动递增的组合编号
    Integer tempNextSeq(String key);  //按照关键字产生一个临时的递增整型序号
    String tempNextSeqString(String key, String format); //按照关键字和序号格式,产生一个临时的递增组合编号
        这两个函数的产生规则与前两个基本相同,但是它们并不会真的在SA_KVSequence表中执行v=v+1操作。
        它们只是返回将要产生的下一个序号或编号,但是并不会真的占用这个号。
        这两个函数一般用于严格的不允许断号的应用场景,数据新增时先给用户显示一个将要产生的编号,但是在数据保存时会再用前两个函数生成真实的编号。
        例如:
            假设SA_KVSequence表中 k='AAA'、v=10
            执行nextSeq('AAA') 返回11,并且SA_KVSequence表中 k='AAA'、v=11
            而执行tempNextSeq('AAA') 虽然同样返回11,但是SA_KVSequence表中 k='AAA'、v=10(不变)

    String createSerialNumberByCurrentDate(); //产生一个'yyyyMMdd00000'格式的递增组合编号


  1. public static String createSerialNumberByCurrentDate() {

  2.   String today = new java.text.SimpleDateFormat("yyyyMMdd", java.util.Locale.ENGLISH).format((new java.util.Date()));

  3.   return nextSeqString(today, "00000");

  4. }


3、应用示例
    为概念'OA_LeaveApply'生成自动递增的整型序号
        nextSeq('OA_LeaveApply')


    为请假申请生成单据号,格式为'QJ'+六位递增序号 = QJ000001
        nextSeqString('QJ', '000000')

    为请假申请产生单据号,格式为'QJ'+四位年+两位月+五位递增序号 = QJ20121100001
        nextSeqString(concat('QJ', dateFormat(currentDate(), 'yyyyMM')), '00000')

    为请假申请产生单据号,格式为'QJ-'+机构编码+'-' + 两位年 + 四位递增序号 = QJ-JUSTEP-20120001
        nextSeqString(concat('QJ-', currentOrgCode(), '-', dateFormat(currentDate(), 'yyyy')), '0000')

    为请假申请产生单据号,格式为'QJ-'+四位年+'-'+六位递增序号(序号不分年度)
        concat('QJ-', dateFormat(currentDate(), 'yyyy'), '-', decimalFormat(nextSeq('QJ'), '000000'))