java后台调用 SAP RFC的配置和调用

RFC是SAP系统和其他(SAP或非SAP)系统间的一个重要而常用的双向接口技术,也被视为SAP与外部通信的基本协议。简单地说,RFC过程就是系统调用当前系统外的程序模块!

    RFC 是英文缩写,全称:Remote Function Call  ,远程功能调用 !

配置:

1、依赖包:把一下两个依赖包放到lib文件夹下,相应的添加到路径中去。
图片

2. 配置文件:用来配置 sap 地址等信息 

图片
文件里的内容如下:
图片
3.复制工具类,这两个非常重要,有这两个就可以直接在代码里面调用SAP了
图片
以上都配置好之后,基本就可以在代码中使用了! 接下来看看如何调用RFC , 两种情况:

1. 简单的RFC调用  ,这种情况参数比较简单,入参传入几个,出参是一个表,只要根据表结构就可以取值 :
         JCoFunction function = RfcManager.getFunction(" ZRFC_ISR_GET_CCAPP ");   //RFC 名称
            // 设置import 参数
         JCoParameterList importParam = function.getImportParameterList();  //获得入参
             //以下这些是调用该RFC所需要的参数 
            importParam.setValue("I_ZAREA","ALL"); //区域 ALL 代表全部的公司
            importParam.setValue("I_ZTMON",""); //月份
            //importParam.setValue("I_ZWEEKS","");//周数
            importParam.setValue("I_DATUM","");//日期
             // 执行RFC
            RfcManager.execute(function);

            // 获取RFC返回的字段值
            JCoParameterList exportParam = function.getExportParameterList();
            JCoParameterList exportTable= function.getTableParameterList();

            JCoTable getTable1 = exportTable.getTable(" ET_ZDIELG "); // 这是调用后 RFC 返回的表名
           
             boolean loopFlag1 = !getTable1.isEmpty();  //判断 这张表中有木有数据

            while(loopFlag1){ //循环获取数据  
                  getAreaNum = getTable1.getString("ZAREA");  //根据表字段来获取值
                 getAreaName = getTable1.getString("ZQYMS");
                //areaSize = getTable1.getString("ZCCMJ"); 
                //areaPeoNum = getTable1.getString("ZCCRY");
                HashMap<String,String> hm= new HashMap<String,String>();
                hm.put("areanum", getAreaNum);
                hm.put("areaname", getAreaName);
                list.add(hm);
                 loopFlag1 = getTable1.nextRow(); // 移动到下一行
            }
        就是这么简单粗暴,入参的值设置一下就好了,返回一张表,根据字段取数就好了! 接下来说一下难的 !

2. 参数比较复杂:
           JCoFunction function = RfcManager.getFunction("ZRFC_HR_READ_TABLE"); //人力资源报表
         // 设置import 参数
         JCoParameterList importParam = function.getImportParameterList();
        
            importParam.setValue("QUERY_TABLE","ZTHR_R004"); //区域 ALL 代表全部的公司
            importParam.setValue("ROWSKIPS","0"); //
            importParam.setValue("ROWCOUNT","0"); //
            importParam.setValue("USERNAME","00002359"); //
            importParam.setValue("ORDER_BY",""); //
             //以上和第一种情况一样,只是普通的设置入参 
           // importParam.setValue("SELECTION","BUKRS 3100"); //
            JCoParameterList inTableParam = function.getTableParameterList();  // 这里又需要数据一张表作为参数
           
             //以下是入参的表
            JCoTable tableInD = inTableParam.getTable("DATA");  
            JCoTable tableInF = inTableParam.getTable("FIELDS");
            JCoTable tableInO = inTableParam.getTable("OPTIONS");
            JCoTable tableInS = inTableParam.getTable("SELECTION");
            
           // JCoTable tableInop = inTableParam.getTable("SELECTION");//得到SAP函数中的条件参数
            tableInS.appendRow(); //添加一行,要给这个表设置参数的时候,需要先添加一行,然后才设置参数,而且参数如下
            tableInS.setValue("FIELDNAME","BUKRS");  //前面是 这个表的字段名,后面是值
            tableInS.setValue("OPTION","EQ");  
            tableInS.setValue("ANDOR","AND");
            tableInS.setValue("LOW",burkNum);
           if(!areaNum.equals("") || areaNum != null){  //如果有两个参数,还要再添加一行,和上面一样
                log.info("有两个参数");
                tableInS.appendRow();//添加一行
                tableInS.setValue("FIELDNAME","SOBJID");
                tableInS.setValue("OPTION","EQ");
                tableInS.setValue("ANDOR","AND");
                 tableInS.setValue("LOW",areaNum);
            }
           
             // 执行RFC
            RfcManager.execute(function);

            // 获取RFC返回的字段值
            JCoParameterList exportParam = function.getExportParameterList();
            JCoParameterList exportTable= function.getTableParameterList();
            //获取返回的表,然而不能像上面一样根据表结构取值,因为表结构和值他又是分开放的,所以十分奇葩 ,
            JCoTable getTable1 = exportTable.getTable("DATA"); 
            boolean loopFlag1 = !getTable1.isEmpty();  
            while(loopFlag1){ //
                HashMap<String,String> dataMap = new HashMap<String,String>(); //新数据里面的 Map 
                String  WA=getTable1.getString("WA");  //返回的只有一个字段 ,所有的值都放在这个里面,所以要去截取
                dataMap.put("店铺类型",WA.substring(248, 258).trim());//店铺类型   用截取的办法,获取对应字段的值
                dataMap.put("核定编制",WA.substring(258, 266).trim());//核定编制
                newlist.add(dataMap);
                loopFlag1 = getTable1.nextRow();  //移动到下一行

            }

以上就是两种调用SAP-RFC的方法,第二个方法就是多了输入参数的表。

  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
调用 SAPRFC 接口,需要使用 SAP 提供的 Java Connector(SAP JCo)库。在使用 SAP JCo 调用 RFC 接口时,需要在 SAP JCo 的配置文件中设置系统 ID(System ID),以便正确地连接到 SAP 系统。 要配置 SAP JCo 的系统 ID,需要进行以下步骤: 1. 打开 SAP JCo 的配置文件 sapjco3.properties,该文件通常位于应用程序的 classpath 下。 2. 在 sapjco3.properties 文件中添加以下配置项: ``` jco.client.sysnr=<系统编号> jco.client.client=<客户端> jco.client.user=<用户名> jco.client.passwd=<密码> jco.client.lang=<语言> jco.client.ashost=<应用服务器主机名> jco.client.saprouter=<SAP 路由器> ``` 其中,<系统编号> 是 SAP 系统的编号,<客户端> 是 SAP 客户端的编号,<用户名> 和 <密码> 是 SAP 用户的登录信息,<语言> 是登录时使用的语言代码,<应用服务器主机名> 是 SAP 应用服务器的主机名,<SAP 路由器> 是可选的 SAP 路由器配置。 3. 在 Java 代码中使用 SAP JCo 的 API 调用 RFC 接口时,可以使用以下代码获取 SAP JCo 的配置信息: ``` JCoDestination destination = JCoDestinationManager.getDestination("<destination>"); ``` 其中,<destination> 是 SAP JCo 的目标名称,可以在 sapjco3.properties 文件中配置。 4. 使用 SAP JCo 的 API 调用 RFC 接口时,需要使用 SAP JCo 的函数模块名称和函数模块的输入参数,例如: ``` JCoFunction function = destination.getRepository().getFunction("<function_module>"); if (function == null) { throw new RuntimeException("<function_module> not found in SAP system."); } function.getImportParameterList().setValue("<parameter_name>", "<parameter_value>"); function.execute(destination); ``` 其中,<function_module> 是 SAP RFC 函数模块的名称,<parameter_name> 和 <parameter_value> 是函数模块的输入参数名称和值。 以上是 Java 调用 SAP RFC 接口配置系统 ID 的基本步骤。具体的配置调用方法可能会因不同的 SAP 系统和 RFC 接口而有所不同,需要根据实际情况进行调整和修改。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值