數(shù)據(jù)保存(六) 序列號(hào)

我們經(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)樯弦徊绞莋et

  • Sequence.get("合同編號(hào))
    返回: 4 因?yàn)樯弦徊绞莋et

  • Sequence.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)
    返回: 10001

  • Sequence.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-2

  • 2007年的時(shí)候第三份合同
    返回字符串 ht2007-3

  • 2008年的時(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)

  1. 問(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)還是這樣。

  1. 解決辦法:

格子里寫(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)了。

  1. 如果表單是一系列步驟,只有最后一步才能確定并且保存,那么在中間步驟中直接用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ě)法生成的更新屬性是相同的:


image.png

7.序列號(hào)的管理,跳過(guò)和補(bǔ)位

系統(tǒng)管理 > 高級(jí)管理> 序列號(hào)管理。


序列號(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)容(慎用)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容