数据保存(六) 序列号

我们经常需要使用递增的序列号,例如合同的编号,公文的编号等。
这些编号需要根据复杂的业务规则递增,并且保证不重。

  • 例1 合同的类型包括销售,采购,人事, 那么自动生成的合同编号是 SL,SU,HR,每个分类每年从1开始递增,跨年后重新开始

2017年的第一个销售合同是 SL2017-1,第二个是SL2017-2。接下来有个采购合同,SU2017-1。
到了2018年,销售合同又变成SL2018-1...

  • 例2 中间需要看到序列号,但可能没有最终生成,所以先不让序列号增长,而最终步骤执行的时候,再确定并增长序列号。

  • 例3 由于有些合同的特殊,需要预留序列号,其他的合同先继续,之后某个特殊合同再占用这个特殊的预留序列号。

下面我们先从最简单的序号讲起。


1.序号递增的简单例子

例如合同编号从1开始递增。

序列号递增:
Sequence.increment("合同编号"),去获取当前的合同编号序列号,并且让这个序列号加1,

序列号获取:
Sequence.get("合同编号"),去获取当前的合同编号序列号,序列号不变。

示例:

  • Sequence.increment("合同编号")
    返回:1
  • Sequence.increment("合同编号")
    返回:2
  • Sequence.increment("劳动协议编号")
    返回: 1
  • Sequence.increment("合同编号)
    返回: 3

序列都有名字,不同名字的序列号的值会独立增长。

  • Sequence.get("合同编号)
    返回: 4 因为上一步是3,并且递增了。

  • Sequence.get("合同编号)
    返回: 4 因为上一步是get

  • Sequence.get("合同编号)
    返回: 4 因为上一步是get

  • Sequence.increment("合同编号)
    返回: 4 因为上一步是get,但获得之后,递增了,下次获得就是5了。

  • Sequence.get("合同编号)
    返回: 5

get和increment都会拿序列的下一个值,但是increment拿完后会给值增加。


2.初始值和增长步伐不是1的序列

有的序列的初始值可能不是1,例如从10000开始,或者递增的步伐不是是按照1递增。

  • Sequence.clear("合同编号")
    没有返回值,清空 合同编号序列,

  • Sequence.clear("劳动协议编号"")
    没有返回值,清空 劳动协议编号,

  • Sequence.increment("劳动协议编号",10000)
    返回: 10000

第二个参数初始值: 如果当前序列没有值,那么从初始值开始,这里初值是10000

  • Sequence.increment("劳动协议编号",10000)
    返回: 10001

  • Sequence.increment("合同编号",99000,10)
    返回:99000.

第二个参数初始值是99000,表示从99000开始递增。
第三个参数递增步伐是10,表示每次增长10.

  • Sequence.increment("合同编号",99000,10)
    返回:99010.

  • Sequence.increment("合同编号",99000,10)
    返回:99020.

  • Sequence.increment("劳动协议编号",10000)
    返回: 10002


3.随年份变化的序列号

例如合同编号每年会自动重新开始。合同编号规则是:HT , 年份,序列号。

合同编号格子填入表达式: "ht"+Date.today().year+"-"+Sequence.increment("合同编号"+Date.today().year)

  • 2007年的时候第一份合同
    返回字符串 ht2007-1

"合同编号"+Date.today().year 计算结果是字符串 合同编号2017合同编号2017 对应的序列号不存在,所以返回1.
"ht"+Date.today().year+"-" ,计算结果是字符串 ht2017-
加起来就得到最终结果 ht2007-1

  • 2007年的时候第二份合同
    返回字符串 ht2007-2

  • 2007年的时候第三份合同
    返回字符串 ht2007-3

  • 2008年的时候第一份合同
    返回字符串 ht2008-1

因为Sequence.increment 的名称参数,在2008年的时候,计算结果是 合同编号2008 ,不存在这个序列( 存在 合同编号2007 的序列),所以返回的序列值是1。


4.随月份,类型等综合变化的序列号

因为序列完全按照名字来划分,如上一讲通过让序列名随着年份变化,我们可以让各年的序列号独立增长。现在我们需要各种独立增长的序列号,也只需要让序列名的变化和业务保持一致就行。

  • 随月份变化的序列值
    只需要在序列名字中传入月份就可以了。
    例如 Sequence.increment("合同月编号"+Date.today.month).

  • 不同合同类型的编号独立递增
    只需要在序列名字中传入合同类型就可以了。
    例如 Sequence.increment("合同类型编号"+it.合同类型).

  • 不同合同类型的编号,每年独立递增
    只需要在序列名字中传入合同类型和年份就可以了。
    例如 Sequence.increment("合同年类型编号"+it.合同类型+"-"+Date.today.year).


5.序列查询,序列增长,保存时序列增长

  1. 问题:
    如果只是查看序列号的话,那么可以通过Sequence.get()函数来获得序列下一个值,但不会增长它。

例如合同新建页面,如果直接在格子里写 =Sequence.increment("合同编号"),那将会导致每次点开合同新建页面,都会导致序列号增长,致使序列号空出来一大串。

如果格子里写 Sequence.get("合同编号"),又会导致保存成功了也不递增,下次新建合同的时候,序列号还是这样。

  1. 解决办法:

格子里写 : "ht"+Sequence.initValue("合同编号")
保存至属性里写 it.合同编号
最后我们发现,多次进入合同编号,序号不会增长,但保存后,序号就增长了。

  1. 如果表单是一系列步骤,只有最后一步才能确定并且保存,那么在中间步骤中直接用get获得值,但并不保存和增长,只有在确定的那一步的表单里,使用initValue实现保存时增长。

6.不用initValue()实现保存时增长的原始办法(可以跳过)

使用initValue的本质是:
进入合同新建页面的时候,使用get函数来获取,而保存的时候使用increment来增长。这是通过之前的服务器端保存来save.serverCalc来实现的。

所以initValue的写法本质上是等同于:

格子里写 : "ht"+Sequence.getValue("合同编号")
保存至属性里写 save.serverCalc(it.合同编号,"ht"+Sequence.increment("合同编号"))

点击翻译,可以看到两种写法生成的更新属性是相同的:


image.png

7.序列号的管理,跳过和补位

系统管理 > 高级管理> 序列号管理。


序列号管理

这里我们可以看到所有的序列号。

  • 名称: 序列号的名称,
  • 值: 序列号的下一个值,//调用Sequence.increment(序列名)后,刷新可以看到值增加了。
  • 空缺: 给特殊场合预留的序列号值。
  • 是否补缺: false :获得序列号的时候获得值,true, 从空缺中获得。

可以点击跳过,跳过一个。跳过的将会成为空缺的列表中的一个。如果设置为补缺状态,那么下一个获取的序列号会是空缺列表的第一个。
也可以直接点击编辑,修改序列号的所有内容(慎用)

你可能感兴趣的:(数据保存(六) 序列号)