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

来源:互联网 发布:形容不出门知天下事 编辑:程序博客网 时间:2024/05/29 02:47
  RFC  刚刚听到这个名称的时候只有一种感觉: 什么鬼?  后来百度了一下 ,来看看官方的解释:
    RFC是SAP系统和其他(SAP或非SAP)系统间的一个重要而常用的双向接口技术,也被视为SAP与外部通信的基本协议。简单地说,RFC过程就是系统调用当前系统外的程序模块!
    RFC 是英文缩写,全称:Remote Function Call  ,远程功能调用 ! anyway , 不管他,现在来看看如何配置:
我是从其他项目中整合到 现有的项目中去,所以基本只是复制黏贴:
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. 难点在于,参数比较复杂! 第一感觉就是,这是什么SHIT ! 直接上代码:

           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(); //移动到下一行
            }

  好了,以上就是遇到的两种调用RFC的情况! 第二种就是多了输入参数的表,也要懂得写 ! that's all thank you !
     
0 0
原创粉丝点击