首页 > 技术文章 > java后台调用 SAP RFC的配置和调用

LilLazy 2021-04-07 13:59 原文

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的方法,第二个方法就是多了输入参数的表。

 

 

推荐阅读