For beginners facing issues in creating deep entity for more than one item table for single header. I will explain how to create SAP Netweaver gateway OData service which will implement Create Deep Entity for POST operation. This is for single header and multiple item table. For example:Header Details:Order notification Item Details:Order component Order operation Order header Maintenance plan detail
Entity Type 1 – notif Entity Type 2 – ord_hdr Entity Type 3 – ord_comp Entity Type 4 – ord_opr Entity Type 5 – mpos Entity Type 6 – return(created to hold multiple messages of type BAPIRET2) Entity Set 1 – notifSet Entity Set 2 – ord_hdrSet Entity Set 3 – ord_compSet Entity Set 4 – ord_oprSet Entity Set 5 – mposSet Entity Set 6 – returnSet
Association 1 notif_comp (entity notif to ord_comp with cardinality 1:N) Association 2 notif_hdr (entity notif to ord_hdr with cardinality 1:1) Association 3 notif_mpos (entity notif to ord_mpos with cardinality 1:1) Association 4 notif_opr (entity notif to ord_opr with cardinality 1:N) Association 5 notif_return (entity notif to ord_return with cardinality 1:N)
Navigation 1 notif_return_nav Navigation 2 notif_mpos_nav Navigation 3 notif_comp_nav Navigation 4 notif_opr_nav Navigation 5 notif_hdr_nav Now let’s generate runtime artifacts. Click on generate runtime object button. It will display popup . Keep the default class names as-is and click on enter button.
Once generation is successful, you will get 4 classes. 2 for Data provider and 2 for Model provider. Once registration done successfully .Goto Gateway Client ( call transaction /IWFND/GW_CLIENT to open SAP NW Gateway client) Append $metadata to base service URL and press execute button. If everything is fine then you will get HTTP Response as below. Metadata provides information such as Entity type, key property, properties and Entity Set name and also check service document append ?$format=xml.
Select ***_MPC_EXT class Go to “Types” tab and add new type which is similar to your deep entity structure Type decleration :
types: BEGIN OF ts_deep_entity , qmnum TYPE qmnum, code TYPE char4, fllogid TYPE diacl_logid, tllogid TYPE diacl_logid , sectref TYPE zsectref, func_location TYPE tplnr, erdat TYPE char15, qmnam TYPE qmnam, faultcode TYPE zfaultcode, asr_gfor TYPE boolean, nildef TYPE boolean, defcode TYPE zdefcode, def_pos TYPE zdef_pos, techlog TYPE ztechlog, dd_ltext TYPE char200, dd_ltext1 TYPE char200, action_text TYPE char200, action_text1 TYPE char200, structural TYPE boolean, comp_replacement TYPE boolean, material_request TYPE boolean, source TYPE qmgrp, dd_order TYPE aufnr, dd_notif TYPE qmnum, due_date TYPE char15, mech TYPE char10, inspection TYPE char10, license TYPE char10, add_auth TYPE zadd_auth, cross_ref TYPE char25, werks TYPE werks_d, msg_type TYPE char1, msg_text TYPE char80, order_no TYPE aufnr , notif_comp_nav TYPE STANDARD TABLE OF ts_ord_comp WITH DEFAULT KEY, notif_opr_nav TYPE STANDARD TABLE OF ts_ord_opr WITH DEFAULT KEY, notif_hdr_nav TYPE ts_ord_hdr, notif_mpos_nav TYPE ts_mpos, notif_return_nav TYPE STANDARD TABLE OF ts_return WITH DEFAULT KEY, END OF ts_deep_entity . Redefine the method “DEFINE” in the class. Include the following code in Define method. super->define( ). DATA: lo_annotation TYPE REF TO /iwbep/if_mgw_odata_annotation, lo_entity_type TYPE REF TO /iwbep/if_mgw_odata_entity_typ, lo_complex_type TYPE REF TO /iwbep/if_mgw_odata_cmplx_type, lo_property TYPE REF TO /iwbep/if_mgw_odata_property, lo_entity_set TYPE REF TO /iwbep/if_mgw_odata_entity_set. ******************************************************************** *********************************************************** * ENTITY – Deep Entity ******************************************************************** *********************************************************** lo_entity_type = model->get_entity_type( iv_entity_name = ‘notif’ ). “#EC NOTEXT lo_entity_type->bind_structure( iv_structure_name = ‘***CL_LI5_LBK__14_MPC_EXT=>TS_DEEP_ENTITY’ ).
parameters of method ‘/IWBEP/IF_MGW_APPL_SRV_RUNTIME~CREATE_DEEP_ENTITY’.The only change we need to make is replace the type of ‘ER_DEEP_ENTITY’ to the type which we specified in class ‘***CL_LI5_LBK__14_MPC_EXT=>TS_DEEP_ENTITY’. CODE SNIPPET METHOD custom_create_deep_entity. CONSTANTS:c_crt TYPE char4 VALUE ‘CRT’ , c_crad TYPE char4 VALUE ‘CRAD’ , c_u TYPE char1 VALUE ‘U’ , c_read TYPE char4 VALUE ‘READ’ , c_clrd TYPE char4 VALUE ‘CLRD’ , c_clsd TYPE char4 VALUE ‘CLSD’ , c_upd TYPE char3 VALUE ‘UPD’ , c_a TYPE char1 VALUE ‘A’ . TYPES:BEGIN OF return_msg, type TYPE bapi_mtype, message TYPE bapi_msg, END OF return_msg. DATA:lt_ret_msg TYPE ***cl_li5_lbk__14_mpc_ext=>tt_return, ls_ret_msg TYPE /tcsmro/cl_li5_lbk__14_mpc_ext=>ts_return. DATA: lr_deep_entity TYPE ***cl_li5_lbk__14_mpc_ext=>ts_deep_entity, lt_ord_comp TYPE ***cl_li5_lbk__14_mpc_ext=>tt_ord_comp, ls_ord_comp TYPE ***cl_li5_lbk__14_mpc_ext=>ts_ord_comp, lt_ord_opr TYPE ***cl_li5_lbk__14_mpc_ext=>tt_ord_opr, ls_ord_opr TYPE ***cl_li5_lbk__14_mpc_ext=>ts_ord_opr, lt_mpos TYPE ***cl_li5_lbk__14_mpc_ext=>tt_mpos, ls_mpos TYPE ***cl_li5_lbk__14_mpc_ext=>ts_mpos, lt_ord_hdr TYPE ***cl_li5_lbk__14_mpc_ext=>tt_ord_hdr, ls_ord_hdr TYPE ***cl_li5_lbk__14_mpc_ext=>ts_ord_hdr, e_msg_type TYPE char1, e_msg_text TYPE char40, lt_return TYPE ***cl_li5_lbk__14_mpc_ext=>tt_return, ls_return TYPE ***cl_li5_lbk__14_mpc_ext=>ts_return. DATA : ls_general_data TYPE ***li5_lbk_notification, *ls_general_data TYPE ***LI5_LBK_NOTIF, *ls_general_data TYPE ***LI5_LBK_NOTIFICATION, lt_ord_comp_data TYPE STANDARD TABLE OF ***li5_lbk_ord_comp, ls_ord_comp_data TYPE ***li5_lbk_ord_comp, ********component to RFC structure lt_ord_comp_data1 TYPE STANDARD TABLE OF bapi_alm_order_component_e, ls_ord_comp_data1 TYPE bapi_alm_order_component_e, ****** lt_ord_opr_data TYPE STANDARD TABLE OF ***Li5_lbk_ord_opr, ls_ord_opr_data TYPE ***/li5_lbk_ord_opr, ********operation to RFC structure *lt_ord_opr_data1 TYPE STANDARD TABLE OF BAPI_ALM_ORDER_OPERATION_E, *ls_ord_opr_data1 TYPE BAPI_ALM_ORDER_OPERATION_E, lt_ord_opr_data1 TYPE STANDARD TABLE OF bapi_alm_order_operation_e, ls_ord_opr_data1 TYPE bapi_alm_order_operation_e, ******order header lt_ord_hdr_data TYPE STANDARD TABLE OF ***li5_lbk_ord_hdr, ls_ord_hdr_data TYPE ***li5_lbk_ord_hdr, ********order header to RFC structure lt_ord_hdr_data1 TYPE STANDARD TABLE OF bapi_alm_order_header_e, ls_ord_hdr_data1 TYPE bapi_alm_order_header_e, ********MPOS lt_mpos_data TYPE STANDARD TABLE OF ***li5_lbk_mpos, ls_mpos_data TYPE ***li5_lbk_mpos, ********MPOS to RFC structure lt_mpos_data1 TYPE STANDARD TABLE OF mpos, ls_mpos_data1 TYPE mpos, ls_mposf TYPE ***cl_li5_lbk__14_mpc_ext=>ts_mpos. FIELD-SYMBOLS: <ls_ord_compf> TYPE ***cl_li5_lbk__14_mpc_ext=>ts_ord_comp, <ls_ord_oprf> TYPE ***cl_li5_lbk__14_mpc_ext=>ts_ord_opr, <ls_ord_hdrf> TYPE ***cl_li5_lbk__14_mpc_ext=>ts_ord_hdr. ******message****** DATA: lr_message_container TYPE REF TO /iwbep/if_message_container, lv_message TYPE bapi_msg , lv_msgid TYPE symsgid , lv_msgno TYPE symsgno . *lr_message_container = me->mo_context * Transform data into the internal structure io_data_provider->read_entry_data( IMPORTING es_data = lr_deep_entity ). ***********Collect the header fields here ls_general_data-qmnum = lr_deep_entity-qmnum. ls_general_data-code = lr_deep_entity-code. ls_general_data-aufnr = lr_deep_entity-order_no. ls_general_data-fllogid = lr_deep_entity-fllogid . ls_general_data-func_location = lr_deep_entity-func_location. ls_general_data-strmn = lr_deep_entity-erdat. ls_general_data-qmnam = lr_deep_entity-qmnam. ls_general_data-/smr/faultcode = lr_deep_entity-faultcode. ls_general_data-/smr/asr_gfor = lr_deep_entity-asr_gfor. ls_general_data-/smr/nildef = lr_deep_entity-nildef. ls_general_data-/smr/defcode = lr_deep_entity-defcode. ls_general_data-/smr/def_pos = lr_deep_entity-def_pos. ls_general_data-/smr/techlog = lr_deep_entity-techlog. ls_general_data-dd_ltext = lr_deep_entity-dd_ltext. ls_general_data-dd_ltext1 = lr_deep_entity-dd_ltext1. ls_general_data-action_ltext = lr_deep_entity-action_text. ls_general_data-action_ltext1 = lr_deep_entity-action_text1. ls_general_data-/smr/structural = lr_deep_entity-structural. ls_general_data-/smr/comp_replacement = lr_deep_entity-comp_replacement. ls_general_data-/smr/material_request = lr_deep_entity-material_request. ls_general_data-qmcod = lr_deep_entity-source. ls_general_data-dd_order = lr_deep_entity-dd_order. ls_general_data-dd_notif = lr_deep_entity-dd_notif. ls_general_data-due_date = lr_deep_entity-due_date. ls_general_data-/smr/mech = lr_deep_entity-mech. ls_general_data-/smr/inspection = lr_deep_entity-inspection. ls_general_data-/smr/license = lr_deep_entity-license. ls_general_data-/smr/add_auth = lr_deep_entity-add_auth. ls_general_data-/smr/sectref = lr_deep_entity-sectref . ls_general_data-plant = lr_deep_entity-werks. ls_general_data-qmtxt = lr_deep_entity-dd_ltext. ********Collect comp fields LOOP AT lr_deep_entity-notif_comp_nav ASSIGNING <ls_ord_compf>. “WHERE qmnum = lr_deep_entity-qmnum. CLEAR ls_ord_comp_data. ls_ord_comp_data-qmnum = <ls_ord_compf>-qmnum. ls_ord_comp_data-reserv_no = <ls_ord_compf>-reserv_no. ls_ord_comp_data-res_item = <ls_ord_compf>-res_item. ls_ord_comp_data-material = <ls_ord_compf>-material. ls_ord_comp_data-material_desc = <ls_ord_compf>-material_desc. ls_ord_comp_data-req_quan = <ls_ord_compf>-req_quan. ls_ord_comp_data-unit = <ls_ord_compf>-unit. ls_ord_comp_data-order_no = <ls_ord_compf>-order_no. ls_ord_hdr_data1-orderid = <ls_ord_compf>-order_no. APPEND ls_ord_comp_data TO lt_ord_comp_data. ls_ord_comp_data1-reserv_no = <ls_ord_compf>-reserv_no. ls_ord_comp_data1-res_item = <ls_ord_compf>-res_item. IF NOT <ls_ord_compf>-material IS INITIAL. CALL FUNCTION ‘CONVERSION_EXIT_MATN1_INPUT’ EXPORTING input = <ls_ord_compf>-material IMPORTING output = <ls_ord_compf>-material EXCEPTIONS length_error = 1 OTHERS = 2. ELSE. CONTINUE. ENDIF. IF sy-subrc <> 0. * Implement suitable error handling here ENDIF. ls_ord_comp_data1-material = <ls_ord_compf>-material. ls_ord_comp_data1-matl_desc = <ls_ord_compf>-material_desc. ls_ord_comp_data1-requirement_quantity = <ls_ord_compf>-req_quan. ls_ord_comp_data1-requirement_quantity_unit = <ls_ord_compf>-unit. ls_ord_comp_data1-item_cat = <ls_ord_compf>-flag. ls_ord_hdr_data1-orderid = <ls_ord_compf>-order_no. APPEND ls_ord_comp_data1 TO lt_ord_comp_data1. ENDLOOP. ********Collect oper fields LOOP AT lr_deep_entity-notif_opr_nav ASSIGNING <ls_ord_oprf>. CLEAR ls_ord_opr_data. ls_ord_opr_data-qmnum = <ls_ord_oprf>-qmnum. IF NOT <ls_ord_oprf>-skill IS INITIAL. ls_ord_opr_data-skill = <ls_ord_oprf>-skill. ELSE. CONTINUE. ENDIF. ls_ord_opr_data-work_cntr = <ls_ord_oprf>-work_cntr. ls_ord_opr_data-work_activity = <ls_ord_oprf>-work_activity. TRANSLATE <ls_ord_oprf>-unit TO UPPER CASE. ls_ord_opr_data-unit = <ls_ord_oprf>-unit. ls_ord_opr_data-order_no = <ls_ord_oprf>-order_no. ls_ord_hdr_data1-orderid = <ls_ord_oprf>-order_no. ls_ord_opr_data-activity = <ls_ord_oprf>-activity. ls_ord_opr_data-sub_activity = <ls_ord_oprf>-sub_activity. ls_ord_opr_data-control_key = <ls_ord_oprf>-control_key. APPEND ls_ord_opr_data TO lt_ord_opr_data. ls_ord_opr_data1-work_cntr = <ls_ord_oprf>-work_cntr. ls_ord_opr_data1-work_activity = <ls_ord_oprf>-work_activity. TRANSLATE <ls_ord_oprf>-unit TO UPPER CASE. ls_ord_opr_data1-un_work = <ls_ord_oprf>-unit. ls_ord_hdr_data1-orderid = <ls_ord_oprf>-order_no. ls_ord_opr_data1-activity = <ls_ord_oprf>-activity. ls_ord_opr_data1-sub_activity = <ls_ord_oprf>-sub_activity. ls_ord_opr_data1-control_key = <ls_ord_oprf>-control_key. ls_ord_opr_data1-sub_activity = <ls_ord_oprf>-flag. IF <ls_ord_oprf>-flag = space. ls_ord_opr_data1-sub_activity = c_u. ENDIF. APPEND ls_ord_opr_data1 TO lt_ord_opr_data1. ENDLOOP. ********Collect MPOS fields * LOOP AT lr_deep_entity-notif_mpos_nav ASSIGNING <ls_mposf> * WHERE qmnum = lr_deep_entity-qmnum. ls_mposf = lr_deep_entity-notif_mpos_nav . ls_mpos_data1-/smr/dd_type = ls_mposf-def_cat. ls_mpos_data1-/smr/mel_ref = ls_mposf-mel_ref. ls_mpos_data1-/smr/mel_part = ls_mposf-mel_part. ls_mpos_data1-/smr/mel_cat = ls_mposf-mel_cat. ls_mpos_data1-/smr/etops_rat = ls_mposf-etops_rat. ls_mpos_data1-/smr/plan_reqs = ls_mposf-plan_reqs. ls_mpos_data1-/smr/plan_reqb = ls_mposf-plan_reqb. ls_mpos_data1-/smr/plan_reqns = ls_mposf-plan_reqns. ls_mpos_data1-/smr/plan_dai = ls_mposf-plan_dai. ls_mpos_data1-/smr/plan_reqnm = ls_mposf-plan_reqnm. ls_mpos_data1-/smr/plan_reqni = ls_mposf-plan_reqni. ls_mpos_data1-/smr/plan_reqti = ls_mposf-plan_reqti. ls_mpos_data1-/smr/offset1 = ls_mposf-repair_within. CASE ls_mposf-dd_type. WHEN ‘P’. ls_mpos_data1-/smr/add_typep = ‘X’. WHEN ‘NP’. ls_mpos_data1-/smr/add_typen = ‘X’. WHEN ‘I’. ls_mpos_data1-/smr/add_typei = ‘X’. WHEN ‘SC’. ls_mpos_data1-/smr/add_typecs = ‘X’. WHEN ‘C’. ls_mpos_data1-/smr/add_typec = ‘X’. WHEN ‘O’. ls_mpos_data1-/SMR/ADD_TYPEO = ‘X’. ENDCASE. **need to check ls_mpos_data1-/smr/offset2 = ls_mposf-rapair_interval. ls_mpos_data1-/smr/uom1 = ls_mposf-unit. ls_mpos_data1-plnnr = ls_mposf-plnnr. ls_mpos_data1-plnal = ls_mposf-plnal. IF NOT ls_mpos_data1-plnnr IS INITIAL. ls_mpos_data1-plnty = c_a. ELSE. ls_mpos_data1-plnty = ‘ ‘. ENDIF. ***need to check ls_mpos_data1-warpl = ls_mposf-warpl. ls_mpos_data1-wapos = ls_mposf-wapos. APPEND ls_mpos_data1 TO lt_mpos_data1. * ENDLOOP. **order header APPEND ls_ord_hdr_data1 TO lt_ord_hdr_data1. DATA lv_func_name TYPE string. CASE lr_deep_entity-code. WHEN c_clrd. lv_func_name = ‘/TCSMRO/LI5_LBK_CLEAR_DEFECT’. WHEN c_crad. lv_func_name = ‘/TCSMRO/LI5_LBK_DEFER_DEFECT’. WHEN c_read. lv_func_name = ‘/TCSMRO/LI5_LBK_REASS_DEFECT’. WHEN c_crt. lv_func_name = ‘/TCSMRO/LI5_LBK_RAISE_DEFECT’. WHEN c_upd. lv_func_name = ‘/TCSMRO/LI5_UPDATE_DEFECT’. ENDCASE. IF lv_func_name IS NOT INITIAL. CALL FUNCTION lv_func_name EXPORTING is_notification = ls_general_data it_ord_comp = lt_ord_comp_data1 it_ord_opr = lt_ord_opr_data1 is_aufnr_hdr = ls_ord_hdr_data1 is_mpos = ls_mpos_data1 IMPORTING e_msg_type = e_msg_type e_msg_text = e_msg_text TABLES et_return = lt_return. ELSEIF lr_deep_entity-code = c_clsd. CALL FUNCTION ‘/TCSMRO/LI5_CLOSE_DEFECT’ EXPORTING is_notification = ls_general_data IMPORTING e_msg_type = e_msg_type e_msg_text = e_msg_text TABLES et_return = lt_return. ENDIF. er_deep_entity-msg_text = e_msg_text. er_deep_entity-msg_type = e_msg_type. LOOP AT lt_return INTO ls_return. ls_ret_msg-type = ls_return-type. ls_ret_msg-message = ls_return-message. APPEND ls_ret_msg TO lt_ret_msg. CLEAR:ls_return, ls_ret_msg. ENDLOOP. er_deep_entity-notif_return_nav = lt_ret_msg. ENDMETHOD.
<?xml version=”1.0″ encoding=”UTF-8″?> <atom:entry xmlns:atom=”http://www./2005/Atom“ xmlns:d=”http://schemas.microsoft.com/ado/2007/08/dataservices“ xmlns:m=”http://schemas.microsoft.com/ado/2007/08/dataservices/metadata“> <atom:content type=”application/xml”> <m:properties> <d:Qmnum></d:Qmnum> <d:code>CRT</d:code> <d:FLLOGID>N102131204</d:FLLOGID> <d:TLLOGID>TLAA077303</d:TLLOGID> <d:FUNCLOCATION>N-5679</d:FUNCLOCATION> <d:SECTREF>GA047101LHR20131204</d:SECTREF> <d:Erdat>20160425</d:Erdat> <d:Qmnam>345153</d:Qmnam> <d:Faultcode></d:Faultcode> <d:AsrGfor>false</d:AsrGfor> <d:Nildef>false</d:Nildef> <d:Defcode>2340</d:Defcode> <d:DefPos></d:DefPos> <d:Techlog></d:Techlog> <d:DdLtext>symptoms</d:DdLtext> <d:ActionText>action</d:ActionText> <d:Structural>false</d:Structural> <d:CompReplacement>false</d:CompReplacement> <d:MaterialRequest>false</d:MaterialRequest> <d:Source>MM</d:Source> <d:DueDate></d:DueDate> <d:Mech></d:Mech> <d:Inspection></d:Inspection> <d:License></d:License> <d:AddAuth></d:AddAuth> </m:properties> </atom:content> <atom:link rel=”http://schemas.microsoft.com/ado/2007/08/dataservices/related/notif_comp_nav“ type=”application/atom+xml;type=feed” title=”***LI5_LBK_DEFECT_DET_SRV/ord_compset”> <m:inline> <atom:feed> <atom:entry> <atom:content type=”application/xml”> <m:properties> <d:Qmnum></d:Qmnum> <d:ReservNo></d:ReservNo> <d:ResItem></d:ResItem> <d:Material>622-9252-001:4V792</d:Material> <d:MaterialDesc></d:MaterialDesc> <d:ReqQuan>4</d:ReqQuan> <d:Unit></d:Unit> <d:OrderNo></d:OrderNo> </m:properties> </atom:content> </atom:entry> <atom:entry> <atom:content type=”application/xml”> <m:properties> <d:Qmnum></d:Qmnum> <d:ReservNo></d:ReservNo> <d:ResItem></d:ResItem> <d:Material>622-9252-001:4V792</d:Material> <d:MaterialDesc></d:MaterialDesc> <d:ReqQuan>8</d:ReqQuan> <d:Unit></d:Unit> <d:OrderNo></d:OrderNo> </m:properties> </atom:content> </atom:entry> </atom:feed> </m:inline> </atom:link> <atom:link rel=”http://schemas.microsoft.com/ado/2007/08/dataservices/related/notif_opr_nav“ type=”application/atom+xml;type=feed” title=”***LI5_LBK_DEFECT_DET_SRV/ord_oprset”> <m:inline> <atom:feed> <atom:entry> <atom:content type=”application/xml”> <m:properties> <d:Qmnum></d:Qmnum> <d:Skill>B1</d:Skill> <d:WorkCntr>GALY10B1</d:WorkCntr> <d:WorkActivity>11.0</d:WorkActivity> <d:Unit>MIN</d:Unit> <d:OrderNo></d:OrderNo> <d:Activity></d:Activity> <d:SubActivity></d:SubActivity> <d:ControlKey>AM01</d:ControlKey> <d:FLAG>U</d:FLAG> </m:properties> </atom:content> </atom:entry> <atom:entry> <atom:content type=”application/xml”> <m:properties> <d:Qmnum></d:Qmnum> <d:Skill>B1</d:Skill> <d:WorkCntr>GALY10M5</d:WorkCntr> <d:WorkActivity>12.0</d:WorkActivity> <d:Unit>MIN</d:Unit> <d:OrderNo></d:OrderNo> <d:Activity></d:Activity> <d:SubActivity></d:SubActivity> <d:ControlKey>AM01</d:ControlKey> <d:FLAG>U</d:FLAG> </m:properties> </atom:content> </atom:entry> </atom:feed> </m:inline> </atom:link> </atom:entry> NOTE: Please note that the names you use while creating the deep structure inside your DPC_EXT class of Create_Deep_Entity method should be same as the navigation properties defined in your SEGW Model. This is how we need to construct our payload. Then click on execute button and see the result on right side pane. |
|