ODATA入门:CREATE_DEEP_ENTITY方法实现PO抬头和明细一起创建

重定义实现CREATE_DEEP_ENTITY方法,我们可以实现一起更新Navigation属性。比如前台创建PO 抬头和相应的行项目,传到后台可以通过此方法将抬头和行项目一起创建。

实现过程

重定义/IWBEP/IF_MGW_APPL_SRV_RUNTIME~CREATE_DEEP_ENTITY方法

ODATA入门:CREATE_DEEP_ENTITY方法实现PO抬头和明细一起创建_第1张图片

我们首先要定义结构用来接收前天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入门:CREATE_DEEP_ENTITY方法实现PO抬头和明细一起创建_第2张图片 代码编写:

ODATA入门:CREATE_DEEP_ENTITY方法实现PO抬头和明细一起创建_第3张图片

测试

测试数据可以先参考文章: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

ODATA入门:CREATE_DEEP_ENTITY方法实现PO抬头和明细一起创建_第4张图片

执行:

ODATA入门:CREATE_DEEP_ENTITY方法实现PO抬头和明细一起创建_第5张图片

发现500错误,但是数据库实际已更新,查看错误消息:Service provider did not return any business data。 

我们在代码中最后要给ER_DEEP_ENTITY赋值

 ODATA入门:CREATE_DEEP_ENTITY方法实现PO抬头和明细一起创建_第6张图片

重新执行后返回成功:

ODATA入门:CREATE_DEEP_ENTITY方法实现PO抬头和明细一起创建_第7张图片

完整代码:

 

  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.

 

你可能感兴趣的:(ODATA,ODATA)