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

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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值