在實際開發中我們經常會遇到需要保存多層實體結構到后台系統的場景,比如SAP各種憑證都是抬頭和行項目一起保存,我今天就介紹一下創建深度插入OData實體的詳細步驟。
今天的例子是創建客戶發票憑證,需要同時保存憑證抬頭和行項目,SAP提供的標准BAPI 需要同時輸入憑證的行項目和抬頭信息。
CALL FUNCTION 'BAPI_ACC_DOCUMENT_POST'
EXPORTING
documentheader = documentheader
IMPORTING
obj_key = obj_key
TABLES
accountgl = accountgl
accountreceivable = accountreceivable
accounttax = accounttax
currencyamount = currencyamount
return = return.
而我們的OData的設計是這樣的:
所以我們就需要使用SAP OData Service提供的Deep Insert方法,下面是相關的詳細步驟。
1.創建DocumentHeader和DocumentItem的關聯
在事務碼SEGW中創建關聯,如下圖:
點擊創建運行時對象。
這時候系統自動創建了憑證抬頭和行項目之間的關聯,我們為了驗證系統正確的生成了關聯,我們在事務碼:/IWFND/GW_CLIENT中進行驗證,如下圖我們在OData Service的URL中加入$metadata,比如:/sap/opu/odata/BAO/FI_INVCUS_SRV/$metadata
2.重新定義方法/IWBEP/IF_MGW_APPL_SRV_RUNTIME~CREATE_DEEP_ENTITY
首先我們需要定義deep entity的Type, 代碼如下:
DATA : BEGIN OF ls_invoice_data.
INCLUDE TYPE /bao/cl_fi_invcus_mpc_ext=>ts_documentheader.
DATA: documentitemset TYPE /bao/cl_fi_invcus_mpc_ext=>tt_documentitem,
END OF ls_invoice_data.
然后我們通過以下語句來讀取前台傳來的entity信息:
io_data_provider->read_entry_data( IMPORTING es_data = ls_invoice_data ).
這里需要注意在定義deep entity的時候, documentitemset的命名一定要是 line item的entityset的名字,否不能生成正確的deep entity。
3. 關於 Create Deep entity的測試
我們當然可以使用前台的UI5代碼進行測試,但是在集成測試之前使用 SAP Gateway Client進行測試。首先我們通過get expand獲得deep entity的信息,然后點擊 Use as Request。
更多精彩,請關注公眾號:環宇的后花園