JAVA与SAP-ERP的通信策略

 JAVA与SAP-ERP的通信策略


  现在的java应用系统在公司运行时,常常需要与公司的SAP ERP系统建立通信,采集SAP ERP系统中的基本生产主数据信息。  


 目前主流的交互方式是是用JCO的方式来实现连接。


 JCO是服务于SAP系统和Java系统的RFC中间件,是用Java实现的API,以Jar包的方式发布。应用灵活。实现起来非常简单。


  RFC(远程函数调用 Remote Function Call)是一个 SAP 的接口协议。


  我们从SAP ERP中采集数据,可以把SAP ERP看成是一个数据库。连接到SAP ERP系统的过程主要是


   导入jar包,动态链接库文件,定义连接,建立连接对象,打开连接,调用功能模块,关闭连接。


 准备:


    1 一个sapjco.jar的jar包


     2  两个动态链接库文件librfc32.dll,sapjcorfc.dll


    以上的文件都可以在网上免费下载到。


     3 确认好你要连接的SAP ERP系统的信息。


        SAP ERP系统的参数有


         client=800                   客户端口号
         user=liweiguo             用户名
         passwd=init0330       密码
         lang=                            语言
         ashost=192.168.8.8   sap-erp服务器ip
         sysnr=20                       sap-erp系统实例标识号  相当于oracle 实例的端口号 1521,标识唯一的一个SAP ERP实例   


       SAP-EAP系统中每一个应用实例都有一个不同的系统实例标识号,相当于oracle的一个SID。
       每一个实例可以对应多个不同的客户端口号,不同的客户端口号,控制权限不同。
       每一个客户端口号对应多个不同的用户,同客户端口不同的用户,控制权限也不同。    


实现:


   针对32位 xp系统而言


   1 首先把 librfc32.dll sapjcorfc.dll 放在服务器的系统的C:\WINDOWS\system32文件夹下。


    2 建立一个java 工程 引入sapjco.jar到工程中。


    3 编写连接类


    public class SAPConnectionManager {
         private JCO.Client mConnection;
         private JCO.Repository mRepository;
 /**
  * FuncName: getConnect
  * Description: 创建到SAP函数的连接
  * Author: liwg
  */
 public void getConnect() throws Exception  {
 try {
  InputStream inputStream =
   this.getClass().getResourceAsStream("SAP.properties");


  Properties p = new Properties();
  p.load(inputStream);
  inputStream.close();


  mConnection =
   JCO.createClient(p.getProperty("client"),
     p.getProperty("user"),
     p.getProperty("passwd"),
     p.getProperty("lang"),
     p.getProperty("ashost"),
     p.getProperty("sysnr"));
  System.out.println("创建针对SAP的连接");
  //打开对sap的连接
  mConnection.connect();
  System.out.println("创建针对SAP的连接成功");
  


 }
 catch (Exception e) {
  System.out.println("创建连接信息失败");
  //有异常就停止程序
  System.exit(-1);
 }
 }
 /**
  * FuncName: getConnect
  * Description: 关闭到SAP函数的连接
  * Author: liwg
  */
 public void disConnect() throws Exception  {
  try{
   mConnection.disconnect();
  }catch (Exception e){
   System.out.println("关闭到SAP端的连接失败");
   e.printStackTrace();
  }
  
 }
 
 /**
  * FuncName: createFunction
  * Description: 创建函数,从SAP过数据的必须准备
  * Author: liwg
  */
 private JCO.Function createFunction(String name){
  JCO.Function fc = null;
  try {
   IFunctionTemplate ft = mRepository.getFunctionTemplate(name.toUpperCase());
   fc = ft.getFunction();
  }
  catch (Exception e) {
   System.out.println("创建函数内部函数中出错");
   e.printStackTrace();    
  }
  return fc;
 }
 /**
  * FuncName: getDataFromSAP
  * Description: 根据SAP端函数,获取函数返回的数据结果集
  * SAP端建立的RFC类型的函数为Z_RFC_TRANS_MYMAIN_DATA
  * 函数封装数据返回的Table类型的结果集为 MY_MAINDATE 
  * 一个RFC类型的函数可以返回多个Table类型的结果集对象
  * MY_MAINDATE结果集中的 两个列 NAME AGE
  * Author: liwg
  */
 public void getDataFromSAP() throws Exception {
  JCO.Table fromSapData = null;
  try {
   mRepository = new JCO.Repository("MySAPJco",mConnection);
   JCO.Function func = null;
   func = this.createFunction("Z_RFC_TRANS_MYMAIN_DATA");
   try {
    mConnection.execute(func); 
   
   } catch(Exception e) {
    System.out.println("执行函数出错");
    e.printStackTrace();    
   }
   fromSapData =
    func.getTableParameterList().getTable("MY_MAINDATE");
       //打印结果集
    for ( int i = 0; i < fromSapData.getNumRows(); i++ ) {
     fromSapData.setRow(i);
     if(i%10==0){
      System.out.println(fromSapData.getString("NAME"));
      System.out.println(fromSapData.getString("AGE"));
     }
    }
  } catch(Exception e) {
   System.out.println("对SAP端函数执行出错");
   
  }finally{
   System.out.println("存取执行完成");
  }
 }


}


4 编写执行主类


public class DataController {
 
 public static void main(String args[]){
   try {
  //先进行jco的SAP连接
  SAPConnectionManager sc=new SAPConnectionManager();
  sc.getConnect();
  //调用SAP系统中的方法
  sc.getDataFromSAP();
  //关闭连接
  sc.disConnect();
 } catch (Exception e) {
  e.printStackTrace();
 }
}
}


 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值