java后台调用 SAP RFC 第二种方法

由于物流看板和人资报表的 SAP 系统不一样,调用的地址就需要配置两个,但是用上次的方法会导致冲突 ,无法同时使用!后面又重新找了一个方法!该引入的包还是一样的,只是这次使用的 java类不一样,如下图:这次使用 方法二,
图片

看代码:
package com.towery.utils;
import java.io.File;  
import java.io.FileOutputStream;  
import java.io.IOException;
import java.util.Properties;  
  
import org.apache.log4j.Logger;  
import com.sap.conn.jco.JCoDestination;  
import com.sap.conn.jco.JCoDestinationManager;  
import com.sap.conn.jco.JCoException;  
import com.sap.conn.jco.ext.DestinationDataProvider;

public class HrSAPConn {
private static final String ABAP_AS_POOLED = "HR";  
    static{  

    //以下这段是在代码中直接设置 sap 的信息,但是不合理,应该使用配置文件的形式  所以注释了,但是也要知道怎么在代码里面写
       /* Properties connectProperties = new Properties();    
        connectProperties.setProperty(DestinationDataProvider.JCO_ASHOST, "10.5.60.100");//服务器  
        connectProperties.setProperty(DestinationDataProvider.JCO_SYSNR,  "00");        //系统编号  
        connectProperties.setProperty(DestinationDataProvider.JCO_CLIENT, "260");       //SAP集团  
        connectProperties.setProperty(DestinationDataProvider.JCO_USER,   "ek1460");  //SAP用户名  
        connectProperties.setProperty(DestinationDataProvider.JCO_PASSWD, "321456");     //密码  
        connectProperties.setProperty(DestinationDataProvider.JCO_LANG,   "ZH");        //登录语言  
        connectProperties.setProperty(DestinationDataProvider.JCO_POOL_CAPACITY, "3");  //最大连接数    
        connectProperties.setProperty(DestinationDataProvider.JCO_PEAK_LIMIT, "10");     //最大连接线程  
*/          
   
   
        createDataFile(ABAP_AS_POOLED, "jcoDestination", HrSAPConn.loadProperties());  
    }  
    
    public static Properties loadProperties() {     // 加载配置文件
   
    HrSAPConn manager = new HrSAPConn();
Properties prop = new Properties();
try {
prop.load(manager.getClass().getResourceAsStream("/hr_rfc_conf.properties"));
} catch (IOException e) {
e.printStackTrace();
}
return prop;
}
      
    /** 
     * 创建SAP接口属性文件。 
     * @param name  ABAP管道名称 
     * @param suffix    属性文件后缀 
     * @param properties    属性文件内容 
     */  
    private static void createDataFile(String name, String suffix, Properties properties){  
        File cfg = new File(name+"."+suffix);  
        if(cfg.exists()){  
            cfg.deleteOnExit();  
        }  
        try{  
            FileOutputStream fos = new FileOutputStream(cfg, false);  
            properties.store(fos, "for tests only !");  
            fos.close();  
        }catch (Exception e){  
            log.error("Create Data file fault, error msg: " + e.toString());  
            throw new RuntimeException("Unable to create the destination file " + cfg.getName(), e);  
        }  
    }  
      
    /** 
     * 获取SAP连接 
     * @return  SAP连接对象 
     */  
    public static JCoDestination connect(){   //连接就是这里了
        JCoDestination destination =null;  
        try {  
            destination = JCoDestinationManager.getDestination(ABAP_AS_POOLED);  
        } catch (JCoException e) {  
            log.error("Connect SAP fault, error msg: " + e.toString());  
        }  
        return destination;  
    }  
    private static Logger log = Logger.getLogger(HrSAPConn.class); // 初始化日志对象  
}

有了这个类 ,接下来看看如何在代码中调用这个类,用这个类和第一种方法的调用有些不一样 

JCoDestination destination = HrSAPConn.connect(); //获得和sap系统的连接

 try{   
// 这句话会有异常需要捕获   
JCoFunction function = destination.getRepository().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",userNum); //
       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函数中的条件参数
      
      if(!burkNum.equals("") && burkNum != null){
   
       tableInS.appendRow();//添加一行
       tableInS.setValue("FIELDNAME","BUKRS");
       tableInS.setValue("OPTION","EQ");
        tableInS.setValue("ANDOR","AND");
       tableInS.setValue("LOW",burkNum);
      }
      if(!areaNum.equals("") && areaNum != null){
        tableInS.appendRow();//添加一行
        tableInS.setValue("FIELDNAME","SOBJID");
        tableInS.setValue("OPTION","EQ");
        tableInS.setValue("ANDOR","AND");
       tableInS.setValue("LOW",areaNum);
       }
       // 执行RFC
      function.execute(destination);  // 执行方法和第一种不一样
                .....
                ....
 
         }catch (JCoException e) {  
           // TODO Auto-generated catch block  
           e.printStackTrace();  
           return null;
 } 

以上加颜色的三个地方就是和第一种方法的区别,其他参数的设置和获取基本都是一样的 ! 用这种方法就可以 同时在一个后台中连接两个sap 系统 而不会冲突! 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值