作者是 葉宏謨教授   

軟體大量客製化的實現 — SOA-ERP系統

 

葉宏謨 Ph.D., CPIM
輔仁大學資訊管理系教授
2007/8/5

 

前言

多數企業對導入ERP的成效都不滿意,無法彈性客製是主要原因之一,企業沒有理由受限於ERP系統而無法靈活變化其經營方式,企業需要的是一個可以隨著管理策略改變而彈性調整的ERP系統。「服務導向架構」將帶來下一波的軟體革命,可以大量客製化的服務導向ERP系統才是未來企業真正需要的管理資訊系統。

 

傳統ERP系統為何效益不彰?

傳統ERP系統是不易修改的套裝軟體。開發階段為了適用於更多的企業,導致功能繁雜、操作困難;導入階段為了避免修改,造成實務遷就系統、使用者需求無法滿足。推廣ERP系統的廠商為了說服使用者,往往號稱其產品是「最佳實務」(best practice),但每一家企業適用的管理方法不同,故天下沒有最佳實務。也就是說,實務是因應個別企業的需求而生的。因此客製化是ERP系統的必然,ERP提供者不應該說服使用者來遷就系統,而是應該配合使用者的需求來客製系統。不易客製、實務遷就系統是第一個效益不彰的原因。

另一個效益不彰的原因是使用者以為有了工具就能解決問題。公司管理不上軌道應該設法訓練人員、改善制度,而不是導入ERP系統。許多公司以為導入ERP系統就可以讓管理上軌道,其實是行不通的。例如一個公司沒有編好料號,用了ERP系統還是不會有好的材料編號,應該先編好料號再來使用ERP系統。所以要先整理基本資料和制定標準作業程序,找出最適合自己的商務流程(business process),再尋求較接近的ERP系統來客製。

無論是已上軌道或是欠缺良好管理制度的企業,都不可能找到剛好適用的ERP系統。所以客製化是必要的,沒有客製化ERP一定不會有好的效益。

 

如何快速有效的客製ERP系統?

每個企業的文化不同、法規不同、主管習性不同、產品不同…,因此沒有一體適用的管理方法,也沒有一體適用的ERP系統。適合個別企業的管理方法雖各有不同,但基本的管理原理其實是相同的,找到這個「共通的企業架構」,發展成服務元件(一種可重複使用的軟體元件),再利用服務元件為個別客戶量身訂製或大量客製適用的ERP系統,就可避免不合用的缺點。

傳統ERP系統牽一髮而動全身,不易修改,當然也就無法大量客製或量身訂製。服務導向架構ERP系統(Service-Oriented Architectural ERP)包含多個服務元件,每一個服務(service)包含多個服務作業(operation)和多個資料表,這些服務作業存取資料表,如圖1所示。圖1中的圓形記號即服務作業,方形記號則為資料表。每一個服務中的服務作業和其資料表息息相關,但和其他服務中的資料表則毫不相干。資料表隱藏在服務裡面,應用程式設計師或應用系統只能呼叫服務,是碰觸不到資料表的。一個服務可以由其他服務組成。應用系統的所有功能皆利用服務組合而成。若服務組成功能的方法極為簡單,且服務都能呼應「共通的企業物件」,則ERP系統功能就可以隨時重組以滿足個別客戶需求。因此重要的不是ERP系統有什麼功能,重要的是ERP系統中的服務否合乎「共通的企業物件」。


共通的企業物件

任何企業都由資源(resources)和活動(activities)組成。企業可運用的資源包括員工、資金、材料、設備、客戶、以及供應商。企業活動包括人力資源管理、採購、配銷、庫存管理、製造、研發、財務會計、成本會計、和規劃等。SOA-ERP 系統是物件導向的(object-oriented)軟體系統,由資源物件(resource object)和活動物件(activity object)構成。現實世界和軟體世界的物件是一對一的:在SOA-ERP系統中,每一個資源物件都對應一個現實世界的企業資源;每一個活動物件都對應一個現實世界的企業活動。這些資源物件和活動物件就是SOA-ERP系統的服務。

如同任何物件一樣,服務(資源物件或活動物件)包含屬性(attribute)和方法(method),方法為服務作業,屬性則記錄在資料表裡,也會被使用在服務作業的輸入及輸出訊息中,下節再詳細討論。例如材料這個資源物件包含件號、品名、規格、材質、…等屬性,和新增材料、修改材料、查詢材料、查詢替代材料、…等服務作業。再如採購這個活動物件包含請購單、採購單、採購變更單、進貨通知單、進貨單、進貨變更單、收貨超交參數、…等屬性,和新增採購單、修改採購單、查詢採購單、確認採購單、核價、查詢預計進貨、…等服務作業。


服務導向架構ERP系統

服務是一種能執行完整資料處理的軟體元件,ERP系統中,企業物件是服務提供者(service provider),應用系統介面是服務要求者(service requestor)。服務要求者向服務提供者發出要求指令(包括要求的服務、服務作業、以及輸入訊息),服務提供者則執行服務並傳回輸出訊息。圖2的例子為寶盛NEO SOA-ERP系統要求服務的指令。請略過4個粗體字以外的文字。

HashMap replyMap = (HashMap)LCBusinessDelegate.getInstance().send(
          UC_DIS_SALESORDER.name,
          UC_DIS_SALESORDER.CRTSALESORDER,
          soParam); 
 

2:要求服務及獲得回應的指令

 圖2中,UC_DIS_SALESORDER.name是服務, UC_DIS_SALESORDER.CRTSALESORDER 是服務作業,soParam是輸入訊息,replyMap是輸出訊息。服務導向ERP系統的所有功能皆先從介面取得輸入訊息,再以圖2的方式要求服務並取得輸出訊息,最後再把輸出訊息的內容顯示在介面中。由於輸入和輸出訊息的格式是標準的(本例是Java服務,可自動轉成網路服務),因此應用系統介面可以用各種語言撰寫,包括Java, .NET, 網頁等等。

由於設計應用系統介面的工具很多,且大部分都可用拖拉的方式自動產生程式(NEO可根據使用者需求自動產生介面程式),非常快速,所以使用者只要知道在那一個介面程式的那一個位置可以取得資料做成輸入訊息、寫入如圖2般的指令要求服務並取得輸出訊息、以及在那裡顯示輸出訊息,系統開發的工作就大功告成。這就是為什麼服務導向架構ERP系統可以大量客製化的原因。

利用上述方法開發或客製ERP功能的人不必看到ERP系統的原始程式,也不必知道ERP系統的資料庫結構,他們只須仰賴「服務說明」(service description)即可完成系統開發的工作。寶盛NEO服務導向ERP系統「查詢銷售資料」的服務說明如表1所示。

表1:服務說明的例子

QRYSALESDATA
public static final java.lang.String QRYSALESDATA
查詢銷售資料(不支援分頁機制)
功能說明:
(1)查詢銷售訂單明細,前端UI作傳值時使用.

PARAMETER:(輸入訊息)

KEY 名稱 型態 必傳 說明 
SITEID 營運點代號 STRING V  
MINSONO 銷售訂單號最小值 STRING    
MAXSONO 銷售訂單號最大值 STRING    
MINSHIPPINGADDRESSID 交運地址代號最小值 STRING V  
MAXSHIPPINGADDRESSID 交運地址代號最大值 STRING V  
MINSEQUENCENO 銷售訂單明細序號最小值 STRING V  
MAXSEQUENCENO 銷售訂單明細序號最小值 STRING V  

RETURN:(輸出訊息)

KEY 名稱 型態 必傳 說明
SALESDATA 銷售資料群 LIST OF HASHMAP V  
 
KEY 名稱 型態 必傳 說明
SONO 銷售訂單號 STRING V  
SEQUENCENO 序號 STRING V  
ITEMID 件號代號 STRING V  
ITEMNAME 件號名稱 STRING V  
ITEMSPECIFICATION 件號規格 STRING V  
SCHEDULEDDELIVERYDATE 預訂交期 STRING V  
SALESORDERQUANTITY 訂單數量 DECIMAL V  
UNITPRICE 單價 DECIMAL V  
SALESORDERAMOUNT 訂單金額 DECIMAL V  

 

寶盛NEO SOA-ERP系統服務說明的輸入訊息和輸出訊息都以多階表格呈現。上例的輸入訊息有7個欄位(KEY),其中5個是必要的,缺一個就不能呼叫此服務作業。輸出訊息只有一個欄位SALESDATA,但它本身也是一個包含9個欄位的表格,它代表多筆9個欄位的銷售明細資料。這個服務作業的服務說明也能自動轉成網路服務說明(WSDL, Web Service Description Language)如表2。

表2:WSDL的例子

<schema targetNamespace="http://lancer.com.tw/UC_DIS_SALESORDER.QRYSALESDATA">
  <element name="UC_DIS_SALESORDER.QRYSALESDATA">
    <complexType>
      <sequence>
        <element name="SITEID" type="string"/>
        <element name="MINSONO" type="string"/>
        <element name="MAXSONO" type="string"/>
        <element name=" MINSHIPPINGADDRESSID" type="string"/>
        <element name=" MAXSHIPPINGADDRESSID" type="string"/>
      </sequence>
    </complexType>
  </element>
  <element name="UC_DIS_SALESQUOTATION.QRYSALESDATAResponse">
    <complexType>
      <sequence>
       <element name="SALESDATA" maxOccurs="unbounded" minOccurs="0">
          <complexType>
            <sequence>
              <element name="SONO" type="string"/>
              <element name="SEQUENCENO" type="string"/>
              <element name="ITEMID" type="string"/>
              <element name="ITEMNAME" type="string"/>
              <element name="ITEMSPECIFICATION" type="string"/>
              <element name="SCHEDULEDDELIVERYDATE" type="string"/>
              <element name="SALESORDERQUANTITY" type="string"/>
              <element name="UNITPRICE" type="string"/>
              <element name="SALESORDERAMOUNT" type="string"/>
            </sequence>
          </complexType>
        </element>
      </sequence>
    </complexType>
  </element>

像上例這種服務作業在NEO SOA-ERP系統中共有3千多個,系統開發人員要做的事就是瞭解使用者需求、從文件中找到可用的服務作業、將輸入訊息和輸出訊息填入程式產生器中自動產生程式、測試程式,即可完成全部的系統開發工作。

瞭解使用者需求約佔總時間的80%,尋找服務、自動產生程式、測試、和上線約佔20%,所以,服務導向架構ERP系統讓資訊人員能「專注於使用者需求」。由於NEO SOA-ERP系統除了服務也有介面,因此在「瞭解使用者需求」的過程中,即可利用NEO實際展示未來系統的功能,驗證其可行性及正確性。

 

結語

企業經營唯一不變的就是「變」,無法因應環境的變化而調整的企業很快就會被淘汰。企業引進ERP系統是為了要協助改變,不是為了限制改變。傳統僵化的ERP系統無法靈活修改,不但不能促進企業改變反而限制了企業的改變。理想的ERP系統應該讓主管早上產生的構想下午就有新功能可用。企業內的資訊人員主要的工作是瞭解使用者需求,瞭解完需求,系統也差不多構築完成了。SOA-ERP系統讓這樣的理想美夢成真。