重定义实现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.