SAP接口编程 之 JCo3.0系列(02) : JCo Client Programming
JCo3.0调用SAP函数的过程
大致可以总结为以下步骤:
- 连接至SAP系统
- 创建JcoFunction接口的实例(这个实例代表SAP系统中相关函数)
- 设置importing参数
- 调用函数
- 从exporting参数或者table参数获取数据
代码:
package jco3.demo4;
import org.junit.Test;
import com.sap.conn.jco.JCoDestination;
import com.sap.conn.jco.JCoDestinationManager; import com.sap.conn.jco.JCoException; import com.sap.conn.jco.JCoField; import com.sap.conn.jco.JCoFunction; import com.sap.conn.jco.JCoRepository; import com.sap.conn.jco.JCoStructure; public class RFC { public void getCompanyCodeDetail(String cocd) throws JCoException { // JCoDestination instance represents the backend SAP system JCoDestination dest = JCoDestinationManager.getDestination("ECC"); // JCoFunction instance is the FM in SAP we will use JCoRepository repository = dest.getRepository(); JCoFunction fm = repository.getFunction("BAPI_COMPANYCODE_GETDETAIL"); if (fm == null){ throw new RuntimeException("Function does not exists in SAP system."); } // set import parameter(s) fm.getImportParameterList().setValue("COMPANYCODEID", cocd); // call function fm.execute(dest); // get company code detail from exporting parameter 'COMPANYCODE_DETAIL' JCoStructure cocdDetail = fm.getExportParameterList() .getStructure("COMPANYCODE_DETAIL"); this.printStructure(cocdDetail); } private void printStructure(JCoStructure jcoStru) { for(JCoField field : jcoStru){ System.out.println(String.format("%s\\t%s", field.getName(), field.getString())); } } @Test public void test() throws JCoException { this.getCompanyCodeDetail("Z900"); } }
JCoFunction接口说明
JCoFunction
是一个接口,代表SAP系统的函数
JCoFunction
包含importing参数,exporting参数,changing参数,table参数。分别使用getImportParameterList
方法,getExportParameterList
方法,getChangingParameterList
方法和getTableParameterList
获得。这些方法的返回值都是JCoParameter
类型
JCoFunction.execute
方法实际执行函数
如何创建JCoFunction对象
上面的代码是第一种创建JCoFunction
实例的方法:
JCoRepository repository = dest.getRepository();
JCoFunction fm = dest.getRepository().getFunction("BAPI_COMPANYCODE_GETDETAIL");
如果我们不关心JCoRepository
,也可以这样写:
JCoFunction fm = dest.getRepository().getFunction("BAPI_COMPANYCODE_GETDETAIL");
第三种方法是使用JCoFunctionTemplate.getFunction
方法,JCoFunctionTemplate也是一个接口,代表SAP函数的meta-data。
JCoFunctionTemplate fmTemplate
= dest.getRepository().getFunctionTemplate("BAPI_COMPANYCODE_GETDETAIL");
JCoFunction fm = fmTemplate.getFunction();
JCoStructure接口
BAPI_COMPANY_CODE_GETDETAIL函数的COMPANYCODE_DETAIL参数是一个结构,刚才我们看到遍历结构所有字段的方式:
private void printStructure(JCoStructure jcoStru) { for(JCoField field : jcoStru){ System.out.println(String.format("%s\\t%s", field.getName(), field.getString())); } }
因为JCoStructure实现了Iterable接口,所以可以采取上面的办法进行迭代。另外一种方法进行遍历:
private void printStructure2(JCoStructure jcoStructure) { for (int i = 0; i < jcoStructure.getMetaData().getFieldCount(); i++){ System.out.println(String.format("%s\\t%s", jcoStructure.getMetaData().getName(i), jcoStructure.getString(i))); } }