|
本帖最后由 jholy 于 2012-11-29 10:41 编辑
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'格式的递增组合编号
- public static String createSerialNumberByCurrentDate() {
- String today = new java.text.SimpleDateFormat("yyyyMMdd", java.util.Locale.ENGLISH).format((new java.util.Date()));
- return nextSeqString(today, "00000");
- }
复制代码
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'))
没有做不到,只有想不到^_^
|
|