zoukankan      html  css  js  c++  java
  • 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菜鸟,记录学习笔记。才疏学浅,如有错误,请直接在评论区留言。
  • 相关阅读:
    手把手教NIS Edit安装向导的使用
    使用HM NIS Edit制作软件安装包
    有哪些适合学习英语的纪录片 ?
    Android入门(一)AndroidStudio下的APP目录结构介绍
    架构和框架的区别
    Git版本控制的快捷方式(GITCHEAT SHEET)
    DOS下启动MySQL时输入net start mysql 提示服务名无效的问题
    个人搜查小问题
    oozie说明(本文参考多处,自己留看)
    oozie fork join结点
  • 原文地址:https://www.cnblogs.com/freeandeasy/p/11345079.html
Copyright © 2011-2022 走看看