對上一篇文中涉及的重要對象進(jìn)行講解坡锡。我們知道,SAP函數(shù)的參數(shù)窒所,從方向來說鹉勒,包括import/export/changing,從數(shù)據(jù)結(jié)構(gòu)來說吵取,包括單值型/結(jié)構(gòu)型/表參數(shù)禽额。NCo3.0對SAP函數(shù)相關(guān)對象的設(shè)計(jì),也是這樣的皮官。我們從兩個(gè)角度來看脯倒。第一個(gè)角度: Container和Element,函數(shù)捺氢、結(jié)構(gòu)藻丢、表、ABAP對象是container摄乒,Container能包含其他對象悠反,比如函數(shù)有參數(shù),結(jié)構(gòu)有字段馍佑。比較容易理解斋否。如果對象不包含其他對象,就是一個(gè)element拭荤。
第二個(gè)角度:每一個(gè)對象都有meta data(元數(shù)據(jù))如叼。比如字段,元數(shù)據(jù)包括數(shù)據(jù)類型穷劈、長度等笼恰。SAP對meta data踊沸,設(shè)計(jì)為抽象類,對對象設(shè)計(jì)為接口社证。
IRfcFunction
IRfcFunction繼承自IRfcDataContainer逼龟,實(shí)現(xiàn)了IEnumerable接口。常用的方法如下:
- GetTable(string tableName): 根據(jù)table參數(shù)名追葡,獲取Table參數(shù), 方法來自父類IRfcDataContainer
- GetStructure(string paramName): 根據(jù)參數(shù)名腺律,獲取structure參數(shù), 方法來自父類IRfcDataContainer
- SetValue(string paramName, int/string value): 對參數(shù)賦值,可以設(shè)置的值有多種數(shù)據(jù)類型宜肉,因此有多個(gè)重載的版本匀钧。
- GetElementMetaData(int index): 根據(jù)索引獲取元數(shù)據(jù)的值
GetElementMetaData方法示例
獲取函數(shù)參數(shù)的相關(guān)信息
public void ListFunctionParameters(String fmName)
{
RfcDestination dest = DestinationProvider.GetDestination();
IRfcFunction fm = dest.Repository.CreateFunction(fmName);
for (int i = 0; i < fm.ElementCount; i++) {
RfcElementMetadata elementMeta = fm.GetElementMetadata(i);
if (elementMeta.GetType() == typeof(RfcParameterMetadata)) {
RfcParameterMetadata param = (RfcParameterMetadata)elementMeta;
System.Console.WriteLine("Name: " + param.Name);
System.Console.WriteLine("Data type: " + param.DataType);
System.Console.WriteLine("UcLength: " + param.UcLength);
System.Console.WriteLine("NucLength: " + param.NucLength);
System.Console.WriteLine("Documentation: " + param.Documentation);
System.Console.WriteLine("--------------------------");
}
}
}
單元測試
[TestMethod]
public void Test_ListFunctionParameters()
{
RfcCall rfc = new RfcCall();
rfc.ListFunctionParameters("RFC_READ_TABLE");
}
RfcFunctionMetaData
前面我們從Repository直接創(chuàng)建函數(shù),另外一種常用的方法是用RfcFunctionMetaData谬返,代碼如下:
public ArrayList GetCocdInfo2(String cocd)
{
var list = new ArrayList(); // return value
RfcDestination dest = DestinationProvider.GetDestination();
RfcFunctionMetadata fmMeta = dest.Repository.GetFunctionMetadata("BAPI_COMPANYCODE_GETDETAIL");
IRfcFunction fm = fmMeta.CreateFunction();
fm.SetValue("COMPANYCODEID", cocd);
fm.Invoke(dest);
IRfcStructure cocdDetail = fm.GetStructure("COMPANYCODE_DETAIL");
list = Utils.ToArrayList(cocdDetail);
return list;
}