1.首先需要在SAP事务码SE37中新建一个可以被远程调用的RFC

事务码:SE37

新建一个函数组:输入事务码SE37回车后,来到函数构建器屏幕,到上面一排菜单栏:转到 -> 函数组 -> 创建组

 

输入描述信息,方便以后使用,以后功能相似的函数都可以放到该函数组下

 

 函数组创建完毕后,回到SE37初始界面,创建函数,键入函数名后,点击创建按钮

在属性页签下,输入函数的描述,将远程启用的模块选上

 

 

在导入导出参数页签下设置输入输出参数(远程调用模块的注入,输出),要注意参考类型,可选性和传递值

 

 

在源代码中

 1 FUNCTION zchenh001.
 2 *"----------------------------------------------------------------------
 3 *"*"局部接口:
 4 *"  IMPORTING
 5 *"     VALUE(P1) TYPE  INT4 DEFAULT 0
 6 *"     VALUE(P2) TYPE  INT4 DEFAULT 0
 7 *"     VALUE(OPERATOR) TYPE  CHAR1 DEFAULT '+'
 8 *"  EXPORTING
 9 *"     VALUE(RESULT) TYPE  INT4
10 *"     VALUE(MSG) TYPE  CHAR255
11 *"----------------------------------------------------------------------
12   DATA:err_text TYPE string,
13        e TYPE REF TO cx_root.
14   TRY .
15     CASE operator.
16       WHEN '+'.       result = p1 + p2.
17       WHEN '-'.       result = p1 - p2.
18       WHEN '*'.       result = p1 * p2.
19       WHEN '/'.       result = p1 / p2.
20       WHEN OTHERS.
21         CONCATENATE '操作符' operator ',SAP无法识别' into msg.
22     ENDCASE.
23     CATCH cx_root INTO e.
24       err_text = e->get_text( ).
25       msg = err_text.
26 
27   ENDTRY.
28 
29 ENDFUNCTION.

 在SAP中测试如下:

测试一:

 测试二:

 

测试三:

测试四:

 

 接下来需要下载连接SAP的驱动sapjco3.jar包,

本处提供下载:sapjco3.jar

  解压密码:1187163927

激活后可以在SAP内部测试 ,至此SAP部分已完成

 

2在eclipse(myeclipse)新建的项目中将sapjco3.jar导入,记得build path.

  打开该项目树状图,将下载好的sapjco3.jar直接拖到该项目中,然后鼠标左键选中该文件,右键Build Path即可。

 2.1 配置与SAP系统的连接(此处最好在SAP系统中新建一个RFC用户)

 1 package com.cee.conn;
 2 
 3 import java.io.File;
 4 import java.io.FileOutputStream;
 5 import java.util.Properties;
 6 import java.util.logging.Logger;
 7 
 8 import com.sap.conn.jco.JCoDestination;
 9 import com.sap.conn.jco.JCoDestinationManager;
10 import com.sap.conn.jco.JCoException;
11 import com.sap.conn.jco.ext.DestinationDataProvider;
12 
13 /**
14  * 与SAP连接配置
15  * 
16  * @author jay
17  */
18 public class SAPConn {
19     private static final String ABAP_AS_POOLED = "ABAP_AS_WITH_POOL";
20     static {
21         Properties connectProperties = new Properties();
22         connectProperties.setProperty(DestinationDataProvider.JCO_ASHOST, "xxxx.xxxx.xxxx.xxxx");// 服务器
23         connectProperties.setProperty(DestinationDataProvider.JCO_SYSNR, "xx"); // 系统编号
24         connectProperties.setProperty(DestinationDataProvider.JCO_CLIENT, "xxx"); // SAP集团
25         connectProperties.setProperty(DestinationDataProvider.JCO_USER, "xxxx"); // SAP用户名
26         connectProperties.setProperty(DestinationDataProvider.JCO_PASSWD, "xxxxx"); // 密码
27         connectProperties.setProperty(DestinationDataProvider.JCO_LANG, "ZH"); // 登录语言:ZH EN
28         connectProperties.setProperty(DestinationDataProvider.JCO_POOL_CAPACITY, "3"); // 最大连接数
29         connectProperties.setProperty(DestinationDataProvider.JCO_PEAK_LIMIT, "10"); // 最大连接线程
30 
31         createDataFile(ABAP_AS_POOLED, "jcoDestination", connectProperties);
32     }
33 
34     /**
35      * 创建SAP接口属性文件。
36      * 
37      * @param name
38      *            ABAP管道名称
39      * @param suffix
40      *            属性文件后缀
41      * @param properties
42      *            属性文件内容
43      */
44     private static void createDataFile(String name, String suffix, Properties properties) {
45         File cfg = new File(name + "." + suffix);
46         if (cfg.exists()) {
47             cfg.deleteOnExit();
48         }
49         try {
50             FileOutputStream fos = new FileOutputStream(cfg, false);
51             properties.store(fos, "for tests only !");
52             fos.close();
53         } catch (Exception e) {
54             System.out.println("Create Data file fault, error msg: " + e.toString());
55             throw new RuntimeException("Unable to create the destination file " + cfg.getName(), e);
56         }
57     }
58 
59     /*
60      * * 获取SAP连接
61      * 
62      * @return SAP连接对象
63      */
64     public static JCoDestination connect() {
65         JCoDestination destination = null;
66         try {
67             destination = JCoDestinationManager.getDestination(ABAP_AS_POOLED);
68         } catch (JCoException e) {
69             System.out.println("Connect SAP fault, error msg: " + e.toString());
70         }
71         return destination;
72     }
73 }

2.2 在java代码中测试连接

 1 package com.cee.test;
 2 import java.io.ObjectInputStream.GetField;
 3 import com.cee.conn.SAPConn;
 4 import com.sap.conn.jco.JCoDestination;
 5 import com.sap.conn.jco.JCoFunction;
 6 import com.sap.conn.jco.JCoParameterList;
 7 import com.sap.conn.jco.JCoTable;
 8 
 9 public class CheckSnFromSAP {
10     public static void main(String[] args) {
11         JCoFunction function = null;
12         JCoDestination destination = SAPConn.connect();
13         int result=0;//调用接口返回状态
14         String message="";//调用接口返回信息
15         try {
16             //调用ZCHENH001函数
17             function = destination.getRepository().getFunction("ZCHENH001");
18             JCoParameterList input = function.getImportParameterList();
19             input.setValue("P1", 10);
20             input.setValue("P2", 2);
21             input.setValue("OPERATOR", "?"); // 输入参数
22             function.execute(destination);
23             result= function.getExportParameterList().getInt("RESULT");//调用接口返回结果
24             message= function.getExportParameterList().getString("MSG");//调用接口返回信息 
25             System.out.println("调用返回结果--->"+result+";调用返回状态--->"+message);
26         }catch (Exception e) {
27             e.printStackTrace();
28         }
29     }
30 }

运行结果如下:

测试一: 注入参数分别为:10,2,?

    

测试二: 注入参数分别为:10,2,/

    

 

JAVA调用SAP多个环境数据

1.生成通用配置文件

  1 import java.io.File;
  2 import java.io.FileOutputStream;
  3 import java.util.Properties;
  4 import com.sap.conn.jco.JCoDestination;
  5 import com.sap.conn.jco.JCoDestinationManager;
  6 import com.sap.conn.jco.JCoException;
  7 import com.sap.conn.jco.ext.DestinationDataProvider;
  8 
  9 /**
 10  * 与SAP连接配置
 11  *
 12  * @author 陈辉
 13  * @version v1.01
 14  * 
 15  */
 16 public class SAPConn {
 17     private static final String S4I100 = "ABAP_AS_WITH_POOL_S4DI00";
 18     private static final String S4D100 = "ABAP_AS_WITH_POOL_S4D100";
 19     private static final String S4D200 = "ABAP_AS_WITH_POOL_S4D200";
 20     private static final String S4D360 = "ABAP_AS_WITH_POOL_S4D360";
 21     private static final String S4Q800 = "ABAP_AS_WITH_POOL_S4Q800";
 22     private static final String S4P800 = "ABAP_AS_WITH_POOL_S4P800";
 23     static {
 24         Properties connectProperties = new Properties();
 25 
 26         connectProperties.setProperty(DestinationDataProvider.JCO_ASHOST, "xxxx.xxxx.xxxx");// 服务器
 27         connectProperties.setProperty(DestinationDataProvider.JCO_SYSNR, "xx"); // 系统编号
 28         connectProperties.setProperty(DestinationDataProvider.JCO_CLIENT, "xxx"); // SAP集团
 29         connectProperties.setProperty(DestinationDataProvider.JCO_USER, "XXXX"); // SAP用户名
 30         connectProperties.setProperty(DestinationDataProvider.JCO_PASSWD, "XXXXXXXX"); // 密码
 31         connectProperties.setProperty(DestinationDataProvider.JCO_LANG, "ZH"); // 登录语言:ZH EN
 32         connectProperties.setProperty(DestinationDataProvider.JCO_POOL_CAPACITY, "3"); // 最大连接数
 33         connectProperties.setProperty(DestinationDataProvider.JCO_PEAK_LIMIT, "10"); // 最大连接线程
 34         createDataFile(S4I100, "jcoDestination", connectProperties);
 35 
 36         connectProperties.setProperty(DestinationDataProvider.JCO_ASHOST, "xxxx.xxxx.xxxx");// 服务器
 37         connectProperties.setProperty(DestinationDataProvider.JCO_SYSNR, "xx"); // 系统编号
 38         connectProperties.setProperty(DestinationDataProvider.JCO_CLIENT, "xxx"); // SAP集团
 39         connectProperties.setProperty(DestinationDataProvider.JCO_USER, "XXXX"); // SAP用户名
 40         connectProperties.setProperty(DestinationDataProvider.JCO_PASSWD, "XXXXXXXX"); // 密码
 41         connectProperties.setProperty(DestinationDataProvider.JCO_LANG, "ZH"); // 登录语言:ZH EN
 42         connectProperties.setProperty(DestinationDataProvider.JCO_POOL_CAPACITY, "3"); // 最大连接数
 43         connectProperties.setProperty(DestinationDataProvider.JCO_PEAK_LIMIT, "10"); // 最大连接线程
 44         createDataFile(S4D100, "jcoDestination", connectProperties);
 45 
 46         connectProperties.setProperty(DestinationDataProvider.JCO_ASHOST, "xxxx.xxxx.xxxx");// 服务器
 47         connectProperties.setProperty(DestinationDataProvider.JCO_SYSNR, "xx"); // 系统编号
 48         connectProperties.setProperty(DestinationDataProvider.JCO_CLIENT, "xxx"); // SAP集团
 49         connectProperties.setProperty(DestinationDataProvider.JCO_USER, "XXXX"); // SAP用户名
 50         connectProperties.setProperty(DestinationDataProvider.JCO_PASSWD, "XXXXXXXX"); // 密码
 51         connectProperties.setProperty(DestinationDataProvider.JCO_LANG, "ZH"); // 登录语言:ZH EN
 52         connectProperties.setProperty(DestinationDataProvider.JCO_POOL_CAPACITY, "3"); // 最大连接数
 53         connectProperties.setProperty(DestinationDataProvider.JCO_PEAK_LIMIT, "10"); // 最大连接线程
 54         createDataFile(S4D200, "jcoDestination", connectProperties);
 55 
 56         connectProperties.setProperty(DestinationDataProvider.JCO_ASHOST, "xxxx.xxxx.xxxx");// 服务器
 57         connectProperties.setProperty(DestinationDataProvider.JCO_SYSNR, "xx"); // 系统编号
 58         connectProperties.setProperty(DestinationDataProvider.JCO_CLIENT, "xxx"); // SAP集团
 59         connectProperties.setProperty(DestinationDataProvider.JCO_USER, "XXXX"); // SAP用户名
 60         connectProperties.setProperty(DestinationDataProvider.JCO_PASSWD, "XXXXXXXX"); // 密码
 61         connectProperties.setProperty(DestinationDataProvider.JCO_LANG, "ZH"); // 登录语言:ZH EN
 62         connectProperties.setProperty(DestinationDataProvider.JCO_POOL_CAPACITY, "3"); // 最大连接数
 63         connectProperties.setProperty(DestinationDataProvider.JCO_PEAK_LIMIT, "10"); // 最大连接线程
 64         createDataFile(S4D360, "jcoDestination", connectProperties);
 65 
 66         connectProperties.setProperty(DestinationDataProvider.JCO_ASHOST, "xxxx.xxxx.xxxx");// 服务器
 67         connectProperties.setProperty(DestinationDataProvider.JCO_SYSNR, "xx"); // 系统编号
 68         connectProperties.setProperty(DestinationDataProvider.JCO_CLIENT, "xxx"); // SAP集团
 69         connectProperties.setProperty(DestinationDataProvider.JCO_USER, "XXXX"); // SAP用户名
 70         connectProperties.setProperty(DestinationDataProvider.JCO_PASSWD, "XXXXXXXX"); // 密码
 71         connectProperties.setProperty(DestinationDataProvider.JCO_LANG, "ZH"); // 登录语言:ZH EN
 72         connectProperties.setProperty(DestinationDataProvider.JCO_POOL_CAPACITY, "3"); // 最大连接数
 73         connectProperties.setProperty(DestinationDataProvider.JCO_PEAK_LIMIT, "10"); // 最大连接线程
 74         createDataFile(S4Q800, "jcoDestination", connectProperties);
 75 
 76         // 组登录
 77         connectProperties.setProperty(DestinationDataProvider.JCO_R3NAME, "S4P");// SYSTEM ID
 78         connectProperties.setProperty(DestinationDataProvider.JCO_MSHOST, "10.10.10.10");// 服务器
 79         connectProperties.setProperty(DestinationDataProvider.JCO_MSSERV, "3601"); // Message Server 服务端口
 80         connectProperties.setProperty(DestinationDataProvider.JCO_GROUP, "S4P"); // 组名称
 81         connectProperties.setProperty(DestinationDataProvider.JCO_CLIENT, "800"); // SAP集团
 82         connectProperties.setProperty(DestinationDataProvider.JCO_USER, "XXXXXX"); // SAP用户名
 83         connectProperties.setProperty(DestinationDataProvider.JCO_PASSWD, "XXXXXX"); // 密码
 84         connectProperties.setProperty(DestinationDataProvider.JCO_LANG, "ZH"); // 登录语言:ZH EN
 85         connectProperties.setProperty(DestinationDataProvider.JCO_POOL_CAPACITY, "3"); // 最大连接数
 86         connectProperties.setProperty(DestinationDataProvider.JCO_PEAK_LIMIT, "10"); // 最大连接线程
 87         connectProperties.setProperty(DestinationDataProvider.JCO_MAX_GET_TIME, "360"); // 最大连接时间
 88         connectProperties.setProperty(DestinationDataProvider.JCO_SAPROUTER, "");// ROUTER
 89         createDataFile(S4P800, "jcoDestination", connectProperties);
 90     }
 91 
 92     /**
 93      * 创建SAP接口属性文件。
 94      *
 95      * @param name       ABAP管道名称
 96      * @param suffix     属性文件后缀
 97      * @param properties 属性文件内容
 98      */
 99     private static void createDataFile(String name, String suffix, Properties properties) {
100         File cfg = new File(name + "." + suffix);
101         if (cfg.exists()) {
102             cfg.deleteOnExit();
103         }
104         try {
105             FileOutputStream fos = new FileOutputStream(cfg, false);
106             properties.store(fos, "仅仅测试使用");
107             fos.close();
108         } catch (Exception e) {
109             System.out.println("创建参数配置文件失败: " + e.toString());
110             throw new RuntimeException("无法创建创建参数文件:" + cfg.getName(), e);
111         }
112     }
113 
114     /*
115      * * 获取SAP连接
116      *
117      * @return SAP连接对象
118      */
119     public static JCoDestination connect(String SYSTEM) {
120         JCoDestination destination = null;
121         try {
122             switch (SYSTEM) {
123             case "S4I100":
124                 destination = JCoDestinationManager.getDestination(S4I100);
125                 break;
126             case "S4D100":
127                 destination = JCoDestinationManager.getDestination(S4D100);
128                 break;
129             case "S4D200":
130                 destination = JCoDestinationManager.getDestination(S4D200);
131                 break;
132             case "S4D360":
133                 destination = JCoDestinationManager.getDestination(S4D360);
134                 break;
135             case "S4Q800":
136                 destination = JCoDestinationManager.getDestination(S4Q800);
137                 break;
138             case "S4P800":
139                 destination = JCoDestinationManager.getDestination(S4P800);
140                 break;
141             default:
142                 destination = JCoDestinationManager.getDestination(S4D360);
143                 break;
144             }
145             System.out.println("已经连接到SAP: " + SYSTEM + "环境...");
146         } catch (JCoException e) {
147             System.out.println("无法连接到SAP: " + e.toString());
148         }
149         return destination;
150     }
151 }
View Code

2.调用测试RFC_READ_TABLE

 1 import com.sap.conn.jco.JCoDestination;
 2 import com.sap.conn.jco.JCoField;
 3 import com.sap.conn.jco.JCoFunction;
 4 import com.sap.conn.jco.JCoParameterList;
 5 import com.sap.conn.jco.JCoTable;
 6 
 7 public class FM_RFC_READ_TABLE {
 8     enum SAP_SYSTEM {
 9         S4I100, S4D100, S4D200, S4D360, S4Q800, S4P800,
10     }
11 
12     public static void main(String[] args) {
13         JCoFunction function = null;
14         JCoDestination destination = SAPConn.connect(SAP_SYSTEM.S4I100.toString());
15         try {
16             function = destination.getRepository().getFunction("RFC_READ_TABLE");
17             JCoParameterList input = function.getImportParameterList();
18             input.setValue("QUERY_TABLE", "T001");// 表名
19             input.setValue("DELIMITER", ";");// 查询分隔符
20             input.setValue("ROWCOUNT", "100");// 条目数
21 
22             JCoTable OPTIONS = function.getTableParameterList().getTable("OPTIONS");
23             OPTIONS.appendRow();
24             OPTIONS.setValue("TEXT", "BUKRS > 1000 AND LAND1 = 'CN' ");// 条件
25 
26             JCoTable FIELDS = function.getTableParameterList().getTable("FIELDS");
27             FIELDS.appendRow();
28             FIELDS.setValue("FIELDNAME", "MANDT");
29             FIELDS.appendRow();
30             FIELDS.setValue("FIELDNAME", "BUKRS");
31             FIELDS.appendRow();
32             FIELDS.setValue("FIELDNAME", "BUTXT");
33             FIELDS.appendRow();
34             FIELDS.setValue("FIELDNAME", "ORT01");
35             // 其他字段...
36 
37             function.execute(destination);
38             FIELDS = function.getTableParameterList().getTable("FIELDS");
39 
40             for (int i = 0; i < FIELDS.getNumRows(); i++) {
41                 FIELDS.setRow(i);
42                 for (JCoField fields : FIELDS) {
43                     if (fields.getName().toString().equals("FIELDNAME")) {
44                         System.out.print(String.format("%s\t", fields.getValue()));
45                     }
46                 }
47             }
48             System.out.println();
49             JCoTable DATA = function.getTableParameterList().getTable("DATA");// 调用接口返回信息
50             for (int i = 0; i < DATA.getNumRows(); i++) {
51                 DATA.setRow(i);
52                 for (JCoField fields : DATA) {
53                     String[] field = fields.getValue().toString().split(";");
54                     for (int j = 0; j < field.length; j++) {
55                         System.out.print(String.format("%s\t", field[j]));
56                     }
57                 }
58                 System.out.println();
59             }
60         } catch (Exception e) {
61             e.printStackTrace();
62         }
63     }
64 
65 }