我們經(jīng)常需要使用遞增的序列號(hào),例如合同的編號(hào),公文的編號(hào)等。
這些編號(hào)需要根據(jù)復(fù)雜的業(yè)務(wù)規(guī)則遞增,并且保證不重。
- 例1 合同的類(lèi)型包括銷(xiāo)售,采購(gòu),人事, 那么自動(dòng)生成的合同編號(hào)是 SL,SU,HR,每個(gè)分類(lèi)每年從1開(kāi)始遞增,跨年后重新開(kāi)始
2017年的第一個(gè)銷(xiāo)售合同是 SL2017-1,第二個(gè)是SL2017-2。接下來(lái)有個(gè)采購(gòu)合同,SU2017-1。
到了2018年,銷(xiāo)售合同又變成SL2018-1...
例2 中間需要看到序列號(hào),但可能沒(méi)有最終生成,所以先不讓序列號(hào)增長(zhǎng),而最終步驟執(zhí)行的時(shí)候,再確定并增長(zhǎng)序列號(hào)。
例3 由于有些合同的特殊,需要預(yù)留序列號(hào),其他的合同先繼續(xù),之后某個(gè)特殊合同再占用這個(gè)特殊的預(yù)留序列號(hào)。
下面我們先從最簡(jiǎn)單的序號(hào)講起。
1.序號(hào)遞增的簡(jiǎn)單例子
例如合同編號(hào)從1開(kāi)始遞增。
序列號(hào)遞增:
Sequence.increment("合同編號(hào)"),去獲取當(dāng)前的合同編號(hào)序列號(hào),并且讓這個(gè)序列號(hào)加1,
序列號(hào)獲?。?br> Sequence.get("合同編號(hào)"),去獲取當(dāng)前的合同編號(hào)序列號(hào),序列號(hào)不變。
示例:
- Sequence.increment("合同編號(hào)")
返回:1 - Sequence.increment("合同編號(hào)")
返回:2 - Sequence.increment("勞動(dòng)協(xié)議編號(hào)")
返回: 1 - Sequence.increment("合同編號(hào))
返回: 3
序列都有名字,不同名字的序列號(hào)的值會(huì)獨(dú)立增長(zhǎng)。
Sequence.get("合同編號(hào))
返回: 4 因?yàn)樯弦徊绞?,并且遞增了。Sequence.get("合同編號(hào))
返回: 4 因?yàn)樯弦徊绞莋etSequence.get("合同編號(hào))
返回: 4 因?yàn)樯弦徊绞莋etSequence.increment("合同編號(hào))
返回: 4 因?yàn)樯弦徊绞莋et,但獲得之后,遞增了,下次獲得就是5了。Sequence.get("合同編號(hào))
返回: 5
get和increment都會(huì)拿序列的下一個(gè)值,但是increment拿完后會(huì)給值增加。
2.初始值和增長(zhǎng)步伐不是1的序列
有的序列的初始值可能不是1,例如從10000開(kāi)始,或者遞增的步伐不是是按照1遞增。
Sequence.clear("合同編號(hào)")
沒(méi)有返回值,清空 合同編號(hào)序列,Sequence.clear("勞動(dòng)協(xié)議編號(hào)"")
沒(méi)有返回值,清空 勞動(dòng)協(xié)議編號(hào),Sequence.increment("勞動(dòng)協(xié)議編號(hào)",10000)
返回: 10000
第二個(gè)參數(shù)初始值: 如果當(dāng)前序列沒(méi)有值,那么從初始值開(kāi)始,這里初值是10000
Sequence.increment("勞動(dòng)協(xié)議編號(hào)",10000)
返回: 10001Sequence.increment("合同編號(hào)",99000,10)
返回:99000.
第二個(gè)參數(shù)初始值是99000,表示從99000開(kāi)始遞增。
第三個(gè)參數(shù)遞增步伐是10,表示每次增長(zhǎng)10.
Sequence.increment("合同編號(hào)",99000,10)
返回:99010.Sequence.increment("合同編號(hào)",99000,10)
返回:99020.Sequence.increment("勞動(dòng)協(xié)議編號(hào)",10000)
返回: 10002
3.隨年份變化的序列號(hào)
例如合同編號(hào)每年會(huì)自動(dòng)重新開(kāi)始。合同編號(hào)規(guī)則是:HT , 年份,序列號(hào)。
合同編號(hào)格子填入表達(dá)式: "ht"+Date.today().year+"-"+Sequence.increment("合同編號(hào)"+Date.today().year)
- 2007年的時(shí)候第一份合同
返回字符串 ht2007-1
"合同編號(hào)"+Date.today().year計(jì)算結(jié)果是字符串 合同編號(hào)2017。合同編號(hào)2017 對(duì)應(yīng)的序列號(hào)不存在,所以返回1.
"ht"+Date.today().year+"-",計(jì)算結(jié)果是字符串 ht2017-
加起來(lái)就得到最終結(jié)果 ht2007-1
2007年的時(shí)候第二份合同
返回字符串 ht2007-22007年的時(shí)候第三份合同
返回字符串 ht2007-32008年的時(shí)候第一份合同
返回字符串 ht2008-1
因?yàn)?code>Sequence.increment 的名稱(chēng)參數(shù),在2008年的時(shí)候,計(jì)算結(jié)果是 合同編號(hào)2008 ,不存在這個(gè)序列( 存在 合同編號(hào)2007 的序列),所以返回的序列值是1。
4.隨月份,類(lèi)型等綜合變化的序列號(hào)
因?yàn)樾蛄型耆凑彰謥?lái)劃分,如上一講通過(guò)讓序列名隨著年份變化,我們可以讓各年的序列號(hào)獨(dú)立增長(zhǎng)?,F(xiàn)在我們需要各種獨(dú)立增長(zhǎng)的序列號(hào),也只需要讓序列名的變化和業(yè)務(wù)保持一致就行。
隨月份變化的序列值
只需要在序列名字中傳入月份就可以了。
例如 Sequence.increment("合同月編號(hào)"+Date.today.month).不同合同類(lèi)型的編號(hào)獨(dú)立遞增
只需要在序列名字中傳入合同類(lèi)型就可以了。
例如 Sequence.increment("合同類(lèi)型編號(hào)"+it.合同類(lèi)型).不同合同類(lèi)型的編號(hào),每年獨(dú)立遞增
只需要在序列名字中傳入合同類(lèi)型和年份就可以了。
例如 Sequence.increment("合同年類(lèi)型編號(hào)"+it.合同類(lèi)型+"-"+Date.today.year).
5.序列查詢(xún),序列增長(zhǎng),保存時(shí)序列增長(zhǎng)
- 問(wèn)題:
如果只是查看序列號(hào)的話,那么可以通過(guò)Sequence.get()函數(shù)來(lái)獲得序列下一個(gè)值,但不會(huì)增長(zhǎng)它。
例如合同新建頁(yè)面,如果直接在格子里寫(xiě) =Sequence.increment("合同編號(hào)"),那將會(huì)導(dǎo)致每次點(diǎn)開(kāi)合同新建頁(yè)面,都會(huì)導(dǎo)致序列號(hào)增長(zhǎng),致使序列號(hào)空出來(lái)一大串。
如果格子里寫(xiě) Sequence.get("合同編號(hào)"),又會(huì)導(dǎo)致保存成功了也不遞增,下次新建合同的時(shí)候,序列號(hào)還是這樣。
- 解決辦法:
格子里寫(xiě) : "ht"+Sequence.initValue("合同編號(hào)"),
保存至屬性里寫(xiě) it.合同編號(hào)
最后我們發(fā)現(xiàn),多次進(jìn)入合同編號(hào),序號(hào)不會(huì)增長(zhǎng),但保存后,序號(hào)就增長(zhǎng)了。
- 如果表單是一系列步驟,只有最后一步才能確定并且保存,那么在中間步驟中直接用get獲得值,但并不保存和增長(zhǎng),只有在確定的那一步的表單里,使用initValue實(shí)現(xiàn)保存時(shí)增長(zhǎng)。
6.不用initValue()實(shí)現(xiàn)保存時(shí)增長(zhǎng)的原始辦法(可以跳過(guò))
使用initValue的本質(zhì)是:
進(jìn)入合同新建頁(yè)面的時(shí)候,使用get函數(shù)來(lái)獲取,而保存的時(shí)候使用increment來(lái)增長(zhǎng)。這是通過(guò)之前的服務(wù)器端保存來(lái)save.serverCalc來(lái)實(shí)現(xiàn)的。
所以initValue的寫(xiě)法本質(zhì)上是等同于:
格子里寫(xiě) : "ht"+Sequence.getValue("合同編號(hào)"),
保存至屬性里寫(xiě) save.serverCalc(it.合同編號(hào),"ht"+Sequence.increment("合同編號(hào)"))
點(diǎn)擊翻譯,可以看到兩種寫(xiě)法生成的更新屬性是相同的:

7.序列號(hào)的管理,跳過(guò)和補(bǔ)位
系統(tǒng)管理 > 高級(jí)管理> 序列號(hào)管理。

這里我們可以看到所有的序列號(hào)。
- 名稱(chēng): 序列號(hào)的名稱(chēng),
- 值: 序列號(hào)的下一個(gè)值,//調(diào)用Sequence.increment(序列名)后,刷新可以看到值增加了。
- 空缺: 給特殊場(chǎng)合預(yù)留的序列號(hào)值。
- 是否補(bǔ)缺: false :獲得序列號(hào)的時(shí)候獲得值,true, 從空缺中獲得。
可以點(diǎn)擊跳過(guò),跳過(guò)一個(gè)。跳過(guò)的將會(huì)成為空缺的列表中的一個(gè)。如果設(shè)置為補(bǔ)缺狀態(tài),那么下一個(gè)獲取的序列號(hào)會(huì)是空缺列表的第一個(gè)。
也可以直接點(diǎn)擊編輯,修改序列號(hào)的所有內(nèi)容(慎用)