對(duì)上一篇文中涉及的重要對(duì)象進(jìn)行講解。我們知道,SAP函數(shù)的參數(shù),從方向來(lái)說(shuō),包括import/export/changing,從數(shù)據(jù)結(jié)構(gòu)來(lái)說(shuō),包括單值型/結(jié)構(gòu)型/表參數(shù)。NCo3.0對(duì)SAP函數(shù)相關(guān)對(duì)象的設(shè)計(jì),也是這樣的。我們從兩個(gè)角度來(lái)看。第一個(gè)角度: Container和Element,函數(shù)、結(jié)構(gòu)、表、ABAP對(duì)象是container,Container能包含其他對(duì)象,比如函數(shù)有參數(shù),結(jié)構(gòu)有字段。比較容易理解。如果對(duì)象不包含其他對(duì)象,就是一個(gè)element。
nco3-3-1.jpg
第二個(gè)角度:每一個(gè)對(duì)象都有meta data(元數(shù)據(jù))。比如字段,元數(shù)據(jù)包括數(shù)據(jù)類型、長(zhǎng)度等。SAP對(duì)meta data,設(shè)計(jì)為抽象類,對(duì)對(duì)象設(shè)計(jì)為接口。
nco3-3-2.jpg
IRfcFunction
IRfcFunction繼承自IRfcDataContainer,實(shí)現(xiàn)了IEnumerable接口。常用的方法如下:
- GetTable(string tableName): 根據(jù)table參數(shù)名,獲取Table參數(shù), 方法來(lái)自父類IRfcDataContainer
- GetStructure(string paramName): 根據(jù)參數(shù)名,獲取structure參數(shù), 方法來(lái)自父類IRfcDataContainer
- SetValue(string paramName, int/string value): 對(duì)參數(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("--------------------------");
}
}
}
單元測(cè)試
[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;
}