-
Java Connector and BAPI
前些日子想去深入的研究下Portal Development,但是載了一個週末也沒有把NetWeaver Developer Studio弄下來。閒暇時間,瀏覽了下JCo的API文檔和幾個簡單的DEMO,開始嘗試着自己去用JCo做一些操作,並記錄下整個過程,以供大家參考。
一些理論性的東西源自SAP的官方培訓教材和一些高手的筆記,英文不佳,翻譯的有些拗口,見諒…
1.1 What is JCo
SAP Java Connector (SAP JCo)是個中間件組件,用於SAP組件和JAVA程序的開發。SAP JCO 支持兩種方向連接SAP 服務器:inbound calls (Java calls ABAP) and outbound calls (ABAP calls Java)。SAP JCO可以用於桌面應用和WEB應用程序也可以作爲組件嵌入到以下程序中:
SAP Business Connector:用於與外邊的JAVA程序的連接
SAP Web Application Server:通過ABAP環境連接到嵌入式J2EE服務
而我們的Portal中,也正是使用JCo與SAP系統或者其他系統進行交互。
1.2 JCo OverView
- High-performance JNI-based middleware
- Support R/3 3.1H and higher.
- Supports inbound and outbound calls.
- Supports client pooling.
- Supports desktop and web/application server applications.
- Multi-platform
- Complete and correct code page handling
- Easy to install and deploy
1.3 JCo's Architecture
從下圖可以清楚的看到,JCo不過是通過JNI提供與SAP系統的RFC連接
1.4 What is BAPI
BAPI (Business Application Programming Interface)是在Business Applications Systems(例如SAP R/3)中,被精確定義的進程或數據的訪問接口。
1.5 Benefits of BAPI
- 可以被用於不同的語言或者開發環境(ABAP, Visual Basic, Java, C++, etc.)
- 可以被不同的平臺調用 (COM, CORBA, Unix)
- 縮減開發和維護的開支
圖:BAPI可以被廣泛使用
1.5 SAP的T-CODE
- BAPI Business Object Browser (BAPIs only)
- SWO1 Business Object Builder (all objects)
- SWO2 Business Object Browser (all objects)
- SE11 Data Dictionary
- SE37 Function Builder
二、使用SAP JCo連接到服務器
2.1 JCo主要的操作活動
2.2建立到SAP 服務器的連接
SAP JCo有兩種方式連接到SAP服務器:直接連接和連接池
注:下文的例子中使用的是JCo2.1.9版本,最新版本爲3.0.4
-
直接連接
打開連接:
調用函數和關閉連接:
-
連接池
創建連接池:
獲取和釋放連接:
JCO.Repository:用於存取RFMs的元數據
2.3 Jco2.1.9中的範例,COMANY_CODE
該範例主要執行兩個操作:
-
通過BAPI_COMPANYCODE_GETLIST獲取所有的COMP_CODE,然後顯示
-
通過BAPI_COMPANYCODE_GETDETAIL對操作1中的COMP_CODE進行明細查詢,得到所對應的COUNTRY和CITY
2.3.1創建Repository
2.3.2創建JCO.FUNCTION
2.3.3執行JCO.FUNCTION
2.3.4映射JAVA和ABAP數據類型
2.3.5存取表
2.3.6 BAPI函數調用
2.3.7 運行結果
測試時,使用的是咱們R/3,212系統,下面是部分結果:
COMP_CODE和COMP_NAME
COMP_CODE、COUNTRY和CITY
三、Jco For Web Service
下面是自己寫的一個小測試,使用Jco調用ABAP函數ZTESTCHEN1,並獲得輸出結果
服務器使用的是Apache Tomcat6.0,頁面爲JSP,通過Servlet與服務器進行交互。
OK,開始!
3.1 RFM:ZTESTJCOFUN
RFM,RFC-enabled Function Modules,所有的ABAP函數,勾選上Remote-Enable Module就是一個RFM,顯而易見,所有的BAPI也都是RFM,只不過依據特定的規則,被定義爲SAP的Business Object Repository (BOR)的對象型方法。如下圖:
函數是自己比着葫蘆畫的,比較簡單,主要功能是查表LFA1,通過供應商的ID獲取相關信息:
-
輸入字符串LIFNR參考LFA1-LIFNR
-
輸出字符串RETURN參考BAPIRETURN,返回參數,S爲成功,E爲出錯
-
查詢內容存放在表ITAB中,此表參考自建結構ZTESTJCO,詳情如下圖:
-
核心ABAP代碼如下,當輸入ID爲空時,查詢所有供應商,ID不爲空時,查詢單個,查詢不到時報錯,詳情如下圖:
3.2 Servlet and JSP
本測試的服務器配置比較簡單,使用單純的Servlet配合JavaBean,做JSP頁面與後臺的請求處理。
其中,文件結構如下圖:
3.3 運行結果:
-
提交頁面:
-
結果顯示:(ED2,212系統,如果是222的話,會有很多...)
-
報錯
四、總結
BAPI自身提供了很多強大的藉口,供SAP系統自身或者Jco等中間件從外部來調用。本文簡單的展示了Jco通過WebService來調RFM的過程,簡單來說就是通過RFC來調用SAP中函數,然後顯示返回信息。是SAP外圍開發或者自身功能增強的一種解決方案。
類似於阿PENG同志前段時間演示的那個.Net通過WebService調RFM來操作交貨單,不過那個的ABAP代碼太多,一時半會讀不懂,只好自己寫個簡單的。