• Java连接Sap系统调并调用RFC函数


    参考博客: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");

    abap菜鸟,记录学习笔记。才疏学浅,如有错误,请直接在评论区留言。
  • 相关阅读:
    Ubuntu:替换DASH图标
    使用 python 操作 mongodb 常用的操作
    boost Asio网络编程简介
    optional的使用
    boost中Function和Lambda的使用
    boost多线程入门介绍
    boost中bind的使用
    c++11新标准for循环和lambda表达式
    使用gcc命令编译多个文件
    编辑gif
  • 原文地址:https://www.cnblogs.com/freeandeasy/p/11345079.html
Copyright © 2020-2023  润新知