Genexus 如何實現獲得數據庫表中的最大值及多用戶的控制(z)

例子:我們新增物資內容後,保存到數據庫中,系統需要保存一個唯一的記錄流水號。
我們設計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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章