[摘 要] 本文針對現(xiàn)行紡織行業(yè)ERP存在的通用性不強#65380;靈活性差等缺陷,以生產(chǎn)質(zhì)量管理子系統(tǒng)為例論證了紡織行業(yè)ERP用戶二次開發(fā)的必要性,行業(yè)提出了一套二次開發(fā)組件模型,并就該組件在PowerBuiler + SQL Server環(huán)境下的物理實現(xiàn)以及具體應(yīng)用作了初步探討,為實現(xiàn)紡織行業(yè)ERP流程自定義提供了一種簡單可行的思路#65377;
[關(guān)鍵詞] 紡織ERP;二次開發(fā);模型構(gòu)建;流程自定義
[中圖分類號]F270.7[文獻標識碼]A[文章編號]1673-0194(2009)03-0057-05
隨著中國加入WTO和世界經(jīng)濟一體化,企業(yè)所處商業(yè)環(huán)境正發(fā)生著深刻的變化,企業(yè)信息系統(tǒng)也正面臨著前所未有的挑戰(zhàn)#65377;ERP(企業(yè)資源計劃)由于能夠有效地整合企業(yè)內(nèi)部和外部資源,已經(jīng)成為許多現(xiàn)代企業(yè)普遍采用的信息系統(tǒng)#65377;ERP在中國推行多年,真正成功的案例卻比較少#65377;其中深層次的原因是國內(nèi)外企業(yè)在管理理念和業(yè)務(wù)流程之間存在顯著的差異#65377;要解決這個問題不僅要求導入企業(yè)對內(nèi)部管理和流程進行規(guī)范,更要求ERP軟件能夠保持充分的靈活性#65377;一種有效的方法就是系統(tǒng)提供用戶二次開發(fā)的平臺,即通過各種二次開發(fā)工具對ERP中的一些基本構(gòu)件和通用模塊進行重組或者擴充,從而實現(xiàn)自定義業(yè)務(wù)流程的功能#65377;
1 紡織行業(yè)ERP應(yīng)用現(xiàn)狀及二次開發(fā)需求
紡織行業(yè)屬于我國傳統(tǒng)制造業(yè),具有多工序#65380;連續(xù)化#65380;大量生產(chǎn)能力強和勞動密集程度高#65380;市場流行期短等顯著特點#65377;當前,我國許多紡織企業(yè)都實施了ERP項目,并取得了一定的管理效益和經(jīng)濟效益#65377;但仔細研究不難發(fā)現(xiàn),目前實施ERP的大型紡織企業(yè)中,應(yīng)用較多集中在進#65380;銷#65380;存等企業(yè)經(jīng)營管理的外圍環(huán)節(jié),而對于ERP核心部分的生產(chǎn)質(zhì)量管理#65380;工藝管理等子系統(tǒng)要么空白,要么難以推廣#65377;究其原因:一方面是由于開發(fā)人員對紡織行業(yè)的流程缺乏深入的理解;另一方面是由于當下的ERP軟件缺乏動態(tài)擴展性,通用性太差#65377;
對于紡織行業(yè)來講,由于生產(chǎn)工序繁多,數(shù)據(jù)采集量異常龐大,生產(chǎn)質(zhì)量控制#65380;工藝管理一直是紡織行業(yè)ERP的重點和難點#65377;FAM體系結(jié)構(gòu)提出,紡織企業(yè)的數(shù)據(jù)采集點從上至下可以分為企業(yè)#65380;工廠#65380;分廠#65380;單元#65380;工作站和設(shè)備6個層次#65377;除了設(shè)備級,每級都是若干個下級的集合#65377;在此層次結(jié)構(gòu)中,每一層都可以作為數(shù)據(jù)采集點,各層數(shù)據(jù)的屬性不盡相同#65377;如停臺時間#65380;棉結(jié)數(shù)等指標屬于設(shè)備級,而溫度#65380;濕度#65380;電能耗費率則屬于單元級#65377;由于采集層次較多,每道工序生產(chǎn)質(zhì)量指標繁多并且處于不斷擴充中,對于單個紡織企業(yè)來講,各自關(guān)注的產(chǎn)品質(zhì)量指標體系很可能不一致,這就造成了許多ERP軟件通用性較差的現(xiàn)象#65377;要解決這些問題,最有效的方法就是讓用戶方自行進行二次開發(fā)#65377;這里的二次開發(fā)不僅是指軟件界面風格#65380;顯示格式可由用戶自行修改,而是指基本的數(shù)據(jù)項目#65380;數(shù)據(jù)處理邏輯以及數(shù)據(jù)報表的內(nèi)容均可由高級用戶自行擴充或刪減,從而實現(xiàn)真正意義上的“業(yè)務(wù)流程自定義”
實踐證明,任何一種ERP軟件要想獲得成功,不提供二次開發(fā)的平臺幾乎是不可能的#65377;具體來講,二次開發(fā)對ERP的意義主要有以下幾點:
(1)大大簡化系統(tǒng)開發(fā)方的工作,使得開發(fā)方把大部分精力用于系統(tǒng)整體架構(gòu)的建設(shè)#65380;主流業(yè)務(wù)流程的研究以及模型庫#65380;中間件的不斷完善,從根本上提升ERP軟件的質(zhì)量#65377;
(2)開發(fā)方把一些非主流業(yè)務(wù)流程的定義和功能模塊的開發(fā)工作放手給用戶,提高了用戶的業(yè)務(wù)理解能力和程序開發(fā)水平#65377;另外,二次開發(fā)可以增加用戶對系統(tǒng)建設(shè)的參與程度,激發(fā)用戶的主動性,有利于以后的系統(tǒng)維護#65377;
(3)最重要的一點是, 二次開發(fā)使得ERP軟件在面對企業(yè)業(yè)務(wù)流程或組織結(jié)構(gòu)的變化時能作出快速響應(yīng),提高了ERP軟件的柔性程度#65377;
2 二次開發(fā)的實質(zhì)及適用條件
從信息系統(tǒng)的軟件結(jié)構(gòu)來看,信息系統(tǒng)是建立在公用數(shù)據(jù)庫#65380;子系統(tǒng)專用數(shù)據(jù)庫#65380;程序設(shè)計語言工具模型庫基礎(chǔ)之上的各種業(yè)務(wù)功能的總和(見圖1)#65377;
在傳統(tǒng)的信息系統(tǒng)中,只有第四層功能業(yè)務(wù)層是面向用戶的#65377;而數(shù)據(jù)如何進行處理以及報表內(nèi)容如何組織由第三層模型庫完成,對用戶來講是非透明的#65377;二次開發(fā)實際就是向高級用戶開放部分模型庫和函數(shù)庫,當企業(yè)的業(yè)務(wù)流程發(fā)生變化時由用戶利用二次開發(fā)組件對功能業(yè)務(wù)層中的基礎(chǔ)數(shù)據(jù)項#65380;處理單據(jù)和報表進行修改來適應(yīng)變化,也即把第三層和第二層的部分功能向用戶開放#65377;
值得注意的是,并非所有ERP模塊都適合于二次開發(fā)#65377;一般來講,一個系統(tǒng)中子模塊之間的連接方式有兩種,即串聯(lián)和并聯(lián)#65377;串聯(lián)方式中高層構(gòu)件表現(xiàn)為一系列低層構(gòu)件的順序處理, 輸入為某低層構(gòu)件的輸入, 經(jīng)過其他低層構(gòu)件的串行處理, 輸出為最后的構(gòu)件的輸出#65377;而并聯(lián)方式中高層構(gòu)件對低層構(gòu)件沒有特別的處理, 僅僅是對低層模塊功能的聚集#65377;這時,構(gòu)件的輸入是所有低層模塊的輸入, 輸出為所有低層模塊輸出的集合,如質(zhì)量管理子系統(tǒng)#65377;產(chǎn)品質(zhì)量項目繁多,但各項質(zhì)量數(shù)據(jù)具有趨同性,數(shù)據(jù)的采集和處理方式在本質(zhì)上區(qū)別不大,均可以通過報表#65380;直方圖#65380;折線圖等相同方式顯示給使用者#65377;適合于二次開發(fā)的系統(tǒng)在連接方式上應(yīng)為并聯(lián)方式#65377;
3 二次開發(fā)體系結(jié)構(gòu)模型簡介
本文所介紹的二次開發(fā)工具是由一系列基本組件構(gòu)成#65377;筆者在多年從事紡織行業(yè)ERP開發(fā)實踐中,摸索出一套基于PB + SQL Server環(huán)境下的二次開發(fā)組件模型#65377;根據(jù)管理信息系統(tǒng)的傳統(tǒng)理論,任何業(yè)務(wù)流程都可抽象為幾個功能模塊的整合,而功能模塊是由輸入功能(單據(jù))#65380;處理功能(函數(shù))和輸出功能(查詢或報表)組成#65377;筆者開發(fā)了三類二次開發(fā)組件,即:自定義函數(shù)#65380;自定義單據(jù)和自定義報表#65377;它們之間構(gòu)成層次關(guān)系,如圖2所示#65377;
3. 1自定義函數(shù)
該組件是二次開發(fā)的最基本組件#65377;它直接同底層數(shù)據(jù)庫相連接,主要是對處理邏輯的定義#65377;理論上可以利用該工具取得數(shù)據(jù)庫中的任何數(shù)據(jù),應(yīng)用于任何子系統(tǒng),因而它屬于軟件結(jié)構(gòu)中的公共模型庫#65377;自定義函數(shù)本身是一個附加功能,它不能獨立成為一個功能模塊,必須與自定義單據(jù)#65380;自定義報表結(jié)合起來使用#65377;自定義函數(shù)中處理過程的定義是核心步驟,可以采用兩種形式:Select SQL語句和存儲過程#65377;由于自定義函數(shù)只能夠返回一個值而不是一個數(shù)據(jù)集合,因而它經(jīng)常被適用于自定義單據(jù)中某個數(shù)據(jù)項的計算公式或者自定義查詢#65380;報表中某項動態(tài)內(nèi)容的生成#65377;
3. 2自定義單據(jù)
自定義單據(jù)分散在生產(chǎn)質(zhì)量管理#65380;工藝管理等各個子系統(tǒng)中#65377;分為項目定義和數(shù)據(jù)輸入兩個部分#65377;前者實現(xiàn)了該子系統(tǒng)中各輸入模塊和處理邏輯的定義,真正實現(xiàn)了“業(yè)務(wù)流程自定義”,是二次開發(fā)的核心內(nèi)容#65377;該組件中主要進行構(gòu)成業(yè)務(wù)流的每個輸入數(shù)據(jù)項屬性的定義,如名稱#65380;類型#65380;統(tǒng)計方式#65380;計算公式等#65377;值得注意的是,此處的“計算公式”中不僅可使用本張輸入單據(jù)中的數(shù)據(jù)項,更可以通過調(diào)用“自定義函數(shù)”的功能取得本系統(tǒng)其他模塊中的任何一項數(shù)據(jù),這是本組件與其他大多數(shù)信息系統(tǒng)相比的一大優(yōu)勢,大大擴展了組件的取數(shù)功能,提高了流程定義的靈活性#65377;而后者根據(jù)前面的定義自動生成輸入界面進行數(shù)據(jù)錄入或采集#65377;
3. 3自定義報表
該組件使用的好壞是二次開發(fā)的成果是否被管理層認可的關(guān)鍵,因為管理層往往是通過系統(tǒng)輸出信息量的多少以及輸出信息的格式來判斷一個系統(tǒng)是否成功#65377;本組件主要提供了以下兩種形式的自定義報表:
3. 3. 1各子系統(tǒng)的自定義報表和圖表
該類報表的數(shù)據(jù)源可以是本子系統(tǒng)中的任何自定義單據(jù)#65377;在使用自定義報表時應(yīng)該首先定義一個報表模板,隨后組件自動提供所有自定義單據(jù)的所有數(shù)據(jù)項,由二次開發(fā)人員在其中進行模板內(nèi)容的選擇#65377;報表顯示的內(nèi)容來源于模板上定義的數(shù)據(jù)項以及其他一些必要的篩選條件(如日期范圍等)#65377;自定義圖表的使用除了選擇數(shù)據(jù)項之外,還要定義報表的形式(直方圖#65380;折線圖等)以及縱坐標#65380;橫坐標的內(nèi)容等#65377;
由于該類報表的數(shù)據(jù)均來自于自定義單據(jù)組件,不能獨立取數(shù),因而不能夠使用自定義函數(shù)功能#65377;
3. 3. 2Formula 1 綜合自定義報表
Formula 1是一種外嵌OLE表格式插件,在使用前必須先進行安裝#65377;Formula 1 無論從界面樣式還是內(nèi)部功能都與Mircrosoft Excel極其相似,但它的可編程性卻是Excel所無法比擬的,許多普通編程工具(如PB,VB,VC)等都提供了與該組件的接口,可以方便地使用該控件的屬性和方法進行數(shù)據(jù)的顯示和編輯#65377;使用Formula 1 綜合自定義報表進行二次開發(fā)時,需要二次開發(fā)者了解數(shù)據(jù)庫的內(nèi)部結(jié)構(gòu),使用SQL語句#65380;存儲過程取得結(jié)果集并指明報表中需要顯示的字段定義,也可以使用自定義函數(shù)功能直接取得任何子系統(tǒng)中的單項數(shù)據(jù)#65377;這種自定義的報表靈活性最大,但對二次開發(fā)用戶的技術(shù)要求也最高#65377;
4 二次開發(fā)體系結(jié)構(gòu)模型的實現(xiàn)與應(yīng)用
以上所介紹二次開發(fā)組件全部是基于Windows圖形界面環(huán)境,采用Powerbuilder 7.0 + SQL Server 2000技術(shù)開發(fā)而成#65377;Powerbuilder 是Sybase公司推出的一款優(yōu)秀的應(yīng)用程序開發(fā)工具,雖然界面設(shè)計的功能較弱,但其獨特的Datawindow技術(shù)使其在開發(fā)數(shù)據(jù)庫應(yīng)用程序時與其他工具相比具有無可比擬的優(yōu)勢#65377;SQL Server 2000更是現(xiàn)代許多企業(yè)信息化首選的分布式關(guān)系數(shù)據(jù)庫#65377;以下簡單介紹二次開發(fā)組件模型的物理實現(xiàn)及簡單應(yīng)用#65377;
4. 1自定義函數(shù)的實現(xiàn)與應(yīng)用
該模塊是由兩張二維表實現(xiàn)#65377;主表func保存函數(shù)名稱#65380;處理過程(sqlsyntax)等內(nèi)容,而函數(shù)參數(shù)的詳細信息則在明細表funcparm上,包括參數(shù)序號#65380;參數(shù)名稱#65380;參數(shù)類型等#65377;
如要定義一個自定義函數(shù)uf_getsdczl,功能為取得織造工序某機臺某天某班次的下機總數(shù)(下機產(chǎn)量數(shù)據(jù)存儲于關(guān)聯(lián)表zzdj48和zzdjmx48),過程如圖3所示#65377;
從以上定義可看出,函數(shù)處理(sqlsyntax)本質(zhì)上是用SQL語言或存儲過程實現(xiàn)的,因而自定義函數(shù)的二次開發(fā)人員應(yīng)該具備一定的SQL基礎(chǔ)#65377;
4. 2自定義單據(jù)的實現(xiàn)與應(yīng)用
以織部質(zhì)量管理子系統(tǒng)的設(shè)備級單據(jù)為例,第一部分定義的所有項目屬性全部保存在二維表zbzlxmmx中#65377;在某類單據(jù)項目定義完成時,PB窗體調(diào)用“Create table”或者“Alter Table”動態(tài)SQL語句生成新的二維表來存儲該類單據(jù)的所有數(shù)據(jù),表名稱為:zl+ 部門代碼+ 工序代碼 + 單據(jù)代碼,如zl1011090(該二維表中還保存了一些固定字段,如sd_id(車號)#65380;gx_code(工序)等)#65377;因而此處每類產(chǎn)品質(zhì)量單據(jù)即對應(yīng)一張二維表#65377;業(yè)務(wù)邏輯和物理結(jié)構(gòu)對應(yīng)關(guān)系如圖4所示#65377;
在數(shù)據(jù)輸入界面的實現(xiàn)中,最關(guān)鍵的是自動計算各個字段在界面上的位置以及公式字段的自動取數(shù)#65377;對于第一個問題,可以設(shè)定界面上每排排放的項目數(shù)以及該項目的顯示序號計算其絕對坐標#65377;而后一個問題的解決比較復雜,對于含有自定義函數(shù)公式uf_的字段,需要用循環(huán)替換的思想把形式參數(shù)全部替換成實際參數(shù),再調(diào)用該函數(shù)sqlsyntax字段中定義的SQL語句或存儲過程進行計算;對于普通公式項目則直接用Datawindow自動創(chuàng)建動態(tài)Compute字段進行計算即可#65377;一些關(guān)鍵代碼如下:
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) //取得每個參數(shù)的實際值
ls_module = f_stringreplace(ls_module,ls_tag, string(ld_value)) //循環(huán)參數(shù)替換
ls_returnval=wf_expressiontovalue('101',1,ls_module)//靜態(tài)表達式求值
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
例如,要定義一張設(shè)備級數(shù)據(jù)采集單據(jù),名為“坯布物理指標”, 包括棉結(jié)總數(shù)#65380;單位棉結(jié)數(shù)#65380;經(jīng)密#65380;緯密#65380;筘幅#65380;經(jīng)強#65380;緯強等質(zhì)量項目#65377;其中單位棉結(jié)數(shù)為棉結(jié)總數(shù)除以產(chǎn)量數(shù),緯密為經(jīng)密的1.1倍,定義過程如圖5所示#65377;
由于計算單位棉結(jié)數(shù)需要用到總產(chǎn)量,而該數(shù)據(jù)不在本單據(jù)中,因而必須要使用自定義函數(shù)#65377;而形成的動態(tài)錄入單據(jù)界面見圖6#65377;
其中紅色部分(緯密#65380;單位棉結(jié)數(shù))表示計算字段,在完成其他項目數(shù)據(jù)輸入后其值被自動計算出,因而不能被編輯#65377;
4. 3自定義報表的實現(xiàn)與應(yīng)用
此處僅介紹第一類自定義報表的物理實現(xiàn)#65377;
報表模板用二維表zlrptmodel進行存儲,該表的主要字段有name(項目名)#65380;tj_mode(統(tǒng)計方式)#65380;table(數(shù)據(jù)來源二維表)#65377;數(shù)據(jù)項可能來自同一個二維表,也可能來自不同的二維表,而且每個數(shù)據(jù)的取數(shù)方式也不一樣(有的是平均,有的是加總),因而必須建立一個臨時表zbzl_rpt1,然后對報表模板中的數(shù)據(jù)項逐個取數(shù)后放進臨時表#65377;最后基于該臨時表做一個datawindow即可#65377;
該處的難點是每個項目取數(shù)的動態(tài)SQL語句的形成#65377;關(guān)鍵代碼如下:
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;
而對于自定義圖表的實現(xiàn),同樣也要定義一個二維表zlgraphmodel來存儲模板內(nèi)容,在圖表生成時,只要根據(jù)zlgraphmodel中的內(nèi)容修改datawindow中g(shù)raph對象的某些屬性即可#65377;具體代碼省略#65377;
例如,要求把“坯布物理指標”中定義的質(zhì)量項目都統(tǒng)計在一張質(zhì)量報表上,并且把“單位棉結(jié)數(shù)”這一指標做成折線圖,組件使用過程如圖7所示#65377;
5 結(jié)束語
用戶方二次開發(fā)是一套ERP軟件能否適應(yīng)環(huán)境變化的關(guān)鍵所在#65377;本文所介紹的二次開發(fā)組件界面簡單,操作流程清晰,信息資源共享性和可擴展性能均良好,可以方便地實現(xiàn)基于平行方式的質(zhì)量管理#65380;工藝管理等底層業(yè)務(wù)流程的自定義構(gòu)建#65377;目前該套組件已經(jīng)實施于無錫#65380;丹陽#65380;金華等一些紡織企業(yè)單位,收到了良好的效果#65377;
主要參考文獻
[1] 李遷,葛世倫,等. 基于控制點模型的紡織企業(yè)生產(chǎn)數(shù)據(jù)的采集[J]. 紡織學報,2007(3):111-114.
[2] 任明侖,朱衛(wèi)東,等. 基于構(gòu)件的信息系統(tǒng)體系結(jié)構(gòu)模型[J]. 小型微型計算機系統(tǒng),2004(7):1159-1161.
[3] 顏承元. 基于B/S模式的紡織企業(yè)生產(chǎn)經(jīng)營管理信息系統(tǒng)的設(shè)計[J]. 毛紡科技,2007(9):58-60.
[4] 許敏. 企業(yè)ERP系統(tǒng)二次開發(fā)問題研究[J]. 集團經(jīng)濟研究,2007(18):10-12.
[5] 吳士亮,薛恒新. 紡織企業(yè)信息化若干關(guān)鍵問題研究[J]. 科學學與科學技術(shù)管理,2004(11):106-108.