JCO连接SAP例子

来源:互联网 发布:水利工程量绘图软件 编辑:程序博客网 时间:2024/05/16 10:10

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 0
原创粉丝点击