SAP接口編程之 NCo3.0系列(03) : Meta-data和Container

對上一篇文中涉及的重要對象進行講解。我們知道,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;    
}
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • Spring Cloud為開發人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理,服務發現,斷路器,智...
    卡卡羅2017閱讀 134,948評論 18 139
  • 文章作者:Tyan博客:noahsnail.com 3.4 Dependencies A typical ente...
    SnailTyan閱讀 4,201評論 2 7
  • 這兩天真是累到爆炸,現在是下午兩點,我依然感覺很疲憊。對于一些城市的旅游,我更偏向于休閑游。想起和前男友每次出去...
    木棉只是路過閱讀 129評論 0 0
  • 我知道他這是故意惡心我,目的無非就是讓我失態。 “那你也一樣,你喝的水里、吃的飯菜里都有我的尿……”我指著那杯水,...
    銹鐘瑟鼓閱讀 240評論 5 5
  • M城高級總統套間,令人血脈膨脹的聲音斷斷續續。 另一邊,方遠看了一眼這對糾纏的軀體,輕蔑一笑。明天各大報紙都會出現...
    研橙閱讀 340評論 0 0