一、项目搭建
- 创建项目,添加依赖
- 引入maven依赖
- 编写工具类
- 测试是否成功
- 注意事项
二、打包部署
一、项目搭建
1、创建Maven项目,在src/main/resource目录下创建lib文件夹,导入sap依赖
2、pom.xml中引入以下依赖
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.1.RELEASE</version>
<relativePath />
</parent>
<properties>
<!-- 文件拷贝时的编码 -->
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<!-- 编译时的编码 -->
<maven.compiler.encoding>UTF-8</maven.compiler.encoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<!-- springboot 整合web组件-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- Hutool依赖-->
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.1.1</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<!-- alibaba JSONObject 依赖-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.30</version>
</dependency>
<!--引入sap依赖-->
<dependency>
<groupId>com.sap</groupId>
<artifactId>sapjco3</artifactId>
<version>3.1.0</version>
<scope>system</scope>
<!--这是我项目中依赖地址,可根据自己依赖修改对应目录--><systemPath>${project.basedir}/src/main/resources/lib/sapjco3.jar</systemPath>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<!--设置为true,以便把本地的system的jar也包括进来-->
<includeSystemScope>true</includeSystemScope>
</configuration>
</plugin>
</plugins>
</build>
3、创建工具类,SapUtils
package com.wang.sap.util;
import com.sap.conn.jco.*;
import com.sap.conn.jco.ext.DestinationDataProvider;
import lombok.extern.slf4j.Slf4j;
import java.io.File;
import java.io.FileOutputStream;
import java.util.*;
/**
* @author wanggang
* @date 2023/3/2
*/
@Slf4j
public class SapUtils {
public static JCoFunction getJCoFunction(JCoDestination jCoDestination, String functionName) throws JCoException {
JCoFunctionTemplate functionTemplate = jCoDestination.getRepository().getFunctionTemplate(functionName);
return functionTemplate.getFunction();
}
/**
* 获取JCoDestination
* @param functionName SAP函数名称
* @return JCoDestination
*/
public static JCoDestination getJcoConnection(String functionName) throws Exception {
Properties properties = new Properties();
properties.setProperty(DestinationDataProvider.JCO_ASHOST, "127.0.0.1");//sap服务器地址
properties.setProperty(DestinationDataProvider.JCO_SYSNR, "00");//系统编号,找SAP核对写00就可以了
properties.setProperty(DestinationDataProvider.JCO_CLIENT, "800");//集团号,不知道就问你们的sap basis
properties.setProperty(DestinationDataProvider.JCO_USER, "root");//帐号
properties.setProperty(DestinationDataProvider.JCO_PASSWD, "123123");//密码
properties.setProperty("jco.client.lang", "zh"); //语言
//使用连接池
properties.setProperty("jco.destination.peak_limit", "10"); //最大活动连接数,0表示无限制
properties.setProperty("jco.destination.pool_capacity", "3"); //空闲连接数,如果为0,则没有连接池效果,默认为1
log.info("properties = " + properties.toString());
//生成配置文件,JCoDestinationManager.getDestination()调用时会需要该连接配置文件,后缀名需要为jcoDestination
FileOutputStream fos = null;
String suffix = "jcoDestination";
File cfg = new File(functionName + "." + suffix);
if (!cfg.exists()) {
try {
fos = new FileOutputStream(cfg, false);
properties.store(fos, "for tests only !");
fos.close();
} catch (Exception var9) {
throw new Exception("Unable to create the destination file " + cfg.getName(), var9);
} finally {
if (null != fos) {
fos.close();
}
}
}
return JCoDestinationManager.getDestination(functionName);
}
}
4、测试
import com.sap.conn.jco.JCoDestination;
import com.sap.conn.jco.JCoFunction;
import com.sap.conn.jco.JCoParameterList;
import com.sap.conn.jco.JCoTable;
import com.wang.sap.util.SapUtils;
import lombok.extern.slf4j.Slf4j;
/**
* @author wanggang
* @date 2023/3/3
*/
@Slf4j
public class SapTest {
public static void main(String[] args) throws Exception {
String functionName="ZHRFU_KQYC_OA"; //函数名
String tableName="ET_DATA"; //表名
JCoDestination jcoConnection = SapUtils.getJcoConnection(functionName);
JCoFunction function = SapUtils.getJCoFunction(jcoConnection, functionName);
//获取接口参数格式
String toXML = function.toXML();
log.info("接口参数:"+toXML);
//SAP接口参数分为INPUT和TABLES两种,赋值方式不一样
//INPUT类型的参数赋值
JCoParameterList inputParams = function.getImportParameterList();
inputParams.setValue("IV_BEGDA","20230301");
inputParams.setValue("IV_ENDDA","20230303");
//TABLES表参数赋值
JCoTable jCoFields = function.getTableParameterList().getTable(tableName);
for (int i = 1 ; i <=2; i++) {
//给表格的第几行写入数据,写入第一行的下标是1
jCoFields.setRow(i);
jCoFields.appendRow();
jCoFields.setValue("MANDT","8000");
jCoFields.setValue("ZINDEX",i);
}
function.execute(jcoConnection);
log.info("返回结果="+function.toXML());
JCoParameterList tableParameterList = function.getTableParameterList();
//获取SAP标准返回结果OUTPUT
Object ev_type = function.getExportParameterList().getValue("EV_TYPE"); //状态码
Object ev_message = function.getExportParameterList().getValue("EV_MESSAGE"); //文本信息
//获取SAP返回的表数据,ET_DATA是表名
JCoTable et_data = tableParameterList.getTable("ET_DATA");
log.info("et_data="+et_data.toXML());
int numRows = et_data.getNumRows(); //返回数据行数
for (int j = 0; j < numRows; j++) {
//读取数据,第一行的下标是0
et_data.setRow(j);
et_data.getString("MANDT");
}
}
}
5、注意事项
- 修改连接配置需要删除之前生成的文件,否则不会生效
- 参数赋值时注意是什么类型的参数,返回数据也是同样的
- 如果没有接口文档,获取function后执行function.toXML()方法,可以看到所有参数和数据
- pom.xml中一定要加入以下依赖,否则项目打包sap的依赖包不会引入jar中
<build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <!--设置为true,以便把本地的system的jar也包括进来--> <includeSystemScope>true</includeSystemScope> </configuration> </plugin> </plugins> </build>
二、打包部署
因为我们创建的是Maven项目,使用的是外部依赖,打包的时候会导致外部依赖名称和jar中的依赖名称不一致,这时候运行jar或者执行相关代码就会报一个错误
解决方法:
第一种:打成jar包后,用解压文件打开,找到apjco3-3.1.0.jar重命名apjco3.jar
第二种:修改pom.xml,在build——>resources节点中加入以下代码(推荐)
<resource>
<!--外部jar存放路径-->
<directory>${project.basedir}/src/main/resources/lib</directory>
<targetPath>BOOT-INF/lib/</targetPath>
<includes>
<include>**/*.jar</include>
</includes>
</resource>
<resource>
<directory>src/main/resources</directory>
<targetPath>BOOT-INF/classes/</targetPath>
</resource>
这样打包后jar文件中级会有一个没有重命名的sap依赖包,直接运行即可
sap依赖:https://pan.baidu.com/s/1rC_xJ_vqDbOkk4lS0vlEPw?pwd=1234
项目地址:https://gitee.com/wzzwg_admin/wang-sap
参考博客:https://blog.csdn.net/bj_chengrong/article/details/109498275