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 }
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 }
本文来自博客园,作者:Lovemywx2,转载请注明原文链接:https://www.cnblogs.com/1187163927ch/p/8670409.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律