必須要說,SBO在中小型企業ERP軟體中的确是佼佼者,靈活的配置,周延的考慮,不錯的泛型适應性,友好的業務結構跟蹤,強大的二次開發支援,盡管二次開發包幫助檔案中似乎總是欲露還留的那麼一手,讓開發人員無法展開手腳在其之上自如的開發。
不過,據我觀察,SBO也存在着設計上的缺陷--當然也可能是因為本人目前還沒有琢磨透SBO的基礎構架或者設計理念。今天在此向談一談的是SBO在單據對象--即憑證對象上的設計局限。
SBO的單據對象,至少由兩個資料表予以業務支援,一個是我在描述中所謂的資訊表--SBO中稱之為憑證标題,另一個我稱之為單據清單--SBO稱之為憑證行,SBO的稱呼更加合适。當然不同的單據對象在不同的管理方式下可能還存在着不同的業務表單支援,在此不予讨論。
單據資訊表--憑證标題--用于記錄單據發生時候的狀态資訊,同時記錄了這個憑證的業務對象類型,對應的關鍵字段為:objType、docEntry、docNum、docDate,這幾個字段分别是業務類型、憑證内部編号、憑證号碼、憑證日期。盡管每個業務對象對應着不同的資料表,仍然在單據資訊表中通過objType字段指明了業務類型。
單據清單--憑證行--用于記錄了單據發生時單據項目對應的清單資訊,包括項目在單據中所在的位置(LineNum)、項目内容(itemCode, Dscription)、項目發生屬性(Quantity、Price、Currency等),同時指明了項目的業務類型(objType)。考慮到單據之間的互相引用,用baseType、baseEntry、baseNum、baseLinNum分别指明引用項在原業務單據中的屬性即引用業務項目的業務類型、單據内部編号、單據号碼、項目在清單中的行号;同時,單據還用TargetType、TargetEntry指明被引用的目标單據的類型和内部編号。
如果某個單據被另一個單據業務所引用,SBO也預設在資訊表中的備注和Ref1、Ref2字段中指明被引用單據的單據号碼。
這的确是個不錯的設計方案!熟悉算法的朋友們看到這種結構就會馬上聯想到雙向連結清單吧,我曾經在電信97工程--電信營銷系統中采用過類似的方法,我們當時的确稱之謂面向資料表的雙向連結清單,這種設計結構将不同的對象以連結清單的形式連結在一起了。
不過,用雙向連結清單支援的業務總是簡單的,支援更加複雜的多引用業務就會顯得力不從心了。因為這個時候資料關系呈現的是樹形結構。
是的,SBO是這樣的,SBO的單據業務被引用後将導緻被引用單據處于關閉狀态,其它的單據業務對象無法再引用這張單據。無法讓SBO的單據項被引用兩次--特别被不同業務單據引用兩次甚至更多次數,但是,這種業務還是有很多需求的。比如銷售200台電視機,通過三次交貨,每次分别交貨80台、70台、50台,交貨引用這個業務項目的時候,targetEntry到底應該怎麼填寫呢?結果是,或者根本無法實作多次交貨--代客發貨,很普遍的業務呀,或者這個targetEntry沒有了實際意義。這還是同一業務的分次引用,事實上不同業務引用同一個單據項,又是怎樣處理的呢?
不知道SBO到底怎樣處理一個單據項目行被不同業務的多次引用是怎樣處理的,但是通過其資料結構分析,應該很難支援。到底是因為對SBO了解的過于膚淺,還是SBO的設計局限甚至缺陷,在此還是留個問号吧!
本文轉自foresun 51CTO部落格,原文連結:http://blog.51cto.com/foresun/40506,如需轉載請自行聯系原作者