[adsenseyu2]
Hello everyone, in this Netweaver Gateway tutorial we will learn how to use $expand query option in SAP netweaver gateway OData service. Before proceeding further we assume that you know how to build OData service in sap gateway. Access all SAP Netweaver Gateway tutorials here.Lets get started
1.What $expand query option does ?
Query option $expand is used to read multiple entities or entity sets in a single service call instead of two different calls. Prerequisite, entity sets which are used should be associated. To know about Association in OData service click here.
2.Supported System Version
SAP NetWeaver Gateway Release-采购向厂商下P/O之后,必须透过一定权限经由主管对此张P/O做 release后才能收料 2.0 Support Package >=03
3.Business Example
A gateway OData service is having two entity sets ‘SalesOrderSet‘ and ‘OrderItemsSet‘ which are associated. Usually to get the Order and its item details we require two service calls one for sale-ale settingss order and second is to get order items for that sale-ale settingss order, but we want them in a single service call. To achieve this $expand query option is used.
4.Syntax
Single Sales Order and its line items
http://<server>:<port>/sap/opu/odata/sap/<servicename>/SalesOrders(‘123’)?$expand=ToOrderItems
Multiple Sales Order and their line items
http://<server>:<port>/sap/opu/odata/sap/<servicename>/SalesOrders?$expand=ToOrderItems
where $expand = <Navigation_Property_Name>
5.How to Implement $expand query option in OData Service ?
Normally no implementation is required explicitly to use $expand query option. By default SAP NetWeaver Gateway provided a generic $expand implementation.
We can directly test the service by adding $expand query option, so lets do that and see whether we are able get the order and line item data in a single call. We assume that you have already build the OData service with two entity sets to get the orders and line items. if you have not click here.
Execute the below URI in SAP Netweaver Gateway Client.
/sap/opu/odata/sap/ZDEMO_GW_SRV_SRV/SalesOrderSet(‘500000017’)?$expand=ToOrdetItems.
You should get both Order Information and Item information in single service call.Output below.
6.Now the question is , Why should we need to do an explicit implementation for $expand ?
SAP Netweaver Gateway will handle the $expand query function in this way
First, it calls the GET_ENTITY / GET_ENTITYSET for Sales Order headers.
Second, it calls the GET_ENTITYSET of Order Items in a Loop for each above Sales Orders retrieved.
This make the standard framework a performance issue, so to boost-up the performance we do an explicit implementation for $expand query option by using following methods
/IWBEP/IF_MGW_APPL_SRV_RUNTIME~GET_EXPANDED_ENTITY
/IWBEP/IF_MGW_APPL_SRV_RUNTIME~GET_EXPANDED_ENTITYSET.
Follow the below steps to do the $expand query option implementation.
1. After successful creation of OData service. Go to the DPC_EXT class and identity the method /IWBEP/IF_MGW_APPL_SRV_RUNTIME~GET_EXPANDED_ENTITY and redefine it.
2. Copy and paste the below code in the method.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 |
DATA : BEGIN OF ls_order_item_data. INCLUDE TYPE zcl_zdemo_gw_srv_mpc=>ts_sale-ale settingssorder. DATA: itemdata TYPE zcl_zdemo_gw_srv_mpc=>tt_orderitems, END OF ls_order_item_data. DATA: lv_entity_set_name TYPE /iwbep/mgw_tech_name, ls_headerdata TYPE bapi_epm_so_header, ls_key_tab TYPE /iwbep/s_mgw_name_value_pair, lt_itemdata TYPE STANDARD TABLE OF bapi_epm_so_item, ls_itemdata TYPE bapi_epm_so_item, ls_res_itemdata TYPE zcl_zdemo_gw_srv_mpc=>ts_orderitems, lv_so_id TYPE bapi_epm_so_id. * Get Entity Set Name lv_entity_set_name = io_tech_request_context->get_entity_set_name( ). CASE lv_entity_set_name. WHEN 'SalesOrderSet'. * Get the Sales Order# READ TABLE it_key_tab INTO ls_key_tab WITH KEY name = 'SoId'. IF sy-subrc = 0. lv_so_id = ls_key_tab-value. ENDIF. * Get Order header info and item info CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT' EXPORTING input = lv_so_id IMPORTING output = lv_so_id. CALL FUNCTION 'BAPI_EPM_SO_GET_DETAIL' EXPORTING so_id = lv_so_id IMPORTING headerdata = ls_headerdata TABLES itemdata = lt_itemdata. * Set both header and item data to the response MOVE-CORRESPONDING ls_headerdata TO ls_order_item_data. APPEND LINES OF lt_itemdata TO ls_order_item_data-itemdata. copy_data_to_ref( EXPORTING is_data = ls_order_item_data CHANGING cr_data = er_entity ). WHEN OTHERS. TRY. CALL METHOD super->/iwbep/if_mgw_appl_srv_runtime~get_expanded_entity EXPORTING iv_entity_name = iv_entity_name iv_entity_set_name = iv_entity_set_name iv_source_name = iv_source_name it_key_tab = it_key_tab it_navigation_path = it_navigation_path io_expand = io_expand io_tech_request_context = io_tech_request_context IMPORTING er_entity = er_entity es_response_context = es_response_context et_expanded_clauses = et_expanded_clauses et_expanded_tech_clauses = et_expanded_tech_clauses. CATCH /iwbep/cx_mgw_busi_exception . CATCH /iwbep/cx_mgw_tech_exception . ENDTRY. ENDCASE. |
3. Let us see what we have done in the above step
Check the Entity set name is same as the Entity set name for which we need to $expand implementation.
Get the Sales Order No and Call BAPI to get both header and item data.
Set back the data in the response.
4. We are done with coding part. Lets test the service again, we should get the same output as the standard $expand output earlier.
The outputs are same, so you have successfully implemented the $expand in SAP Netweaver Gateway OData service.
Stay tuned to us for more SAP Netweaver Gateway tutorials.Please feel free to comment and let us know your feedback.
Thank you.