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.

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章