0
点赞
收藏
分享

微信扫一扫

JCO连接SAP例子


JCO连接SAP例子

 SAP JCo(SAP Java Connector,SAP Java连接器)是SAP组件和Java应用程序之间的中间件和接口实现机制。
JCo基于JNI(Java Native Interface),建立在RFC协议基础之上,支持SAP服务器端入站(JAVA调用ABAP)及出站(ABAP调用JAVA)数据通信。

使用JCo的机器中必须要安装JRE(JAVA运行时环境)。
将从SAP官方服务站点下载的 JCO文件 sapjco3-ntintel-3.0.0.zip解压,其中有连接组件(sapjco3.dll、sapjco3.jar)以及相关文档和示例。

下面就用JCreator 做一个简单的例子来测试JCO的功能:

1. 环境部署
   在D盘建立一个目录lib,将sapjco3.dll、sapjco3.jar 拷贝到D:\lib下
   打开JCreator,打开菜单:配置--》选项,然后打开JDK配置文件,选中配置文件后点击编辑,然后将D:\lib\sapjco3.jar添加到JDK配置文件的类清单中。

2.SAP端开发

SAP端用事务代码SE37开发一个Function Module,支持RFC:

FUNCTION Z_BAPI_GET_ALL_USERS_DAILY.
 *"----------------------------------------------------------------------
 *"*"Local interface:
 *"  IMPORTING
 *"     VALUE(USTYP) TYPE  XUUSTYP
 *"  TABLES
 *"      USERS STRUCTURE  USR02
 *"----------------------------------------------------------------------
 TABLES:USR02.
 DATA:ITAB_SAPUSERS TYPE TABLE of USR02 WITH HEADER LINE.SELECT * INTO CORRESPONDING FIELDS OF TABLE ITAB_SAPUSERS
 FROM USR02.LOOP AT ITAB_SAPUSERS.
   users = ITAB_SAPUSERS.
   APPEND USERS.
 ENDLOOP.if ustyp is not INITIAL.
    delete users
        where  ustyp <> ustyp.
 endif.ENDFUNCTION.

3.Java程序开发

用JCreator开发Java端程序:

1) 创建类User,封装用户的属性

public class User {  
     private String userId;  
     private String name;  
     private int age;      public User(){}  
     public User(String userId,String name,int age){  
         this.userId = userId;  
         this.name = name;  
         this.age = age;  
     }      public String getUserId() {  
         return userId;  
     }      public void setUserId(String userId) {  
         this.userId = userId;  
     }      public String getName() {  
         return name;  
     }      public void setName(String name) {  
         this.name = name;  
     }      public int getAge() {  
         return age;   
     }      public void setAge(int age) {  
         this.age = age;  
     }  
 }

2) 创建ConnectSAPServer类,实现对连接池的管理

import java.io.File;
 import java.io.FileOutputStream;
 import java.util.Properties; 
 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 ConnectSAPServer
 {
  //SAP服务器IP地址     
  static String D12 = "XXX.25.0.XX";    
  static String T11 = "XXX.25.0.XX";         
  static String ABAP_AS_POOLED = "ABAP_AS_WITH_POOL";      
  static{      
 Properties connectProperties = new Properties();       
 connectProperties.setProperty(DestinationDataProvider.JCO_ASHOST, D12);          
 connectProperties.setProperty(DestinationDataProvider.JCO_SYSNR,  "00");        //系统编号         
 connectProperties.setProperty(DestinationDataProvider.JCO_CLIENT, "900");       //SAP集团       
 connectProperties.setProperty(DestinationDataProvider.JCO_USER,   "baichi");       //SAP用户名        
 connectProperties.setProperty(DestinationDataProvider.JCO_PASSWD, "12345678");     //密码       
 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", connectProperties);    
  }          //如果连接配置文件不存在,则创建一个配置文件,并把配置信息写入到文件中
   static void createDataFile(String name, String suffix, Properties properties)
  {    
      File cfg = new File(name+"."+suffix);       
      if(!cfg.exists()){            
       try{               
          FileOutputStream fos = new FileOutputStream(cfg, false);        
          properties.store(fos, "for tests only !");              
          fos.close();           
          }
 catch (Exception e){              
   throw new RuntimeException("Unable to create the destination file " + cfg.getName(), e);   
           }     
     }    
  }  
      
 public static JCoDestination Connect(){    
   JCoDestination destination =null;          
   try {            
         destination = JCoDestinationManager.getDestination(ABAP_AS_POOLED);   
       }
   catch (JCoException e) 
       {  
         e.getCause();     
       }                
   return destination;   
   } 
   
   public static void main(String[] s)
   {
    JCoDestination jcoConn = testJCO.Connect();
    System.out.println(jcoConn.getDestinationName());
   } 
 }

3) 创建一个类ConnectSAPTable,用于调用sap的function module

import java.util.ArrayList;  
 import java.util.List;  
 import com.sap.conn.jco.JCoDestination;  
 import com.sap.conn.jco.JCoException;  
 import com.sap.conn.jco.JCoFunction;  
 import com.sap.conn.jco.JCoTable;  
 //import User;  
 public class ConnectSAPTable {   
     private static JCoDestination jCoDestination;  
     public static List<User> returnSAPUser_All(String ustyp) throws JCoException{  
         List<User> users = new ArrayList<User>();  
         jCoDestination = ConnectSAPServer.Connect();   
         JCoFunction function = jCoDestination.getRepository().getFunction("Z_BAPI_GET_ALL_USERS_DAILY");   
         if (function == null) throw new RuntimeException("Z_BAPI_GET_ALL_USERS_DAILY  not found in SAP.");  
         //传入的参数 
         function.getImportParameterList().setValue("USTYP",ustyp);  // user type 
         function.execute(jCoDestination);  
         JCoTable returnTable = function.getTableParameterList().getTable("USERS");  
         if (returnTable.getNumRows()>0) {  
            returnTable.firstRow();   
             for (int i = 0; i < returnTable.getNumRows(); i++,returnTable.nextRow()) {  
                 User user = new User();   
                 user.setUserId(returnTable.getString("BNAME"));   
                 users.add(user);  
             }  
         }  
         return users;  
     }  
 }

4) 创建一个类ExportSAPUserByDaily,用于调度,提供参数输入并处理返回的结果

import java.util.List;    
 import com.sap.conn.jco.JCoException;
 //import User;
 public class ExportSAPUserByDaily {  
     public static void main(String[] args) {  
         System.out.println("the call result by JCo:");
         try {   
             List<User> userList = ConnectSAPTable.returnSAPUser_All(args[0]);  
             for (User sapUser : userList) {   
                 System.out.println(sapUser.getUserId());  
             }   
         } catch (JCoException e) {  
             e.getCause();  
             e.printStackTrace();
         }  
     }  
 }

举报

相关推荐

0 条评论