對上一篇文中涉及的重要對象進行講解。我們知道,SAP函數的參數,從方向來說,包括import/export/changing,從數據結構來說,包括單值型/結構型/表參數。NCo3.0對SAP函數相關對象的設計,也是這樣的。我們從兩個角度來看。第一個角度: Container和Element,函數、結構、表、ABAP對象是container,Container能包含其他對象,比如函數有參數,結構有字段。比較容易理解。如果對象不包含其他對象,就是一個element。
nco3-3-1.jpg
第二個角度:每一個對象都有meta data(元數據)。比如字段,元數據包括數據類型、長度等。SAP對meta data,設計為抽象類,對對象設計為接口。
nco3-3-2.jpg
IRfcFunction
IRfcFunction繼承自IRfcDataContainer,實現了IEnumerable接口。常用的方法如下:
- GetTable(string tableName): 根據table參數名,獲取Table參數, 方法來自父類IRfcDataContainer
- GetStructure(string paramName): 根據參數名,獲取structure參數, 方法來自父類IRfcDataContainer
- SetValue(string paramName, int/string value): 對參數賦值,可以設置的值有多種數據類型,因此有多個重載的版本。
- GetElementMetaData(int index): 根據索引獲取元數據的值
GetElementMetaData方法示例
獲取函數參數的相關信息
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直接創建函數,另外一種常用的方法是用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;
}