0 引言
訂單驅(qū)動的中小型制造企業(yè)之間的競爭的主要目標就是獲取訂單,但是接到訂單對于本企業(yè)的整個供應鏈來說只是一個開始,所有的后續(xù)生產(chǎn)工作都是圍繞訂單為主線來展開,其大致過程如下:企業(yè)在接到訂單后就要根據(jù)訂單上所列出的客戶所需要的產(chǎn)品明細和數(shù)量,并參照產(chǎn)品的物料清單(bill of material,BOM)來決定需要生產(chǎn)和采購哪些零配件和部件,再結(jié)合產(chǎn)品和零部件庫存數(shù)量就可以確定每個零部件需要生產(chǎn)或是采購多少個。所以BOM是中小型制造企業(yè)生產(chǎn)過程的基礎,由于ERP軟件所實現(xiàn)的也正是這樣的一個生產(chǎn)管理過程,所以BOM也就成為制造企業(yè)實施ERP的基礎數(shù)據(jù)之一。BOM 表達的是每一個產(chǎn)品由哪些零部件組成,每一個部件是由哪些零部件組成。由此可以知道,BOM的表達是一個遞歸的過程,如果要明確地想知道每一個產(chǎn)品是由哪些零配件組成,就要將BOM逐層展開,直到最下層的全部是零配件,沒有部件為止,這樣整個產(chǎn)品的樹狀結(jié)構(gòu)就完全顯現(xiàn)出來。
作者在為廣東省某衛(wèi)浴企業(yè)以JSP為技術(shù)手段開發(fā)瀏覽器/Web服務器/數(shù)據(jù)庫服務器(B/W/D)3層結(jié)構(gòu)ERP的過程中,實現(xiàn)了在JSP客戶端網(wǎng)頁上BOM的逐層顯示與隱藏,使BOM的編輯與查詢非常直觀方便。
1 BOM信息的結(jié)構(gòu)
BOM表達的是產(chǎn)品與零部件之間的關(guān)系,具體內(nèi)容包括一個產(chǎn)品是由哪幾個零件或是部件組成,每個零部件又在這個產(chǎn)品中需要幾個。而在實際應用中,還要根據(jù)工廠的具體情況加上這個零件或是部件的加工方式(生產(chǎn)/外購)信息和備注信息。由于產(chǎn)品和配件都有可能有重復的名字,所以對產(chǎn)品和配件都進行了編號,具體每個產(chǎn)品和配件的其它信息要到產(chǎn)品表和配件表中進行查詢得到。所以,整個BOM表的實體屬性圖及其與產(chǎn)品表與配件表的關(guān)系如圖1所示。
由于最終顯示到瀏覽器上的BOM信息是由BOM表、產(chǎn)品表和配件表中聯(lián)合查到的,所以在顯示BOM信息之前,要將BOM信息、產(chǎn)品信息和配件信息統(tǒng)一到一個數(shù)據(jù)結(jié)構(gòu)中,這一數(shù)據(jù)結(jié)構(gòu)包括的具體字段為:零部件編號、零件/部件、零部件數(shù)目、生產(chǎn)/外購、零部件類型、零部件名稱、規(guī)格型號。在每一條記錄中還要記載有沒下一級BOM信息,所以還要有一個“是否有下一級”的信息。由于BOM是一種樹狀結(jié)構(gòu)的數(shù)據(jù)結(jié)構(gòu),所以還要明確知道每一條記錄屬于哪一級,所以還要有一個“屬于哪一級”的信息。整體結(jié)構(gòu)如圖2所示。
2 JSP中實現(xiàn)客戶端動態(tài)顯示與隱藏功能的技術(shù)路線
使用JSP (Javas ervERP age)實現(xiàn)的B/W/D結(jié)構(gòu)的優(yōu)點是操作方便,運行效率高。JSP是使用Java實現(xiàn)的動態(tài)網(wǎng)頁,其動態(tài)性主要表現(xiàn)在同一個網(wǎng)頁在輸入不同的參數(shù)后,Java程序能根據(jù)輸入?yún)?shù)去查詢數(shù)據(jù)庫從而顯示出不同的內(nèi)容,這是與傳統(tǒng)的靜態(tài)網(wǎng)頁的不同之處!但是顯示到瀏覽器的網(wǎng)頁其實也是一個靜態(tài)的網(wǎng)頁,要實現(xiàn)靜態(tài)網(wǎng)頁與用戶的互動,只能通過客戶端腳本語言JavaScript與HTML相結(jié)合來進行。
2.1 客戶端動態(tài)顯示與隱藏
HTML中的DIV標簽用來標記某一塊獨立的信息單元,將這個DIV標簽的style屬性設置為displaymone時,DIV所包含的內(nèi)容可以實現(xiàn)隱藏;當將這個DIV標簽的style屬性設置為display:時,DIV所包含的內(nèi)容就可以顯示出來。由于DIV是一個HTML標簽,所以可以使用客戶端腳本語言JavaScript來控制DIV標簽的style屬性值,達到客戶端信息的動態(tài)顯示與隱藏的目的。
對于需要逐層顯示與隱藏的BOM來說中,要求BOM信息按照顯示的順序在網(wǎng)頁上排列好,這樣才能通過DIV來控制上層信息對下層信息的顯示與隱藏,事實上BOM信息的顯示與隱藏并不改變BOM信息在網(wǎng)頁上的實際排列。如某行顯示的是一個部件,那么其下一行開始顯示的信息是在BOM中將這個部件當成一個產(chǎn)品來所查得的部件BOM信息,而上一層的BOM數(shù)據(jù)就要順序后移。
2.2 Java中的數(shù)據(jù)訪問與集合技術(shù)的結(jié)合
使用JSP技術(shù)通過Java代碼來實現(xiàn)數(shù)據(jù)庫的存取,并返回一個ResultSet類型的結(jié)果集對象。因為ResultSet數(shù)據(jù)集中的數(shù)據(jù)是一次查詢的結(jié)果。而查得的下層BOM信息有可能插入到上層BOM信息中間,所以BOM信息在Web服務器端的臨時存貯就不能以一個ResultSet數(shù)據(jù)集來完成,解決這個問題的辦法就是要將每次查詢得到的結(jié)果集數(shù)據(jù)按照要顯示的順序放到一個動態(tài)數(shù)組中。
在Java2中的Vector類可以支持動態(tài)數(shù)組,并且可以將不同類型的對象(當然相同類型的對象更沒有問題)引用到Vector類的對象中去。Vector引用的對象存儲的是一條條BOM 信息,而不是一個個的ResultSet數(shù)據(jù)集,所以在構(gòu)建Vector對象時就必須對每一次查詢得到的ResultSet數(shù)據(jù)集中的BOM信息進行重新處理,使數(shù)據(jù)集中的BOM信息能夠按照要顯示的1頃序在Vector對象中排列好。這是一個先序遍歷過程,具體操作過程流程如圖3所示。
網(wǎng)頁上顯示的是Vector對象中的一條條BOM信息,由于這些信息已經(jīng)在Vector對象中按照相互的從屬關(guān)系排列好,所以只要完全按照Vector中的順序顯示出來后,這些BOM信息之間的相互關(guān)系就可以正確顯示出來,通過BOM信息中的“屬于哪一級”信息,保證每一個層次的BOM信息都屬于同一個DIV。通過“是否有下一級”就可以確定層與層之間的相互關(guān)系。
所以如果某一層DIV可見,則該層BOM能顯示,如果該層DIV不可見,則該層BOM就隱藏。結(jié)合JSP中的集合技術(shù)、HTML中的DIV及Javascript代碼實現(xiàn)了BOM在客戶端的動態(tài)顯示與隱藏。
3 結(jié)束語
通過一次先序遍歷就可以將一個樹狀結(jié)構(gòu)的產(chǎn)品BOM信息從數(shù)據(jù)庫中提取出來(實際的實現(xiàn)中是通過多次數(shù)據(jù)庫表的查詢來完成),并按照需要顯示的順序存儲到Vector對象的引用中。在網(wǎng)頁上通過使用JavaScript來控制DIV標簽的style屬性的設置,就可以控制DIV標簽的顯示與隱藏,從而做出動態(tài)逐層顯示與隱藏BOM信息的網(wǎng)頁效果,有利于有效利用網(wǎng)頁空間來顯示BOM的樹狀信息。
轉(zhuǎn)載請注明出處:拓步ERP資訊網(wǎng)http://www.ezxoed.cn/
本文標題:JSP中BOM動態(tài)顯示與隱藏的關(guān)鍵技術(shù)
本文網(wǎng)址:http://www.ezxoed.cn/html/support/1112153407.html