参考博客:https://blog.csdn.net/qq_36026747/article/details/81287462
https://www.cnblogs.com/jiangzhengjun/p/4291479.html
安装jco
链接:https://pan.baidu.com/s/1t5Lr_12JgGnNYBqLdO6yQA
提取码:5hff
解压之后,进入安装目录:执行cmd执行 java -jar sapjco3.jar ;
显示以下图片,则安装成功。
创建RFC函数:
编写Java代码:
配置好Jvm后,将刚才jco3目录中的 sapjco3.jar 和 sapjco3.dll 放入lib 包中。
package sapConnection2; import java.io.File; import java.io.FileOutputStream; import java.util.Properties; import com.sap.conn.jco.ext.DestinationDataProvider; public class ConnectPooled {// 连接池 static String ABAP_AS_POOLED = "ConnectionPool"; //配置文件名 static { Properties connectProperties = new Properties(); connectProperties.setProperty(DestinationDataProvider.JCO_ASHOST, "xxx.xxx.x.xxx"); // IP connectProperties.setProperty(DestinationDataProvider.JCO_SYSNR, "xx"); // 系统编号 connectProperties.setProperty(DestinationDataProvider.JCO_CLIENT, "xxx"); // 客户端编号 connectProperties.setProperty(DestinationDataProvider.JCO_USER, "xxxx"); // 用户名 connectProperties.setProperty(DestinationDataProvider.JCO_PASSWD, "xxxxxx"); // 密码 connectProperties.setProperty(DestinationDataProvider.JCO_LANG, "ZH"); // 语言// *********连接池方式与直接不同的是设置了下面两个连接属性******* // JCO_PEAK_LIMIT - 同时可创建的最大活动连接数,0表示无限制,默认为JCO_POOL_CAPACITY的值 // 如果小于JCO_POOL_CAPACITY的值,则自动设置为该值,在没有设置JCO_POOL_CAPACITY的情况下为0 connectProperties.setProperty(DestinationDataProvider.JCO_PEAK_LIMIT, "10"); // JCO_POOL_CAPACITY - 空闲连接数,如果为0,则没有连接池效果,默认为1 connectProperties.setProperty(DestinationDataProvider.JCO_POOL_CAPACITY, "2"); createDataFile(ABAP_AS_POOLED, "jcoDestination", connectProperties); } /* 创建连接池的配置文件 */ static void createDataFile(String name, String suffix, Properties properties) { File cfg = new File(name + "." + suffix); if (!cfg.exists()) { try { FileOutputStream fos = new FileOutputStream(cfg, false); properties.store(fos, "for tests only !"); fos.close(); } catch (Exception e) { e.printStackTrace(); } } } }
测试代码:
package sapConnection2; import com.sap.conn.jco.JCoDestination; import com.sap.conn.jco.JCoDestinationManager; import com.sap.conn.jco.JCoException; import com.sap.conn.jco.JCoFunction; import com.sap.conn.jco.JCoParameterList; import com.sap.conn.jco.JCoRepository; /* * JCoFunction包含importing参数,exporting参数,changing参数,table参数。 * 分别使用getImportParameterList方法,getExportParameterList方法, getChangingParameterList方法和getTableParameterList获得。 * 这些方法的返回值都是JCoParameter类型 */ public class ConnectPooledTest { public static void main(String[] args) throws JCoException { String bapiFunctionName = "ZPOP_NUMBER"; JCoDestination destination = JCoDestinationManager.getDestination(ConnectPooled.ABAP_AS_POOLED); JCoRepository repository = destination.getRepository(); //JCoFunction是一个接口,代表SAP系统的函数库 JCoFunction function = repository.getFunction(bapiFunctionName); // 从这个函数模板获得该SAP函数的对象 JCoParameterList input = function.getImportParameterList(); // 获得函数的import参数列表 input.setValue("INPUT_NUMB1", 2); input.setValue("INPUT_NUMB2", 2); function.execute(destination); JCoParameterList output = function.getExportParameterList(); // 获得Export变量列表。 int value = output.getInt("OUTPUT_NUMB"); System.out.println(value); } }
报错:
Exception in thread "main" com.sap.conn.jco.JCoException: (102) JCO_ERROR_COMMUNICATION: Connect to SAP gateway failed
Connection parameters: TYPE=A DEST=ConnectionPool ASHOST=192.168.1.112 SYSNR=00 PCS=1
可能缺少路由器字符串,在ConnectPooled类中添加:
connectProperties.setProperty(DestinationDataProvider.JCO_SAPROUTER, "xxxxxxxxx");