JAVA调用SAP端RFC接口

17 篇文章 4 订阅
JAVA调用SAP端接口 
1、这里我们不讲述SAP端接口的开发,sap端接口已经写好了,java端只是调用sap的接口名;

2、调用过程中所需要的包及配置文件,在“java连接sap接口包sapjco3”中可以直接下载使用。

本博文中提供两个例子:

1、检查SAP商品SN码;

2、查询SAP采购单 。

SAPConn.java即JAVA与sap连接代码 

package com.pcmall;

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 jay
 */
public class SAPConn {
	private static final String ABAP_AS_POOLED = "ABAP_AS_WITH_POOL";
	static{
		Properties connectProperties = new Properties();
		connectProperties.setProperty(DestinationDataProvider.JCO_ASHOST, "xxx.xxx.xxx.xxx");//服务器
		connectProperties.setProperty(DestinationDataProvider.JCO_SYSNR,  "xxx");        //系统编号
		connectProperties.setProperty(DestinationDataProvider.JCO_CLIENT, "xxx");       //SAP集团
		connectProperties.setProperty(DestinationDataProvider.JCO_USER,   "xxx");  //SAP用户名
		connectProperties.setProperty(DestinationDataProvider.JCO_PASSWD, "xxx");     //密码
		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); // 初始化日志对象
}

检查SAP商品SN码


调用接口代码如下

package com.pcmall;

import com.sap.conn.jco.JCoDestination;
import com.sap.conn.jco.JCoFunction;
import com.sap.conn.jco.JCoParameterList;
import com.sap.conn.jco.JCoTable;

public class CheckSnFromSAP {
	public static void main(String[] args) {
		JCoFunction function = null;
		JCoDestination destination = SAPConn.connect();
		String result="";//调用接口返回状态
		String message="";//调用接口返回信息
		try {
			//调用ZRFC_GET_REMAIN_SUM函数
			function = destination.getRepository().getFunction("ZFMPOS_SN_CHECK");
			JCoParameterList input = function.getImportParameterList();
			//发出扫码仓库
			input.setValue("ZSNWERKS", "1000");
			//发出扫码库位
			input.setValue("ZSNLGORT", "0001");
			//采购凭证号
			input.setValue("EBELN", "1");
			
			//获取传入表参数SN_ITEM
			JCoTable SN_ITEM = function.getTableParameterList().getTable("SN_ITEM");
			SN_ITEM.appendRow();//增加一行
			//给表参数中的字段赋值,此处测试,就随便传两个值进去
			//商品编码
			SN_ITEM.setValue("MATNR", "1");
			//商品序列号
			SN_ITEM.setValue("ZSERIAL", "1");
			function.execute(destination);
			result= function.getExportParameterList().getString("RESULT");//调用接口返回状态
			message= function.getExportParameterList().getString("MESSAGE");//调用接口返回信息
			System.out.println("调用返回状态--->"+result+";调用返回信息--->"+message);
			SN_ITEM.clear();//清空本次条件,如果要继续传入值去或者还要循环,那得将之前的条件清空
		}catch (Exception e) {
			e.printStackTrace();
		}
	}
}
测试输出结果如下,说明SAP接口已经调通


查询SAP采购单 


调用接口代码如下

package com.pcmall;

import com.sap.conn.jco.JCoDestination;
import com.sap.conn.jco.JCoFunction;
import com.sap.conn.jco.JCoParameterList;
import com.sap.conn.jco.JCoTable;

public class GetPoFromSAP {
	public static void main(String[] args) {
		JCoFunction function = null;
		JCoDestination destination = SAPConn.connect();
		String result="";//调用接口返回状态
		String message="";//调用接口返回信息
		try {
			//调用ZRFC_GET_REMAIN_SUM函数
			function = destination.getRepository().getFunction("ZFMPOS_PO_QUERY");
			JCoParameterList input = function.getImportParameterList();
			//采购凭证号
			input.setValue("EBELN", "4500004135");
			//单据类型
			input.setValue("BSART", "TR");
			//制单日期从
			input.setValue("AEDATF", "");
			//制单日期到
			input.setValue("AEDATT", "");
			//出入库标识
			input.setValue("INOUT", "I");
			//地点库位权限值
			input.setValue("AUTHORITY", "");
			
			function.execute(destination);
			result= function.getExportParameterList().getString("RESULT");//调用接口返回状态
			message= function.getExportParameterList().getString("MESSAGE");//调用接口返回信息
			
			if(result.equals("E")){
				System.out.println("调用返回状态--->"+result+";调用返回信息--->"+message);
				return;
			}else{
				System.out.println("调用返回状态--->"+result+";调用返回信息--->"+message);
				JCoParameterList tblexport = function.getTableParameterList();
				//JCoParameterList tblexport = function.getTableParameterList().getTable("QUERY_H");
				String msg = tblexport.toXML();
				System.out.println("调用返回表XML--->"+msg);
			}
		}catch (Exception e) {
			e.printStackTrace();
		}
	}
}

测试输出结果如下,说明SAP接口已经调通


具体的XML文本内容如下,发现返回有两张表,分别为QUERY_H、QUERY_I主从表,,得到该XML内容,则JAVA端可以对此解析,得到所需要业务信息。

<?xml version="1.0" encoding="utf-8"?>

<TABLES>
  <QUERY_H>
    <item>
      <EBELN>4500004135</EBELN>
      <ZTYPE>04</ZTYPE>
      <BSART>ZDN</BSART>
      <ZWCHARG>1</ZWCHARG>
      <AEDAT>2014-10-19</AEDAT>
      <ZLIFNR>1000</ZLIFNR>
      <ZLCAN/>
      <KUNNR/>
      <NAME1/>
      <ZLLAND1>中国</ZLLAND1>
      <ZLREGIO>上海</ZLREGIO>
      <ZLORT01>南京</ZLORT01>
      <ZLSTREET>中国上海南京1000新地址</ZLSTREET>
      <ZLPSTLZ>210000</ZLPSTLZ>
      <ZLTELF1>888888881</ZLTELF1>
      <ZLTELFX/>
      <ZLLIAN>王五(新)</ZLLIAN>
      <ZFA/>
      <ZBEIZHU/>
      <ZWNO>0</ZWNO>
      <ZWSTATUS/>
      <ZWBEIZHU/>
      <GYS_EBELN/>
      <PUSH_FLAG>0</PUSH_FLAG>
      <ZSTATUS/>
      <ZWCLASS>IBD</ZWCLASS>
    </item>
  </QUERY_H>
  <QUERY_I>
    <item>
      <EBELN>4500004135</EBELN>
      <ZEBELP>00001</ZEBELP>
      <MATNR>3</MATNR>
      <ZFWERKS>1000</ZFWERKS>
      <ZFWNAME>木头若愚</ZFWNAME>
      <ZFLGORT>0001</ZFLGORT>
      <ZFLNAME>仓库</ZFLNAME>
      <ZSWERKS>1000</ZSWERKS>
      <ZSWNAME>木头若愚</ZSWNAME>
      <ZSLGORT>0002</ZSLGORT>
      <ZSLNAME>坏件库</ZSLNAME>
      <ZDYU>20141019</ZDYU>
      <ZXMENG>1</ZXMENG>
      <ZSMENG/>
      <ZDFA/>
      <ZYMENG>0</ZYMENG>
    </item>
    <item>
      <EBELN>4500004135</EBELN>
      <ZEBELP>00002</ZEBELP>
      <MATNR>2</MATNR>
      <ZFWERKS>1000</ZFWERKS>
      <ZFWNAME>木头若愚</ZFWNAME>
      <ZFLGORT>0001</ZFLGORT>
      <ZFLNAME>仓库</ZFLNAME>
      <ZSWERKS>1000</ZSWERKS>
      <ZSWNAME>木头若愚</ZSWNAME>
      <ZSLGORT>0002</ZSLGORT>
      <ZSLNAME>坏件库</ZSLNAME>
      <ZDYU>20141019</ZDYU>
      <ZXMENG>1</ZXMENG>
      <ZSMENG/>
      <ZDFA/>
      <ZYMENG>0</ZYMENG>
    </item>
    <item>
      <EBELN>4500004135</EBELN>
      <ZEBELP>00003</ZEBELP>
      <MATNR>1</MATNR>
      <ZFWERKS>1000</ZFWERKS>
      <ZFWNAME>木头若愚</ZFWNAME>
      <ZFLGORT>0001</ZFLGORT>
      <ZFLNAME>仓库</ZFLNAME>
      <ZSWERKS>1000</ZSWERKS>
      <ZSWNAME>木头若愚</ZSWNAME>
      <ZSLGORT>0002</ZSLGORT>
      <ZSLNAME>坏件库</ZSLNAME>
      <ZDYU>20141019</ZDYU>
      <ZXMENG>1</ZXMENG>
      <ZSMENG/>
      <ZDFA/>
      <ZYMENG>2</ZYMENG>
    </item>
  </QUERY_I>
</TABLES>

调用 SAPRFC 接口,需要使用 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 接口而有所不同,需要根据实际情况进行调整和修改。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值