SAP的R/3系统与Java平台一样有着许多类似的技术理念,以及同样广泛的企业级用户,但是它们完全是两个不同的世界。当用户面临流程或者数据整合方面的需求的时候,就迫切需要一种高效的方式,在R/3系统和Java平台之间实时地交换数据。基于这样的需求,SAP提供了一套高效的基于RFC的ABAP和Java进程间通讯组件:SAP Java Connector(JCo)。
一、sapjoc3.jar获取
由于sap官网提供的链接需要合作公司提供账号密码,如果商用请索要正确的用户名密码下载
直接把 sapjco3.jar sapjco3.dll sapjco3.pdb 拷贝至lib下,然后add library把他们都添加进去
二、源码编写
package com.authine.cloudpivot.web.api.controller.runtime;
import com.authine.cloudpivot.web.api.handler.CustomizedOrigin;
import com.sap.conn.jco.JCoDestination;
import com.sap.conn.jco.JCoDestinationManager;
import com.sap.conn.jco.JCoFunction;
import com.sap.conn.jco.JCoTable;
import com.sap.conn.jco.ext.DestinationDataProvider;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.io.File;
import java.io.FileOutputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;
/**
* 调用SAP接口 ZZTRD_CRM_001 crm 取合同与客户信息接口
*/
@Api(description = "流程操作类", tags = "运行时::流程实例接口")
@RestController
@RequestMapping("/api/runtime/sap")
@Slf4j
@Validated
@CustomizedOrigin(level = 0)
public class GetSAPContractController {
//客户
private String CustomerName;
//项目名称
private String ProjectName;
//项目编号
private String ProjectNumber;
//合同金额
private String Amount;
//已开票金额
private String AlreadAmount;
//已发货额
private String AlreadDeliveryAmount;
private String customerName;//客户
private String projectName;//项目名称
private String projectNumber;//项目编号
private String amount;//合同金额
private String subscriber;//负责人、认款人(营销经理)
private String subscriberNum;//负责人、认款人(营销经理)工号
private String contractNum;//crm合同编号
private String kunnr2;//开票方
private String name3;//开发票方名称
public String getCustomerName() {
return customerName;
}
public void setCustomerName(String customerName) {
this.customerName = customerName;
}
public String getProjectName() {
return projectName;
}
public void setProjectName(String projectName) {
this.projectName = projectName;
}
public String getProjectNumber() {
return projectNumber;
}
public void setProjectNumber(String projectNumber) {
this.projectNumber = projectNumber;
}
public String getAmount() {
return amount;
}
public void setAmount(String amount) {
this.amount = amount;
}
public String getSubscriber() {
return subscriber;
}
public void setSubscriber(String subscriber) {
this.subscriber = subscriber;
}
public String getSubscriberNum() {
return subscriberNum;
}
public void setSubscriberNum(String subscriberNum) {
this.subscriberNum = subscriberNum;
}
public String getContractNum() {
return contractNum;
}
public void setContractNum(String contractNum) {
this.contractNum = contractNum;
}
public String getKunnr2() {
return kunnr2;
}
public void setKunnr2(String kunnr2) {
this.kunnr2 = kunnr2;
}
public String getName3() {
return name3;
}
public void setName3(String name3) {
this.name3 = name3;
}
@ApiOperation("GetSAPContract业务方法")
@ApiImplicitParams(@ApiImplicitParam(name = "customerCode", value = "参数1", dataType = "String", paramType = "query", required = true))
@GetMapping("/GetSAPContract")
public List<GetSAPContractController> GetSAPContract(String customerCode) {
/*
* 与SAP连接配置
* @author fengxin
*/
String D12 = "10.10.100.86";
String ABAP_AS_POOLED = "ABAP_AS_WITH_POOL";
{
Properties connectProperties = new Properties();
connectProperties.setProperty(DestinationDataProvider.JCO_ASHOST, D12); //服务器
connectProperties.setProperty(DestinationDataProvider.JCO_SYSNR, "00"); //系统编号
connectProperties.setProperty(DestinationDataProvider.JCO_CLIENT, "800"); //SAP集团
connectProperties.setProperty(DestinationDataProvider.JCO_USER, "PDM_RFC"); //用户名
connectProperties.setProperty(DestinationDataProvider.JCO_PASSWD, "123789"); //密码
connectProperties.setProperty(DestinationDataProvider.JCO_LANG, "ZH"); //登录语言
connectProperties.setProperty(DestinationDataProvider.JCO_POOL_CAPACITY, "3"); //最大连接数
connectProperties.setProperty(DestinationDataProvider.JCO_PEAK_LIMIT, "100"); //最大线程数
createDataFile(ABAP_AS_POOLED, "jcoDestination", connectProperties);
}
List<GetSAPContractController> ret = new ArrayList<GetSAPContractController>();
try {
JCoDestination destination = null;
destination = JCoDestinationManager.getDestination(ABAP_AS_POOLED); //获取SAP连接
JCoFunction function = destination.getRepository().getFunction("ZZTRD_CRM_001");
if (function == null)
throw new RuntimeException("BAPI not found in SAP.");
function.getImportParameterList().setValue("I_KUNNR", customerCode); //传参
function.execute(destination);
JCoTable jtab = function.getTableParameterList().getTable("G_ITEM");
for (int i = 0; i < jtab.getNumRows(); i++) {
jtab.setRow(i);
GetSAPContractController c = new GetSAPContractController();
c.setCustomerName(jtab.getString("NAME1"));//客户
c.setProjectName(jtab.getString("POST1"));//项目名称
c.setProjectNumber(jtab.getString("VBELN"));//项目编号
c.setAmount(jtab.getString("KZWI1"));//合同金额
c.setSubscriber(jtab.getString("NAME2"));//营销经理
c.setSubscriberNum(jtab.getString("KUNNR1")/*.substring(4,10)*/);//营销经理工号
c.setContractNum(jtab.getString("BSTKD"));//crm合同编号
c.setKunnr2(jtab.getString("KUNNR2"));//开票方
c.setName3(jtab.getString("NAME3"));//开票方名称
ret.add(c);
}
} catch (Exception e) {
e.printStackTrace();
return ret;
}
return ret;
}
/**
* 创建SAP接口属性文件。
* @param name ABAP管道名称
* @param suffix 属性文件后缀
* @param properties 属性文件内容
*/
private static void createDataFile(String name, String suffix, Properties properties) {
File cfg = new File(name + "." + suffix);
System.out.println(cfg.getPath());
cfg.delete();
if (!cfg.exists()) {
try {
FileOutputStream fos = new FileOutputStream(cfg, false);
properties.store(fos, "for test only!");
fos.close();
} catch (Exception e) {
throw new RuntimeException(
"Unable to create the destination file:"
+ cfg.getName());
}
}
}