SAP RFC 函数来创建 Java呼叫 学习总结 一步一步的插图
?
前言
該公司很快就接到了一個項目,SAP有接口。讓我們做老大SAP。首先SAP聯(lián)系。但發(fā)展從來沒有打過。本周集中在這一個研究.
各種碰壁,SAP該系統(tǒng)讓我怎么說? 算了。說多了都是淚,以下附上本周學習成果。大家一起探討一下。ABAP 還得多學學.
Package (tcode:se80)
?
?
輸入須要創(chuàng)建的 Package ,例:ZTP (之前用T打頭測試。貌似不行,大家能夠試試)
?
點? Yes 創(chuàng)建.
?
輸入創(chuàng)建Package的信息.
?
?
Table (tcode:se11)
點擊Create.
?
?
點擊保存,彈出選擇Package界面
保存就可以.
切換到 Fields 選項卡:
一個字段可相應一個數(shù)據(jù)元素,一個數(shù)據(jù)元素可相應多個字段.
?
如上圖: ZAGE 數(shù)據(jù)元素不存在,雙擊可進入:
?
提示不存在,則創(chuàng)建.
輸入數(shù)據(jù)類型,長度:
?
保存。都會提示選擇Package,后面就不說了.
?
激活該數(shù)據(jù)元素.
?
回到創(chuàng)建表界面,就可以發(fā)現(xiàn)數(shù)據(jù)類型和長度都已顯示.
?
點擊 技術設置.
?
?
保存就可以.
?
點擊 索引.
?
點擊創(chuàng)建索引.
?
?
輸入索引名字.
?
選擇字段等
?
保存,激活索引,激活表.
?
上面忘記設置 Key,選一個字段設置Key就可以.
?
Function Group (tcode:se37)
?
?
輸入創(chuàng)建Function Group的信息.點擊保存后彈出選擇 Package 的界面:
?
?
選擇剛剛創(chuàng)建的 Package :
?
保存就可以.
?
?
Function Module (tcode:se37)
?
Z_TEST_1
點擊創(chuàng)建 , 選擇函數(shù)組.
?
創(chuàng)建后 , 在Attributes選項卡 選擇 Remote 遠程調(diào)用函數(shù).
?
這里簡單說一下 Import,Export,Tables 三個選項卡
Import 就是須要導入的字段,在SAP的測試執(zhí)行的時候能夠輸入該值進行測試,外部程序調(diào)用時傳值進入,能夠理解 Java方法參數(shù).
Export 就是導出字段,程序運行完畢后返回字段,能夠理解 Java方法返回值,只是能夠返回多個.
Tables 能夠作為導入、導出, 他的字段為數(shù)據(jù)結果。事實上就是一個復雜參數(shù),比方說外圍程序調(diào)用要傳入一批數(shù)據(jù)。就能夠使用他了,導出一樣,能夠返回一批數(shù)據(jù).
?
這里我們就使用Table做一個批量上傳數(shù)據(jù)的一個功能,點擊 Tables選項卡,定義字段
Parameter Name,參數(shù)名,自定義
Type spec,參數(shù)類型 。普通值使用Type就可以。只是在Tables這里一般定義復雜類型。使用Like模擬一個結構對象
Associated Type,使用Like 時輸入我們的參考對象,能夠是表、視圖、元素等.
然后回車就可以,第一次回車好像報紅,再回車一次就能夠了,不知道其他大神有沒有遇到過.
?
點擊 Source code 選項卡,進入編碼.
?
小白也不知道復雜的編碼,所以僅僅能簡單寫一下了.
?
我們的目標是將傳入的數(shù)據(jù)插入到SAP的內(nèi)表中,編碼例如以下
INSERT ZTAB01 FROM TABLEIMPT.以上代碼就能夠啦,將傳入的 IMPT 導入到內(nèi)表中.
先保存,點擊Check。無錯誤激活就可以.
?
然后點擊激活.
?
左下角會提示激活.
?
然后我們能夠測試一下程序是否成功.
?
進入到輸入?yún)?shù)界面,就可以看到我們定義的Tables字段.
?
點擊進入編輯數(shù)據(jù).
?
?
完畢編輯后,返回.
?
點擊運行就可以.
?
此為運行結果.
?
通過 tcode:se11 進入到數(shù)據(jù)庫表查看數(shù)據(jù)
?
?
數(shù)據(jù)已插入到SAP內(nèi)表.
?
Z_TEST_2
?
數(shù)據(jù)上傳已經(jīng)完畢。這個時候我們做一個數(shù)據(jù)查詢的Function.
?
?
相同我們選擇 遠程調(diào)用函數(shù)
?
這個時候我們加一個 Import參數(shù),有選擇性的依據(jù)條件來查詢.
?
在Tables參數(shù)我們加一個返回參數(shù).
?
設置好后,進入編碼 source code.
?
*推斷傳入?yún)?shù)是否為空 IF DZNAME = '' . *為空查詢?nèi)繑?shù)據(jù) SELECT * INTOTABLE OUTT FROM ZTAB01. ELSE. SELECT * INTOTABLE OUTT FROM ZTAB01 WHERE ZNAME = DZNAME. ENDIF.點擊 Check,無問題后。激活測試.
?
測試時,輸入?yún)?shù)顯示出來了.
?
?
?
運行后。上圖已出結果。點擊進入查看明細.
?
不輸入條件時查詢.
?
?
到此RFC我們就已經(jīng)創(chuàng)建好了.
?
?
Java
?
準備工具
Eclipse
SapJco.jar
librfc32.dll
sapjcorfc.dll
(以上兩個動態(tài)連接須要載入,最簡單的辦法就是放在和Java運行程序放在一起,事實上就是JDK環(huán)境 bin 文件夾下)
環(huán)境
Window 環(huán)境
JDK 1.6 32位
?
首先準備了一個工具類。連接SAP.
?
import com.sap.mw.jco.IFunctionTemplate; import com.sap.mw.jco.JCO; import com.sap.mw.jco.JCO.Client;/*** SAP 連接工具類* @author berr* 2014.11.7*/ public class SapConn {private JCO.Client client; //客戶端連接對象private JCO.Function function; //RFC Function 對象String host,clientId,userName, password,lang, sysnr; //地址,客戶端。username。密碼,語言。系統(tǒng)標識public SapConn(){}/*** 創(chuàng)建連接對象*/public void connect(){client = JCO.createClient(clientId, userName,password,lang,host,sysnr); client.connect();}/*** 斷開連接*/public void disconnect(){client.disconnect(); }public Client getClient() {return client;}public void setClient(Client client) {this.client = client;}/*** 注冊并獲取一個RFC函數(shù)* @param reName 注冊名稱。隨意* @param ftName RFC 名稱*/public void regFunction(String reName,String ftName){ JCO.Repository mRepository = new JCO.Repository(reName,this.client); IFunctionTemplate ft = mRepository.getFunctionTemplate(ftName.toUpperCase());this.function = ft.getFunction();}/*** 設置輸入?yún)?shù)* @param parameter 參數(shù)名* @param value 值*/public void setImport(String parameter,String value){JCO.ParameterList im = this.function.getImportParameterList();im.setValue(value,parameter);}/*** 獲取Tables結構對象* @param tableName 參數(shù)名稱* @return*/public JCO.Table getTable(String tableName){return this.function.getTableParameterList().getTable(tableName);}/*** 運行當前注冊的函數(shù)*/public void execute(){this.client.execute(this.function);}public JCO.Function getFunction() {return function;}public void setFunction(JCO.Function function) {this.function = function;}}?
?
這里我們開始準備測試類
測試插入RFC函數(shù)。代碼例如以下
?
import com.sap.mw.jco.JCO;public class CallInsert {public static void main(String[] args) {SapConn sc = new SapConn();sc.host="192.168.0.140";sc.clientId = "001";sc.userName = "dev";sc.password = "d123456";sc.lang = "zh";sc.sysnr="000";/*以上都是連接SAP須要的信息,登錄SAP GUI也須要這些,就不多解釋了*/sc.connect();//創(chuàng)建連接String function1 = "Z_TEST_1";sc.regFunction(function1,function1); //注冊并獲取一個FunctionJCO.Table imt = sc.getTable("IMPT"); //獲取Function 中設置的Tables參數(shù)for (int i = 0; i < 10; i++) {imt.appendRow(); //添加一行imt.setValue(i, "ZAGE"); // 設置 ZAGE 值,必須為大寫imt.setValue("C" + i, "ZNAME");// 設置 ZNAME 值,必須為大寫}sc.execute();sc.disconnect();} }運行成功后,返回SAP查看結果.
?
測試查詢RFC函數(shù),代碼例如以下
?
import com.sap.mw.jco.JCO;public class CallQuery {public static void main(String[] args) {SapConn sc = new SapConn();sc.host="192.168.0.140";sc.clientId = "001";sc.userName = "dev";sc.password = "d123456";sc.lang = "zh";sc.sysnr="000";/*以上都是連接SAP須要的信息,登錄SAP GUI也須要這些。就不多解釋了*/String tpl = "name:%s,age:%s";sc.connect();//創(chuàng)建連接String function1 = "Z_TEST_1";sc.regFunction(function1,function1); //注冊并獲取一個FunctionString zname = "C1";sc.setImport("DZNAME",zname); //設置輸入?yún)?shù)sc.execute();JCO.Table imt = sc.getTable("OUTT"); //獲取Function Tables中的數(shù)據(jù)System.out.println("-------依據(jù)條件"+zname+"查詢-----------");do{Object name = imt.getValue("ZNAME");Object age = imt.getValue("ZAGE");System.out.println(String.format(tpl, name,age));}while(imt.nextRow());System.out.println("-------不依據(jù)條件查詢-----------");sc.regFunction(function1,function1); //注冊并獲取一個Functionsc.execute();imt = sc.getTable("OUTT"); //獲取Function Tables中的數(shù)據(jù)do{Object name = imt.getValue("ZNAME");Object age = imt.getValue("ZAGE");System.out.println(String.format(tpl, name,age));}while(imt.nextRow());sc.disconnect();} }運行結果例如以下:
?
以上,簡單的RFC程序開發(fā)與外部程序調(diào)用就完畢了,歡迎大家一起交流.
?
?
以下再總結一些外部程序調(diào)用的異常情況.
?
動態(tài)鏈接庫未載入
Exceptionin thread "main" java.lang.ExceptionInInitializerError:JCO.classInitialize(): Could not load middleware layer'com.sap.mw.jco.rfc.MiddlewareRFC' JCO.nativeInit():Could not initialize dynamic link library sapjcorfc [no sapjcorfc injava.library.path]. java.library.path[D:\work\wms\jdk1.6.0_26\jre\bin;C:\WINDOWS\Sun\Java\bin;C:\WINDOWS\system32;C:\WINDOWS;E:/jdk15/BIN/../jre/bin/client;E:/jdk15/BIN/../jre/bin;E:/jdk15/BIN/../jre/lib/i386;d:\app\berr\product\11.2.0\client_1\bin;E:\jdk15\BIN;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\WINDOWS\System32\WindowsPowerShell\v1.0\;D:\eclipse-jee-indigo-SR2-win32\eclipse;;.]atcom.sap.mw.jco.JCO.<clinit>(JCO.java:776)at SapConn.connect(SapConn.java:26)at CallInsert.main(CallInsert.java:18)解決方式:將sapjcorfc.dll,librfc32.dll 載入到JDK動態(tài)鏈接庫中。最簡單的辦法及拷貝到JAVA_HOME/bin文件夾下.
?
?
RFC 未開啟遠程調(diào)用
Exceptionin thread "main" com.sap.mw.jco.JCO$Exception: (104)RFC_ERROR_SYSTEM_FAILURE: The function module "Z_TEST_2" cannot beused for 'remote' calls.atcom.sap.mw.jco.rfc.MiddlewareRFC$Client.nativeExecute(NativeMethod)at com.sap.mw.jco.rfc.MiddlewareRFC$Client.execute(MiddlewareRFC.java:1242)atcom.sap.mw.jco.JCO$Client.execute(JCO.java:3816)atcom.sap.mw.jco.JCO$Client.execute(JCO.java:3261)at SapConn.execute(SapConn.java:82)at CallQuery.main(CallQuery.java:30)解決方式:開啟遠程調(diào)用就可以.
?
?
以上。希望大家交流交流! 本人郵箱:berr@live.cn ?,博客不能上傳附件,須要Java源代碼的能夠Email我。
?
?Java 源代碼已上傳?http://download.csdn.net/detail/iberr/8133125.
?
?
版權聲明:本文博主原創(chuàng)文章,博客,未經(jīng)同意不得轉載。
轉載于:https://www.cnblogs.com/zfyouxi/p/4805179.html
總結
以上是生活随笔為你收集整理的SAP RFC 函数来创建 Java呼叫 学习总结 一步一步的插图的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 新篇章
- 下一篇: pptpd免radius限速、限连接+自