[摘 要] 本文針對現行紡織行業ERP存在的通用性不強#65380;靈活性差等缺陷,以生產質量管理子系統為例論證了紡織行業ERP用戶二次開發的必要性,行業提出了一套二次開發組件模型,并就該組件在PowerBuiler + SQL Server環境下的物理實現以及具體應用作了初步探討,為實現紡織行業ERP流程自定義提供了一種簡單可行的思路#65377;
[關鍵詞] 紡織ERP;二次開發;模型構建;流程自定義
[中圖分類號]F270.7[文獻標識碼]A[文章編號]1673-0194(2009)03-0057-05
隨著中國加入WTO和世界經濟一體化,企業所處商業環境正發生著深刻的變化,企業信息系統也正面臨著前所未有的挑戰#65377;ERP(企業資源計劃)由于能夠有效地整合企業內部和外部資源,已經成為許多現代企業普遍采用的信息系統#65377;ERP在中國推行多年,真正成功的案例卻比較少#65377;其中深層次的原因是國內外企業在管理理念和業務流程之間存在顯著的差異#65377;要解決這個問題不僅要求導入企業對內部管理和流程進行規范,更要求ERP軟件能夠保持充分的靈活性#65377;一種有效的方法就是系統提供用戶二次開發的平臺,即通過各種二次開發工具對ERP中的一些基本構件和通用模塊進行重組或者擴充,從而實現自定義業務流程的功能#65377;
1 紡織行業ERP應用現狀及二次開發需求
紡織行業屬于我國傳統制造業,具有多工序#65380;連續化#65380;大量生產能力強和勞動密集程度高#65380;市場流行期短等顯著特點#65377;當前,我國許多紡織企業都實施了ERP項目,并取得了一定的管理效益和經濟效益#65377;但仔細研究不難發現,目前實施ERP的大型紡織企業中,應用較多集中在進#65380;銷#65380;存等企業經營管理的外圍環節,而對于ERP核心部分的生產質量管理#65380;工藝管理等子系統要么空白,要么難以推廣#65377;究其原因:一方面是由于開發人員對紡織行業的流程缺乏深入的理解;另一方面是由于當下的ERP軟件缺乏動態擴展性,通用性太差#65377;
對于紡織行業來講,由于生產工序繁多,數據采集量異常龐大,生產質量控制#65380;工藝管理一直是紡織行業ERP的重點和難點#65377;FAM體系結構提出,紡織企業的數據采集點從上至下可以分為企業#65380;工廠#65380;分廠#65380;單元#65380;工作站和設備6個層次#65377;除了設備級,每級都是若干個下級的集合#65377;在此層次結構中,每一層都可以作為數據采集點,各層數據的屬性不盡相同#65377;如停臺時間#65380;棉結數等指標屬于設備級,而溫度#65380;濕度#65380;電能耗費率則屬于單元級#65377;由于采集層次較多,每道工序生產質量指標繁多并且處于不斷擴充中,對于單個紡織企業來講,各自關注的產品質量指標體系很可能不一致,這就造成了許多ERP軟件通用性較差的現象#65377;要解決這些問題,最有效的方法就是讓用戶方自行進行二次開發#65377;這里的二次開發不僅是指軟件界面風格#65380;顯示格式可由用戶自行修改,而是指基本的數據項目#65380;數據處理邏輯以及數據報表的內容均可由高級用戶自行擴充或刪減,從而實現真正意義上的“業務流程自定義”
實踐證明,任何一種ERP軟件要想獲得成功,不提供二次開發的平臺幾乎是不可能的#65377;具體來講,二次開發對ERP的意義主要有以下幾點:
(1)大大簡化系統開發方的工作,使得開發方把大部分精力用于系統整體架構的建設#65380;主流業務流程的研究以及模型庫#65380;中間件的不斷完善,從根本上提升ERP軟件的質量#65377;
(2)開發方把一些非主流業務流程的定義和功能模塊的開發工作放手給用戶,提高了用戶的業務理解能力和程序開發水平#65377;另外,二次開發可以增加用戶對系統建設的參與程度,激發用戶的主動性,有利于以后的系統維護#65377;
(3)最重要的一點是, 二次開發使得ERP軟件在面對企業業務流程或組織結構的變化時能作出快速響應,提高了ERP軟件的柔性程度#65377;
2 二次開發的實質及適用條件
從信息系統的軟件結構來看,信息系統是建立在公用數據庫#65380;子系統專用數據庫#65380;程序設計語言工具模型庫基礎之上的各種業務功能的總和(見圖1)#65377;

在傳統的信息系統中,只有第四層功能業務層是面向用戶的#65377;而數據如何進行處理以及報表內容如何組織由第三層模型庫完成,對用戶來講是非透明的#65377;二次開發實際就是向高級用戶開放部分模型庫和函數庫,當企業的業務流程發生變化時由用戶利用二次開發組件對功能業務層中的基礎數據項#65380;處理單據和報表進行修改來適應變化,也即把第三層和第二層的部分功能向用戶開放#65377;
值得注意的是,并非所有ERP模塊都適合于二次開發#65377;一般來講,一個系統中子模塊之間的連接方式有兩種,即串聯和并聯#65377;串聯方式中高層構件表現為一系列低層構件的順序處理, 輸入為某低層構件的輸入, 經過其他低層構件的串行處理, 輸出為最后的構件的輸出#65377;而并聯方式中高層構件對低層構件沒有特別的處理, 僅僅是對低層模塊功能的聚集#65377;這時,構件的輸入是所有低層模塊的輸入, 輸出為所有低層模塊輸出的集合,如質量管理子系統#65377;產品質量項目繁多,但各項質量數據具有趨同性,數據的采集和處理方式在本質上區別不大,均可以通過報表#65380;直方圖#65380;折線圖等相同方式顯示給使用者#65377;適合于二次開發的系統在連接方式上應為并聯方式#65377;
3 二次開發體系結構模型簡介
本文所介紹的二次開發工具是由一系列基本組件構成#65377;筆者在多年從事紡織行業ERP開發實踐中,摸索出一套基于PB + SQL Server環境下的二次開發組件模型#65377;根據管理信息系統的傳統理論,任何業務流程都可抽象為幾個功能模塊的整合,而功能模塊是由輸入功能(單據)#65380;處理功能(函數)和輸出功能(查詢或報表)組成#65377;筆者開發了三類二次開發組件,即:自定義函數#65380;自定義單據和自定義報表#65377;它們之間構成層次關系,如圖2所示#65377;

3. 1自定義函數
該組件是二次開發的最基本組件#65377;它直接同底層數據庫相連接,主要是對處理邏輯的定義#65377;理論上可以利用該工具取得數據庫中的任何數據,應用于任何子系統,因而它屬于軟件結構中的公共模型庫#65377;自定義函數本身是一個附加功能,它不能獨立成為一個功能模塊,必須與自定義單據#65380;自定義報表結合起來使用#65377;自定義函數中處理過程的定義是核心步驟,可以采用兩種形式:Select SQL語句和存儲過程#65377;由于自定義函數只能夠返回一個值而不是一個數據集合,因而它經常被適用于自定義單據中某個數據項的計算公式或者自定義查詢#65380;報表中某項動態內容的生成#65377;
3. 2自定義單據
自定義單據分散在生產質量管理#65380;工藝管理等各個子系統中#65377;分為項目定義和數據輸入兩個部分#65377;前者實現了該子系統中各輸入模塊和處理邏輯的定義,真正實現了“業務流程自定義”,是二次開發的核心內容#65377;該組件中主要進行構成業務流的每個輸入數據項屬性的定義,如名稱#65380;類型#65380;統計方式#65380;計算公式等#65377;值得注意的是,此處的“計算公式”中不僅可使用本張輸入單據中的數據項,更可以通過調用“自定義函數”的功能取得本系統其他模塊中的任何一項數據,這是本組件與其他大多數信息系統相比的一大優勢,大大擴展了組件的取數功能,提高了流程定義的靈活性#65377;而后者根據前面的定義自動生成輸入界面進行數據錄入或采集#65377;
3. 3自定義報表
該組件使用的好壞是二次開發的成果是否被管理層認可的關鍵,因為管理層往往是通過系統輸出信息量的多少以及輸出信息的格式來判斷一個系統是否成功#65377;本組件主要提供了以下兩種形式的自定義報表:
3. 3. 1各子系統的自定義報表和圖表
該類報表的數據源可以是本子系統中的任何自定義單據#65377;在使用自定義報表時應該首先定義一個報表模板,隨后組件自動提供所有自定義單據的所有數據項,由二次開發人員在其中進行模板內容的選擇#65377;報表顯示的內容來源于模板上定義的數據項以及其他一些必要的篩選條件(如日期范圍等)#65377;自定義圖表的使用除了選擇數據項之外,還要定義報表的形式(直方圖#65380;折線圖等)以及縱坐標#65380;橫坐標的內容等#65377;
由于該類報表的數據均來自于自定義單據組件,不能獨立取數,因而不能夠使用自定義函數功能#65377;
3. 3. 2Formula 1 綜合自定義報表
Formula 1是一種外嵌OLE表格式插件,在使用前必須先進行安裝#65377;Formula 1 無論從界面樣式還是內部功能都與Mircrosoft Excel極其相似,但它的可編程性卻是Excel所無法比擬的,許多普通編程工具(如PB,VB,VC)等都提供了與該組件的接口,可以方便地使用該控件的屬性和方法進行數據的顯示和編輯#65377;使用Formula 1 綜合自定義報表進行二次開發時,需要二次開發者了解數據庫的內部結構,使用SQL語句#65380;存儲過程取得結果集并指明報表中需要顯示的字段定義,也可以使用自定義函數功能直接取得任何子系統中的單項數據#65377;這種自定義的報表靈活性最大,但對二次開發用戶的技術要求也最高#65377;
4 二次開發體系結構模型的實現與應用
以上所介紹二次開發組件全部是基于Windows圖形界面環境,采用Powerbuilder 7.0 + SQL Server 2000技術開發而成#65377;Powerbuilder 是Sybase公司推出的一款優秀的應用程序開發工具,雖然界面設計的功能較弱,但其獨特的Datawindow技術使其在開發數據庫應用程序時與其他工具相比具有無可比擬的優勢#65377;SQL Server 2000更是現代許多企業信息化首選的分布式關系數據庫#65377;以下簡單介紹二次開發組件模型的物理實現及簡單應用#65377;
4. 1自定義函數的實現與應用
該模塊是由兩張二維表實現#65377;主表func保存函數名稱#65380;處理過程(sqlsyntax)等內容,而函數參數的詳細信息則在明細表funcparm上,包括參數序號#65380;參數名稱#65380;參數類型等#65377;
如要定義一個自定義函數uf_getsdczl,功能為取得織造工序某機臺某天某班次的下機總數(下機產量數據存儲于關聯表zzdj48和zzdjmx48),過程如圖3所示#65377;

從以上定義可看出,函數處理(sqlsyntax)本質上是用SQL語言或存儲過程實現的,因而自定義函數的二次開發人員應該具備一定的SQL基礎#65377;
4. 2自定義單據的實現與應用
以織部質量管理子系統的設備級單據為例,第一部分定義的所有項目屬性全部保存在二維表zbzlxmmx中#65377;在某類單據項目定義完成時,PB窗體調用“Create table”或者“Alter Table”動態SQL語句生成新的二維表來存儲該類單據的所有數據,表名稱為:zl+ 部門代碼+ 工序代碼 + 單據代碼,如zl1011090(該二維表中還保存了一些固定字段,如sd_id(車號)#65380;gx_code(工序)等)#65377;因而此處每類產品質量單據即對應一張二維表#65377;業務邏輯和物理結構對應關系如圖4所示#65377;

在數據輸入界面的實現中,最關鍵的是自動計算各個字段在界面上的位置以及公式字段的自動取數#65377;對于第一個問題,可以設定界面上每排排放的項目數以及該項目的顯示序號計算其絕對坐標#65377;而后一個問題的解決比較復雜,對于含有自定義函數公式uf_的字段,需要用循環替換的思想把形式參數全部替換成實際參數,再調用該函數sqlsyntax字段中定義的SQL語句或存儲過程進行計算;對于普通公式項目則直接用Datawindow自動創建動態Compute字段進行計算即可#65377;一些關鍵代碼如下:
if pos(ls_module,'[f]') > 0 then
ls_tags = ls_tags + ','
do while pos(ls_tags,',') > 0
ld_value = dw_destination.getitemnumber(row,ls_tag) //取得每個參數的實際值
ls_module = f_stringreplace(ls_module,ls_tag, string(ld_value)) //循環參數替換
ls_returnval=wf_expressiontovalue('101',1,ls_module)//靜態表達式求值
dw_destination.setitem(row,ls_setname,round(dec(ls_returnvalue),4))//賦值
loop
else
ld_value = dw_destination.getitemnumber(row,'compute_' + ls_setname)
dw_destination.setitem(row,ls_setname,string(ld_
value))
end if
例如,要定義一張設備級數據采集單據,名為“坯布物理指標”, 包括棉結總數#65380;單位棉結數#65380;經密#65380;緯密#65380;筘幅#65380;經強#65380;緯強等質量項目#65377;其中單位棉結數為棉結總數除以產量數,緯密為經密的1.1倍,定義過程如圖5所示#65377;
由于計算單位棉結數需要用到總產量,而該數據不在本單據中,因而必須要使用自定義函數#65377;而形成的動態錄入單據界面見圖6#65377;

其中紅色部分(緯密#65380;單位棉結數)表示計算字段,在完成其他項目數據輸入后其值被自動計算出,因而不能被編輯#65377;
4. 3自定義報表的實現與應用
此處僅介紹第一類自定義報表的物理實現#65377;
報表模板用二維表zlrptmodel進行存儲,該表的主要字段有name(項目名)#65380;tj_mode(統計方式)#65380;table(數據來源二維表)#65377;數據項可能來自同一個二維表,也可能來自不同的二維表,而且每個數據的取數方式也不一樣(有的是平均,有的是加總),因而必須建立一個臨時表zbzl_rpt1,然后對報表模板中的數據項逐個取數后放進臨時表#65377;最后基于該臨時表做一個datawindow即可#65377;
該處的難點是每個項目取數的動態SQL語句的形成#65377;關鍵代碼如下:
ls_sql = \"insert into zbzl_rpt1(zllb_code,xm_code, xm, djy_date,jh_no, sjcs)\" +
\"select b.zllb_code,\" + ls_data + \",b.xm_name,right(a.djy_date,8),'\" + ls_jhno + \"convert(numeric(18,2),\" + ls_valuechar +\")\"
+ \" from \" + ls_table1 + \" a,zbzlxmmx b\"
+ \" where b.xh = \" + string(ll_xh) + \" and a.djy_date between ?蓯
+ ls_date1 + \"and ?蓯 + ls_date2 + \"'” + ……
execute immediate:ls_sql;
而對于自定義圖表的實現,同樣也要定義一個二維表zlgraphmodel來存儲模板內容,在圖表生成時,只要根據zlgraphmodel中的內容修改datawindow中graph對象的某些屬性即可#65377;具體代碼省略#65377;
例如,要求把“坯布物理指標”中定義的質量項目都統計在一張質量報表上,并且把“單位棉結數”這一指標做成折線圖,組件使用過程如圖7所示#65377;

5 結束語
用戶方二次開發是一套ERP軟件能否適應環境變化的關鍵所在#65377;本文所介紹的二次開發組件界面簡單,操作流程清晰,信息資源共享性和可擴展性能均良好,可以方便地實現基于平行方式的質量管理#65380;工藝管理等底層業務流程的自定義構建#65377;目前該套組件已經實施于無錫#65380;丹陽#65380;金華等一些紡織企業單位,收到了良好的效果#65377;
主要參考文獻
[1] 李遷,葛世倫,等. 基于控制點模型的紡織企業生產數據的采集[J]. 紡織學報,2007(3):111-114.
[2] 任明侖,朱衛東,等. 基于構件的信息系統體系結構模型[J]. 小型微型計算機系統,2004(7):1159-1161.
[3] 顏承元. 基于B/S模式的紡織企業生產經營管理信息系統的設計[J]. 毛紡科技,2007(9):58-60.
[4] 許敏. 企業ERP系統二次開發問題研究[J]. 集團經濟研究,2007(18):10-12.
[5] 吳士亮,薛恒新. 紡織企業信息化若干關鍵問題研究[J]. 科學學與科學技術管理,2004(11):106-108.