重定義實現CREATE_DEEP_ENTITY方法,我們可以實現一起更新Navigation屬性。比如前臺創建PO 擡頭和相應的行項目,傳到後臺可以通過此方法將擡頭和行項目一起創建。
實現過程
重定義/IWBEP/IF_MGW_APPL_SRV_RUNTIME~CREATE_DEEP_ENTITY方法
我們首先要定義結構用來接收前天post過來的參數:
*-定義傳入結構
TYPES: ty_t_po_data TYPE STANDARD TABLE OF zcl_zdemo_po_mpc_ext=>ts_zpoitem WITH DEFAULT KEY.
TYPES: BEGIN OF ty_po_data.
INCLUDE TYPE zcl_zdemo_po_mpc_ext=>ts_zpoheader.
TYPES: toitem TYPE ty_t_po_data,
END OF ty_po_data.
關於PO擡頭和行項目的類型我們可以在如下圖的MPC_EXT類裏面找到,這裏要注意的deep entity的行項目的字段名是toitem,這個名字是和之前定義的navigation屬性是一致的,不能隨便定義,否則接收不到相應的參數。同時前臺請求的json行項目名字也是toitem。如果你不知道叫什麼名字,用expand查一下即可。
代碼編寫:
測試
測試數據可以先參考文章:ODATA:Association 和 Navigation實現 通過get expand先獲取PO和ITEM數據,然後改一下作爲需要創建的PO和其ITEM
我們得到post json參數:
{
"EBELN": "4500000010",
"BUKRS": "1001",
"LIFNR": "0000090006",
"EKORG": "100",
"EKGRP": "101",
"ToItem": [{
"Ebeln": "4500000010",
"Ebelp": "00010",
"Matnr": "AAAAA",
"Menge": "98",
"Meins": "PC",
"Price": "10",
"Netwr": "980"
},
{
"Ebeln": "4500000010",
"Ebelp": "00020",
"Matnr": "BBBBB",
"Menge": "97",
"Meins": "PC",
"Price": "10",
"Netwr": "970"
}
]
}
注意HTTP Request 的Header-type設置爲JSON
執行:
發現500錯誤,但是數據庫實際已更新,查看錯誤消息:Service provider did not return any business data。
我們在代碼中最後要給ER_DEEP_ENTITY賦值
重新執行後返回成功:
完整代碼:
METHOD /iwbep/if_mgw_appl_srv_runtime~create_deep_entity.
DATA:lv_compare_result TYPE /iwbep/if_mgw_odata_expand=>ty_e_compare_result.
*-定義傳入結構
TYPES: ty_t_po_data TYPE STANDARD TABLE OF zcl_zdemo_po_mpc_ext=>ts_zpoitem WITH DEFAULT KEY.
TYPES: BEGIN OF ty_po_data.
INCLUDE TYPE zcl_zdemo_po_mpc_ext=>ts_zpoheader.
TYPES: toitem TYPE ty_t_po_data,
END OF ty_po_data.
DATA ls_po TYPE ty_po_data.
DATA:ls_header TYPE zpoheader.
DATA:lt_items TYPE TABLE OF zpotiem,
ls_items TYPE zpotiem.
CONSTANTS: lc_toitem TYPE string VALUE 'ToItem'."注意大小寫
*-判斷傳入請求是否包含po明細數據
lv_compare_result = io_expand->compare_to( lc_toitem ).
*-如果匹配讀取前臺傳入的數據並更新
IF lv_compare_result EQ /iwbep/if_mgw_odata_expand=>gcs_compare_result-match_equals.
io_data_provider->read_entry_data( IMPORTING es_data = ls_po ).
MOVE-CORRESPONDING ls_po TO ls_header.
MOVE-CORRESPONDING ls_po-toitem[] TO lt_items..
MODIFY zpoheader FROM ls_header.
MODIFY zpotiem FROM TABLE lt_items.
copy_data_to_ref( EXPORTING is_data = ls_po
CHANGING cr_data = er_deep_entity ).
ENDIF.
**TRY.
*CALL METHOD SUPER->/IWBEP/IF_MGW_APPL_SRV_RUNTIME~CREATE_DEEP_ENTITY
* EXPORTING
** iv_entity_name =
** iv_entity_set_name =
** iv_source_name =
* IO_DATA_PROVIDER =
** it_key_tab =
** it_navigation_path =
* IO_EXPAND =
** io_tech_request_context =
** IMPORTING
** er_deep_entity =
* .
** CATCH /iwbep/cx_mgw_busi_exception .
** CATCH /iwbep/cx_mgw_tech_exception .
**ENDTRY.
ENDMETHOD.