JCo3.0 調(diào)用 SAP 函數(shù)的步驟
大致可以總結(jié)為以下步驟:
- 連接至SAP系統(tǒng)
- 創(chuàng)建 JcoFunction 接口的實例(這個實例代表 SAP 系統(tǒng)中相關(guān)函數(shù))
- 設(shè)置參數(shù) (importing 等)
- 調(diào)用函數(shù)
- 從 exporting 參數(shù)或者 table 參數(shù)獲取數(shù)據(jù)
以 BAPI_COMPANYCODE_GETDETAIL 函數(shù)為例的示例代碼:
package jco3.demo5;
import com.sap.conn.jco.*;
import org.junit.Test;
public class FunctionCallDemo {
public void getCoCdDetail(String cocd) throws JCoException {
// JCoDestination : backend SAP system
JCoDestination dest = JCoDestinationManager.getDestination("ECC");
JCoRepository repository = dest.getRepository();
JCoFunction fm = repository.getFunction("BAPI_COMPANYCODE_GETDETAIL");
if (fm == null) {
throw new RuntimeException("Function does not exist in SAP");
}
// Set importing parameters
fm.getImportParameterList().setValue("COMPANYCODEID", cocd);
fm.execute(dest);
JCoStructure cocdDetail = fm.getExportParameterList()
.getStructure("COMPANYCODE_DETAIL");
this.printStructure(cocdDetail);
}
private void printStructure(JCoStructure stru){
for (JCoField field : stru){
System.out.println(String.format("%s \t %s", field.getName(), field.getString()));
}
}
@Test
public void testGetCocdDetail() throws JCoException {
this.getCoCdDetail("Z900");
}
}
JCoFunction
接口
-
JCoFunction
是接口鼎姊,代表 SAP 系統(tǒng)的函數(shù) -
JCoFunction
包含 importing 參數(shù)但骨,exporting 參數(shù),changing 參數(shù)禁添,table 參數(shù)等罢荡,分別使用getImportParameterList()
方法灶挟,getExportParameterList()
方法誉察,getChangingParameterList()
方法和getTableParameterList()
方法獲取高诺。這些方法的返回值都為JCoParameter
類型 -
JCoFunction.execute()
方法調(diào)用函數(shù)
創(chuàng)建 JCoFunction
對象的三種方法
方法一:
JCoRepository repository = dest.getRepository();
JCoFunction fm = dest.getRepository().getFunction("BAPI_COMPANYCODE_GETDETAIL");
方法二:如果我們不關(guān)心 JCoRepository
摘悴,也可以這樣寫:
JCoFunction fm = dest.getRepository().getFunction("BAPI_COMPANYCODE_GETDETAIL");
方法三: 使用 JCoFunctionTemplate.getFunction()
方法峭梳,JCoFunctionTemplate 也是一個接口,代表 SAP 函數(shù)的 meta-data蹂喻。
JCoFunctionTemplate fmTemplate
= dest.getRepository().getFunctionTemplate("BAPI_COMPANYCODE_GETDETAIL");
JCoFunction fm = fmTemplate.getFunction();
JCoStructure
接口
BAPI_COMPANY_CODE_GETDETAIL 函數(shù)的 COMPANYCODE_DETAIL 參數(shù)是一個結(jié)構(gòu) - JCoStructure葱椭,JCoStructure 實現(xiàn)了 Iterable
接口,所以可以使用 for 循環(huán)遍歷口四。
private void printStructure(JCoStructure stru)
{
for(JCoField field : stru){
System.out.println(String.format("%s\\t%s",
field.getName(),
field.getString()));
}
}
也可以使用 getFieldCount()
方法進行遍歷:
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)));
}
}