1.此处不涉及到sap端的开发,sap端接口写好了,只是经过JAVA直接调用接口名 .java
2.sapjco3.jar,sapjco3.dll和sapjcorfc.dll要放在容器的lib下面,而不是项目的WEB-INF\lib,例如tomcat,D:\Program Files\Tomcat 6.0\lib,就是你tomcat安装路径下。
缘由见 http://www.iteye.com/problems/96263
本文章中两个例子:1.读取SAP系统中的借款余额;2.生成SAP会计凭证
1.下载下面的jar和dll,放到容器的lib中;接着经过代码实现与sap链接
SAPConn.java即JAVA与sap链接代码 数据库
Java代码 apache
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获取余额 tomcat
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会计凭证 app
Java代码 ide
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(); } } }