1.此处不涉及到sap端的开发,sap端接口写好了,只是通过JAVA直接调用接口名
2.sapjco3.jar,sapjco3.dll和sapjcorfc.dll要放在容器的lib下面,而不是项目的 WEB-INF\lib,例如tomcat,D:\Program Files\Tomcat 6.0\lib,就是你tomcat安装路径下。
1.原因见 http://www.iteye.com/problems/96263
本文章中两个例子:1.读取SAP系统中的借款余额;2.生成SAP会计凭证
1.下载下面的jar和dll,放到容器的lib中;接着通过代码实现与sap连接【sapjco.jar、sapjco3.jar、sapjco3.dll】
SAPConn.java即JAVA与sap连接代码
Java代码:
package rising.sap;
import java.io.File;
import java.io.FileOutputStream;
import java.util.Properties;
import org.apache.log4j.Logger;
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;
/**
* 与SAP连接配置
* @author wy
*/
public class SAPConn {
private
static final String ABAP_AS_POOLED = "ABAP_AS_WITH_POOL";
static{
Properties connectProperties = new Properties();
connectProperties.setProperty(DestinationDataProvider.JCO_ASHOST,
"192.168.17.8"); //服务器
connectProperties.setProperty(DestinationDataProvider.JCO_SYSNR, "00"); //系统编号
connectProperties.setProperty(DestinationDataProvider.JCO_CLIENT, "120"); //SAP集团
connectProperties.setProperty(DestinationDataProvider.JCO_USER, "OASERVICE"); //SAP用户名
connectProperties.setProperty(DestinationDataProvider.JCO_PASSWD, "oatest"); //密码
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);
}
/**
* 创建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){
log.error("Create Data file fault, error msg: " + e.toString());
throw new RuntimeException("Unable to create the destination file " + cfg.getName(), e);
}
}
/**
* 获取SAP连接
* @return SAP连接对象
*/
public static JCoDestination connect(){
JCoDestination destination =null;
try {
destination = JCoDestinationManager.getDestination(ABAP_AS_POOLED);
} catch (JCoException e) {
log.error("Connect SAP fault, error msg: " + e.toString());
}
return destination;
}
private static Logger log = Logger.getLogger(SAPConn.class); // 初始化日志对象
2.从sap取余额接口的文档
这个接口的功能是去sap中查询出个人借款余额
ZRFC_GET_REMAIN_SUM这个为接口名;
输入参数I_PARAM,I_KUNNR...这些表示你调用该接口时传入的参数
输出参数:
(1)E_STATUS 数据返回状态
S:成功读取余额
F:无余额
E:异常
(2)E_MESSAGE数据返回消息
E_STATUS 返回数据为E,错误信息存放于E_MESSAGE
(3)E_REMAIN_SUM 余额,就是你想要的余额
接口调用成功返回正确的余额数据
LoadBorrowMoneyBalanceFromSAP.java即JAVA调用sap获取余额
Java代码
package rising.test;
import rising.sap.SAPConn;
import com.sap.conn.jco.JCoDestination;
import com.sap.conn.jco.JCoException;
import com.sap.conn.jco.JCoFunction;
/**
* 从sap中取得借款余额
* @author kmd
* 2013-06-05
*
*/
public class LoadBorrowMoneyBalanceFromSAP {
/*
* balanceType 借款类型 01:个人借款余额 02:其他应付借款余额 03:供应商的应付款余额
* customerEmployeeNumber 客户员工编号
* supplierCode 供应商编码
* companyCode 公司代码(法人体)
* accountNumber 会计科目编号
* year 年
* month 月
*/
public static String LoadBorrowMoneyBalance(String balanceType,String customerEmployeeNumber,String supplierCode,String companyCode,String accountNumber,String year,String month){
String balance="";
JCoFunction function = null;
//连接sap,其实就类似于连接数据库
JCoDestination destination = SAPConn.connect();
try {
//调用ZRFC_GET_REMAIN_SUM函数
function = destination.getRepository().getFunction("ZRFC_GET_REMAIN_SUM");
//将当前传入的值赋予各个参数
function.getImportParameterList().setValue("I_PARAM", balanceType);
function.getImportParameterList().setValue("I_KUNNR", customerEmployeeNumber);
function.getImportParameterList().setValue("I_LIFNR", supplierCode);
function.getImportParameterList().setValue("I_BUKRS", companyCode);
function.getImportParameterList().setValue("I_KOBEZ", accountNumber);
function.getImportParameterList().setValue("I_YEAR", year);
function.getImportParameterList().setValue("I_MONTH", month);
function.execute(destination);
//获取借款余额
balance=function.getExportParameterList().getString("E_REMAIN_SUM");
//获返回状态
String state=function.getExportParameterList().getString("E_STATUS");
//获返回信息
String message=function.getExportParameterList().getString("E_MESSAGE");
System.out.println("调用返回状态--->"+state);
System.out.println("调用返回信息--->"+message);
} catch (JCoException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return balance;
}
}
3.sap生成凭证接口的文档
该接口表示传入为一个表的形式,参数公司代码和凭证类型封装在表T_ACCDOCUMENT中
而输出来的有返回状态 ,返回消息和表T_ACCDOCUMENT,而从文档可以看出会附带得出会计凭证号和会计凭证行项目这两个参数。(为了简单方便,文档中有些参数省略了)
CreateVoucherFromSAP.java生成SAP会计凭证
Java代码
package rising.test;
import rising.sap.SAPConn;
import com.sap.conn.jco.JCoDestination;
import com.sap.conn.jco.JCoFunction;
import com.sap.conn.jco.JCoTable;
/**
* 从sap中生成凭证
* @author kmd
* 2013-06-05
*/
public class CreateVoucherFromSAP {
public static void main(String[] args) {
JCoFunction function = null;
JCoDestination destination = SAPConn.connect();
String state="";//调用接口返回状态
String message="";//调用接口返回信息
String belnr="";//会计凭证号
String buzei="";//会计凭证行项目
try {
//调用ZRFC_GET_REMAIN_SUM函数
function = destination.getRepository().getFunction("ZRFC_OA_ACC_DOCUMENT");
//获取传入表参数T_ACCDOCUMENT
JCoTable T_ACCDOCUMENT = function.getTableParameterList().getTable("T_ACCDOCUMENT");
T_ACCDOCUMENT.appendRow();//增加一行
//给表参数中的字段赋值,此处测试,就随便传两个值进去
T_ACCDOCUMENT.setValue("BUKRS", "1000");
T_ACCDOCUMENT.setValue("BLART", "SA");
function.execute(destination);
state= function.getExportParameterList().getString("E_STATUS");//调用接口返回状态
message= function.getExportParameterList().getString("E_MESSAGE");//调用接口返回信息
System.out.println("调用返回状态--->"+state+";调用返回信息--->"+message);
T_ACCDOCUMENT.firstRow();//获取第一行的对象(此处看sap端如何写的,如果返回的可能有多行,那得循环)
belnr=T_ACCDOCUMENT.getString("BELNR");
buzei=T_ACCDOCUMENT.getString("BUZEI");
System.out.println("会计凭证号--->"+belnr+";会计凭证行项目--->"+buzei);
T_ACCDOCUMENT.clear();//清空本次条件,如果要继续传入值去或者还要循环,那得将之前的条件清空
}catch (Exception e) {
e.printStackTrace();
}
}
}
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!