JAVA 调用SAP端接口

1.此处不涉及到sap端的开发,sap端接口写好了,只是通过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代码   收藏代码
  1. package rising.sap;  
  2.   
  3. import java.io.File;  
  4. import java.io.FileOutputStream;  
  5. import java.util.Properties;  
  6.   
  7. import org.apache.log4j.Logger;  
  8. import com.sap.conn.jco.JCoDestination;  
  9. import com.sap.conn.jco.JCoDestinationManager;  
  10. import com.sap.conn.jco.JCoException;  
  11. import com.sap.conn.jco.ext.DestinationDataProvider;  
  12.   
  13. /** 
  14.  * 与SAP连接配置 
  15.  * @author wy  
  16.  */  
  17. public class SAPConn {  
  18.     private static final String ABAP_AS_POOLED = "ABAP_AS_WITH_POOL";  
  19.     static{  
  20.         Properties connectProperties = new Properties();  
  21.         connectProperties.setProperty(DestinationDataProvider.JCO_ASHOST, "192.168.17.8");//服务器  
  22.         connectProperties.setProperty(DestinationDataProvider.JCO_SYSNR,  "00");        //系统编号  
  23.         connectProperties.setProperty(DestinationDataProvider.JCO_CLIENT, "120");       //SAP集团  
  24.         connectProperties.setProperty(DestinationDataProvider.JCO_USER,   "OASERVICE");  //SAP用户名  
  25.         connectProperties.setProperty(DestinationDataProvider.JCO_PASSWD, "oatest");     //密码  
  26.         connectProperties.setProperty(DestinationDataProvider.JCO_LANG,   "zh");        //登录语言  
  27.         connectProperties.setProperty(DestinationDataProvider.JCO_POOL_CAPACITY, "3");  //最大连接数    
  28.         connectProperties.setProperty(DestinationDataProvider.JCO_PEAK_LIMIT, "10");     //最大连接线程  
  29.           
  30.         createDataFile(ABAP_AS_POOLED, "jcoDestination", connectProperties);  
  31.     }  
  32.       
  33.     /** 
  34.      * 创建SAP接口属性文件。 
  35.      * @param name  ABAP管道名称 
  36.      * @param suffix    属性文件后缀 
  37.      * @param properties    属性文件内容 
  38.      */  
  39.     private static void createDataFile(String name, String suffix, Properties properties){  
  40.         File cfg = new File(name+"."+suffix);  
  41.         if(cfg.exists()){  
  42.             cfg.deleteOnExit();  
  43.         }  
  44.         try{  
  45.             FileOutputStream fos = new FileOutputStream(cfg, false);  
  46.             properties.store(fos, "for tests only !");  
  47.             fos.close();  
  48.         }catch (Exception e){  
  49.             log.error("Create Data file fault, error msg: " + e.toString());  
  50.             throw new RuntimeException("Unable to create the destination file " + cfg.getName(), e);  
  51.         }  
  52.     }  
  53.       
  54.     /** 
  55.      * 获取SAP连接 
  56.      * @return  SAP连接对象 
  57.      */  
  58.     public static JCoDestination connect(){  
  59.         JCoDestination destination =null;  
  60.         try {  
  61.             destination = JCoDestinationManager.getDestination(ABAP_AS_POOLED);  
  62.         } catch (JCoException e) {  
  63.             log.error("Connect SAP fault, error msg: " + e.toString());  
  64.         }  
  65.         return destination;  
  66.     }  
  67.     private static Logger log = Logger.getLogger(SAPConn.class); // 初始化日志对象  
  68. }  

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代码   收藏代码
  1. package rising.test;  
  2.   
  3. import rising.sap.SAPConn;  
  4.   
  5. import com.sap.conn.jco.JCoDestination;  
  6. import com.sap.conn.jco.JCoException;  
  7. import com.sap.conn.jco.JCoFunction;  
  8.   
  9. /** 
  10.  * 从sap中取得借款余额 
  11.  * @author kmd 
  12.  * 2013-06-05 
  13.  * 
  14.  */  
  15. public class LoadBorrowMoneyBalanceFromSAP {  
  16.   
  17.     /* 
  18.      * balanceType  借款类型  01:个人借款余额 02:其他应付借款余额      03:供应商的应付款余额 
  19.      * customerEmployeeNumber  客户员工编号 
  20.      * supplierCode  供应商编码 
  21.      * companyCode  公司代码(法人体) 
  22.      * accountNumber  会计科目编号 
  23.      * year   年 
  24.      * month  月 
  25.      */  
  26.     public static String LoadBorrowMoneyBalance(String balanceType,String customerEmployeeNumber,String supplierCode,String companyCode,String accountNumber,String year,String month){  
  27.         String balance="";  
  28.         JCoFunction function = null;  
  29.         //连接sap,其实就类似于连接数据库  
  30.         JCoDestination destination = SAPConn.connect();  
  31.         try {  
  32.             //调用ZRFC_GET_REMAIN_SUM函数  
  33.             function = destination.getRepository().getFunction("ZRFC_GET_REMAIN_SUM");  
  34.             //将当前传入的值赋予各个参数  
  35.             function.getImportParameterList().setValue("I_PARAM", balanceType);  
  36.             function.getImportParameterList().setValue("I_KUNNR", customerEmployeeNumber);        
  37.             function.getImportParameterList().setValue("I_LIFNR", supplierCode);          
  38.             function.getImportParameterList().setValue("I_BUKRS", companyCode);       
  39.             function.getImportParameterList().setValue("I_KOBEZ", accountNumber);  
  40.             function.getImportParameterList().setValue("I_YEAR", year);       
  41.             function.getImportParameterList().setValue("I_MONTH", month);         
  42.             function.execute(destination);  
  43.             //获取借款余额  
  44.             balance=function.getExportParameterList().getString("E_REMAIN_SUM");  
  45.             //获返回状态  
  46.             String state=function.getExportParameterList().getString("E_STATUS");  
  47.             //获返回信息  
  48.             String message=function.getExportParameterList().getString("E_MESSAGE");  
  49.             System.out.println("调用返回状态--->"+state);  
  50.             System.out.println("调用返回信息--->"+message);  
  51.         } catch (JCoException e) {  
  52.             // TODO Auto-generated catch block  
  53.             e.printStackTrace();  
  54.         }   
  55.         return balance;  
  56.     }  
  57. }  

3.sap生成凭证接口的文档 
 
该接口表示传入为一个表的形式,参数公司代码和凭证类型封装在表T_ACCDOCUMENT中 
而输出来的有返回状态 ,返回消息和表T_ACCDOCUMENT,而从文档可以看出会附带得出会计凭证号和会计凭证行项目这两个参数。(为了简单方便,文档中有些参数省略了) 
CreateVoucherFromSAP.java生成SAP会计凭证 
Java代码   收藏代码
  1. package rising.test;  
  2.   
  3. import rising.sap.SAPConn;  
  4.   
  5. import com.sap.conn.jco.JCoDestination;  
  6. import com.sap.conn.jco.JCoFunction;  
  7. import com.sap.conn.jco.JCoTable;  
  8.   
  9. /** 
  10.  * 从sap中生成凭证 
  11.  * @author kmd 
  12.  * 2013-06-05 
  13.  * 
  14.  */  
  15. public class CreateVoucherFromSAP {  
  16.     public static void main(String[] args) {  
  17.         JCoFunction function = null;  
  18.         JCoDestination destination = SAPConn.connect();  
  19.         String state="";//调用接口返回状态  
  20.         String message="";//调用接口返回信息  
  21.         String belnr="";//会计凭证号  
  22.         String buzei="";//会计凭证行项目  
  23.         try {  
  24.             //调用ZRFC_GET_REMAIN_SUM函数  
  25.             function = destination.getRepository().getFunction("ZRFC_OA_ACC_DOCUMENT");  
  26.             //获取传入表参数T_ACCDOCUMENT  
  27.             JCoTable T_ACCDOCUMENT = function.getTableParameterList().getTable("T_ACCDOCUMENT");  
  28.             T_ACCDOCUMENT.appendRow();//增加一行  
  29.             //给表参数中的字段赋值,此处测试,就随便传两个值进去  
  30.             T_ACCDOCUMENT.setValue("BUKRS""1000");  
  31.             T_ACCDOCUMENT.setValue("BLART""SA");  
  32.             function.execute(destination);  
  33.             state= function.getExportParameterList().getString("E_STATUS");//调用接口返回状态  
  34.             message= function.getExportParameterList().getString("E_MESSAGE");//调用接口返回信息  
  35.             System.out.println("调用返回状态--->"+state+";调用返回信息--->"+message);  
  36.             T_ACCDOCUMENT.firstRow();//获取第一行的对象(此处看sap端如何写的,如果返回的可能有多行,那得循环)  
  37.             belnr=T_ACCDOCUMENT.getString("BELNR");  
  38.             buzei=T_ACCDOCUMENT.getString("BUZEI");  
  39.             System.out.println("会计凭证号--->"+belnr+";会计凭证行项目--->"+buzei);  
  40.             T_ACCDOCUMENT.clear();//清空本次条件,如果要继续传入值去或者还要循环,那得将之前的条件清空  
  41.         }catch (Exception e) {  
  42.             e.printStackTrace();  
  43.         }  
  44.     }  
  45. }  

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
调用 SAP 的 RFC 接口,需要使用 SAP 提供的 Java Connector(SAP JCo)库。在使用 SAP JCo 调用 RFC 接口时,需要在 SAP JCo 的配置文件中设置系统 ID(System ID),以便正确地连接到 SAP 系统。 要配置 SAP JCo 的系统 ID,需要进行以下步骤: 1. 打开 SAP JCo 的配置文件 sapjco3.properties,该文件通常位于应用程序的 classpath 下。 2. 在 sapjco3.properties 文件中添加以下配置项: ``` jco.client.sysnr=<系统编号> jco.client.client=<客户> jco.client.user=<用户名> jco.client.passwd=<密码> jco.client.lang=<语言> jco.client.ashost=<应用服务器主机名> jco.client.saprouter=<SAP 路由器> ``` 其中,<系统编号> 是 SAP 系统的编号,<客户> 是 SAP 客户的编号,<用户名> 和 <密码> 是 SAP 用户的登录信息,<语言> 是登录时使用的语言代码,<应用服务器主机名> 是 SAP 应用服务器的主机名,<SAP 路由器> 是可选的 SAP 路由器配置。 3. 在 Java 代码中使用 SAP JCo 的 API 调用 RFC 接口时,可以使用以下代码获取 SAP JCo 的配置信息: ``` JCoDestination destination = JCoDestinationManager.getDestination("<destination>"); ``` 其中,<destination> 是 SAP JCo 的目标名称,可以在 sapjco3.properties 文件中配置。 4. 使用 SAP JCo 的 API 调用 RFC 接口时,需要使用 SAP JCo 的函数模块名称和函数模块的输入参数,例如: ``` JCoFunction function = destination.getRepository().getFunction("<function_module>"); if (function == null) { throw new RuntimeException("<function_module> not found in SAP system."); } function.getImportParameterList().setValue("<parameter_name>", "<parameter_value>"); function.execute(destination); ``` 其中,<function_module> 是 SAP RFC 函数模块的名称,<parameter_name> 和 <parameter_value> 是函数模块的输入参数名称和值。 以上是 Java 调用 SAP RFC 接口时配置系统 ID 的基本步骤。具体的配置和调用方法可能会因不同的 SAP 系统和 RFC 接口而有所不同,需要根据实际情况进行调整和修改。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值