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();
}
}
}