JAVA 调用SAP端接口

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();
        }
    }
}
相关文章
相关标签/搜索