java链接SAP工具类
java链接SAP工具类
先将jar引入
<!-- 链接SAP -->
<dependency>
<groupId>com.github.easonjim</groupId>
<artifactId>com.sap.conn.jco.sapjco3</artifactId>
<version>3.0.11</version>
</dependency>
1
2
3
4
5
6
因为我将SAP登录名都放在数据库表里面保存了,所以不想一样做的可以直接填入参数
ISysSapDatasourceService就是获取数据库表信息的,不这样做可以删除掉
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;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.io.File;
import java.io.FileOutputStream;
import java.util.Properties;
@Component
public class SAPConnUtils {
private static String ABAP_AS_POOLED;
@Autowired
private ISysSapDatasourceService iSysSapDatasourceService;
/**
* 创建SAP接口属性文件。
* @param name ABAP管道名称
* @param suffix 属性文件后缀
* @param properties 属性文件内容
*/
private static void createDataFile(String name, String suffix, Properties properties){
File cfg = new File(name+"."+suffix);
if(cfg.exists()){
cfg.deleteOnExit();
}
try{
FileOutputStream fos = new FileOutputStream(cfg, false);
properties.store(fos, "for tests only !");
fos.close();
}catch (Exception e){
System.out.println("Create Data file fault, error msg: " + e.toString());
throw new RuntimeException("Unable to create the destination file " + cfg.getName(), e);
}
}
/**
* 初始化SAP连接
*/
private void initProperties(String companyCode) {
SysSapDatasource sysSapDatasource = iSysSapDatasourceService.selectSysSapDatasourceByCode(companyCode);
ABAP_AS_POOLED = sysSapDatasource.getDataname();
Properties connectProperties = new Properties();
// SAP服务器
connectProperties.setProperty(DestinationDataProvider.JCO_ASHOST, sysSapDatasource.getHostname());
// SAP系统编号
connectProperties.setProperty(DestinationDataProvider.JCO_SYSNR, sysSapDatasource.getSystemnum());
// SAP集团
connectProperties.setProperty(DestinationDataProvider.JCO_CLIENT, sysSapDatasource.getClient());
// SAP用户名
connectProperties.setProperty(DestinationDataProvider.JCO_USER, sysSapDatasource.getUsername());
// SAP密码
connectProperties.setProperty(DestinationDataProvider.JCO_PASSWD, sysSapDatasource.getPassword());
// SAP登录语言
//connectProperties.setProperty(DestinationDataProvider.JCO_LANG, sapConn.getJCO_LANG());
// 最大连接数
//connectProperties.setProperty(DestinationDataProvider.JCO_POOL_CAPACITY, sapConn.getJCO_POOL_CAPACITY());
// 最大连接线程
//connectProperties.setProperty(DestinationDataProvider.JCO_PEAK_LIMIT, sapConn.getJCO_PEAK_LIMIT());
// SAP ROUTER
//connectProperties.setProperty(DestinationDataProvider.JCO_SAPROUTER, sapConn.getJCO_SAPROUTER());
createDataFile(ABAP_AS_POOLED, "jcoDestination", connectProperties);
}
/**
* 获取SAP连接
* @return SAP连接对象
*/
public JCoDestination connect(String companyCode){
System.out.println("正在连接至SAP...");
JCoDestination destination = null;
initProperties(companyCode);
try {
destination = JCoDestinationManager.getDestination(ABAP_AS_POOLED);
destination.ping();
System.out.println("已成功建立sap的连接");
} catch (JCoException e) {
System.out.println("Connect SAP fault, error msg: " + e.toString());
}
return destination;
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
import com.sap.conn.jco.JCoDestination;
import com.sap.conn.jco.JCoException;
import com.sap.conn.jco.JCoFunction;
import com.sap.conn.jco.JCoFunctionTemplate;
import com.sap.conn.jco.JCoParameterList;
import com.sap.conn.jco.JCoRepository;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@Component
public class SAPHelper {
private static Logger log = LoggerFactory.getLogger(SAPHelper.class);
private static String comPyCode = "";
@Autowired
private SAPConnUtils sapConnUtils;
public JCoFunctionTemplate getRfcTemplate(String rfcName, String companyCode) throws Exception {
JCoDestination destination = sapConnUtils.connect(companyCode);
JCoRepository repository = null;
try {
repository = destination.getRepository();
} catch (Exception e) {
repository = destination.getRepository();
}
JCoFunctionTemplate template = repository.getFunctionTemplate(rfcName);
return template;
}
public JCoFunction getRfcFunction(String rfcName, String companyCode) throws Exception {
JCoFunctionTemplate template = getRfcTemplate(rfcName, companyCode);
return template.getFunction();
}
public JCoFunction getFunction(String functionName, String companyCode) {
comPyCode = companyCode;
JCoFunction function = null;
try {
function = getRfcFunction(functionName, companyCode);
} catch (JCoException e) {
log.info(e.toString());
} catch (NullPointerException e) {
log.info(e.toString());
} catch (Exception e) {
log.info(e.toString());
}
return function;
}
public void execute(JCoFunction function) throws JCoException {
JCoParameterList paramList = function.getImportParameterList();
if (paramList != null) {
}
try {
function.execute(getDestination(comPyCode));
} catch (Exception e) {
log.info(e.toString());
}
paramList = function.getExportParameterList();
if (paramList != null) {
}
}
public JCoDestination getDestination(String companyCode) throws Exception {
JCoDestination destination = sapConnUtils.connect(companyCode);
return destination;
}
public String ping(String companyCode) {
String msg = null;
try {
getDestination(companyCode).ping();
msg = "链接成功!";
} catch (Exception ex) {
msg = "链接失败!";
return msg;
}
return msg;
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
调用方式:
@Autowired
private SAPHelper sapHelper;
public List<Map<String,String>> getMemberList_Sap(){
log.info("获取SAP人员信息开始》》》》》》》》》》》》》》》》》》》");
List<Map<String,String>> list = new ArrayList<>();
try {
JCoFunction function = null;
function = sapHelper.getFunction("RFC函数名","1111");//1111为公司代码,用来查数据表的登录名等信息
JCoParameterList jCoFields = function.getImportParameterList();
String date = DateUtils.getDate().replace("-","");
jCoFields.setValue("BEGDA",date);//参数写这里,也可能是表什么的,那就jCoFields.getTable然后循环往里面写数据,参考下面的取值循环
sapHelper.execute(function);
JCoTable ZTPERNR_MASTER_DATA_SBH = function.getTableParameterList().getTable("返回的表名");
for (int i = 0; i < ZTPERNR_MASTER_DATA_SBH.getNumRows(); i++) {
Map<String,String> map = new HashMap<>();
ZTPERNR_MASTER_DATA_SBH.setRow(i);
map.put("memberCode", ZTPERNR_MASTER_DATA_SBH.getString("PERNR"));
map.put("memberName", ZTPERNR_MASTER_DATA_SBH.getString("ENAME"));
map.put("memberSex", ZTPERNR_MASTER_DATA_SBH.getString("GESCH"));
list.add(map);
}
}catch (Exception e){
log.info("获取SAP人员信息出错:"+e.getMessage(),e);
throw new CustomException(e.toString());
}
log.info("结果:"+JsonUtil.listToJSON(list));
log.info("获取SAP人员信息结束》》》》》》》》》》》》》》》》》》》");
return list;
}
————————————————
版权声明:本文为CSDN博主「赚钱买奶茶」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_38441570/article/details/114700242