例子:我們新增物資內容後,保存到數據庫中,系統需要保存一個唯一的記錄流水號。
我們設計Trn如下
TrnPrd
( * PrdID N(8.0)
PrdCod V(40)
PrdNam V(40)
PrdCom V(40)
PrdNum V(40)
)
我們可以設計 PrdID爲主鍵 , 並且 設置 PrdID 的 autonumber = true ,step = 1,即prdId是自增類型
這樣 我們新增記錄時,就不需考慮PrdID
PrcInsPrd:
New
PrdCod = &PrdCod
PrdName = &PrdName
..................
EndNew
保存時,oracle數據庫會自動寫上prdid。
這樣有好處,也有很不好,就是我們不能很有效的控制prdid。比如說表trnprd導出到備份後,還原數據時,prdid都已經變了,就是說關鍵字都變了,但是具體的內容沒有變,這個對這個表有對應關係的話,就可以就不正確了,因爲原來的主鍵都變了。
所以我們一般不把prdid設爲 autonumber
這樣的話,我們就需要手工得到prdid的最大值
prcgetMaxPrdID:
Rules:Pram(out:&MaxPrdID);
Source:
for each (PrdID)
&MaxPrdID = PrdID + 1
exit
when none
&MaxPrdID = 1
endfor
PrcInsPrd:
New
PrdID = PprcGetMaxPrdID.Udp()//得到最大值
PrdName = &PrdName
..........
EndNew
這樣就可以了,但是很多人問我,如果客戶端都同時得到相同的最大值,那保存後會出現什麼情況呢?
這個情況在多用戶系統中是很常見的。出現這個情況,肯定時誰最先提交到數據庫,誰就保存成功,否則就不能保存,因爲數據庫中已經存在相同的prdid了。
爲了解決這個問題,我們一般是這個處理的
PrcInPrd:
do ‘NewARecord’
Sub 'NewARecord'
New
PrdID = PprcGetMaxPrdID.Udp()//得到最大值
PrdName = &PrdName
..........
when duplicate//當重複時,再次做New操作,直到不能重複爲止,這個地方很關鍵哦
do ‘NewARecord’
EndNew
EndSub