数据保存(六) 序列号

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

  • 例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, 从空缺中获得。

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

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 220,884评论 6 513
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,212评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 167,351评论 0 360
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,412评论 1 294
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,438评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,127评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,714评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,636评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,173评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,264评论 3 339
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,402评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 36,073评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,763评论 3 332
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,253评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,382评论 1 271
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,749评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,403评论 2 358