转载:https://blogs.sap.com/2014/07/18/implementing-expand-entityentity-set/
Requirement
Considering a basic scenario where i am using BAPI_PO_GETDETAIL which has multiple output tables and input is PO number
Now we shall start with SAP Gateway
Create Project in SEGW
Create three entity types and Entity Sets
Entity Type-1- Header
Entity Type-2- Item
Entity Type-3- Schedule
Entity Set-1- HeaderSet
Entity Set-2- ItemSet
Entity Set-3- ScheduleSet
Create Association
Association-1 – AssItem (Without key fields mapping)
Association-2 – AssSchedule (Without key fields mapping)
Create Navigation
Navigation-1 – NavItem
Navigation-2 – NavSchedule
Let’s generate runtime artifacts. Click on generate runtime objects 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.
we have to Redefine the method/IWBEP/IF_MGW_APPL_SRV_RUNTIME~GET_EXPANDED_ENTITYSET
Code Snippet
METHOD /iwbep/if_mgw_appl_srv_runtime~get_expanded_entityset.
*————————————————————————-*
* Deep Structure
*————————————————————————-*
DATA: BEGIN OF ls_order_items.
INCLUDE TYPE zcl_zproj_982_mpc=>ts_header.
DATA: navitem TYPE STANDARD TABLE OF zcl_zproj_982_mpc=>ts_item WITH DEFAULTKEY.
DATA: navschedule TYPE STANDARD TABLE OF zcl_zproj_982_mpc=>ts_schedule WITHDEFAULT KEY,
END OF ls_order_items,
ls_item1 TYPE zcl_zproj_982_mpc=>ts_item,
ls_schedle1 TYPE zcl_zproj_982_mpc=>ts_schedule.
*————————————————————————-*
* Data Declarations
*————————————————————————-*
DATA : ls_item TYPE zcl_zproj_982_mpc_ext=>ts_item,
lt_item TYPE TABLE OF zcl_zproj_982_mpc_ext=>ts_item,
ls_sch TYPE zcl_zproj_982_mpc_ext=>ts_schedule,
lt_sch TYPE TABLE OF zcl_zproj_982_mpc_ext=>ts_schedule,
ls_header TYPE zcl_zproj_982_mpc_ext=>ty_header,
lthead TYPE STANDARD TABLE OF bapiekkol,
lshead TYPE bapiekkol,
lsitem TYPE bapiekpo,
ltitem TYPE STANDARD TABLE OF bapiekpo,
lv_filter_str TYPE string,
lt_filter_select_options TYPE /iwbep/t_mgw_select_option,
ls_filter TYPE /iwbep/s_mgw_select_option,
ls_filter_range TYPE /iwbep/s_cod_select_option,
ls_expanded_clause1 LIKE LINE OF et_expanded_tech_clauses,
ls_expanded_clause2 LIKE LINE OF et_expanded_tech_clauses,
lv_ebeln TYPE ebeln,
lt_order_items LIKE TABLE OF ls_order_items,
ltsch TYPE STANDARD TABLE OF bapieket,
lssch TYPE bapieket.
*————————————————————————-*
* Entity Set – HeaderSet
*————————————————————————-*
CASE iv_entity_set_name.
WHEN ‘HeaderSet’.
LOOP AT it_filter_select_options INTO ls_filter.
LOOP AT ls_filter–select_options INTO ls_filter_range.
TRANSLATE ls_filter–property TO UPPER CASE.
CASE ls_filter–property.
WHEN ‘PONUMBER’.
lv_ebeln = ls_filter_range–low.
WHEN OTHERS.
” Log message in the application log
me->/iwbep/if_sb_dpc_comm_services~log_message(
EXPORTING
iv_msg_type = ‘E’
iv_msg_id = ‘/IWBEP/MC_SB_DPC_ADM’
iv_msg_number = 020
iv_msg_v1 = ls_filter–property ).
” Raise Exception
RAISE EXCEPTION TYPE /iwbep/cx_mgw_tech_exception
EXPORTING
textid = /iwbep/cx_mgw_tech_exception=>internal_error.
ENDCASE.
ENDLOOP.
ENDLOOP.
*————————————————————————-*
* Call Method-BAPI_PO_GETDETAIL
*————————————————————————-*
CALL FUNCTION ‘BAPI_PO_GETDETAIL’
EXPORTING
purchaseorder = lv_ebeln
items = ‘X’
schedules = ‘X’
IMPORTING
po_header = lshead
* PO_ADDRESS =
TABLES
* PO_HEADER_TEXTS =
po_items = ltitem
po_item_schedules = ltsch.
*————————————————————————-*
* Fill Header Values to Deep Structure
*————————————————————————-*
ls_order_items–ponumber = lshead–po_number.
ls_order_items–ccode = lshead–co_code.
ls_order_items–doctype = lshead–doc_type.
*————————————————————————-*
* Fill Item values to Deep Structure
*————————————————————————-*
LOOP AT ltitem INTO lsitem.
CLEAR ls_item1.
ls_item1–ponumber = lsitem–po_number.
CALL FUNCTION ‘CONVERSION_EXIT_ALPHA_OUTPUT’
EXPORTING
input = ls_item1–ponumber
IMPORTING
output = ls_item1–ponumber.
ls_item1–poitem = lsitem–po_item.
ls_item1–material = lsitem–material.
APPEND ls_item1 TO ls_order_items–navitem.
ENDLOOP.
*————————————————————————-*
* Fill Schedule values to Deep Strcture
*————————————————————————-*
LOOP AT ltsch INTO lssch.
CLEAR ls_item1.
* ls_item1-ponumber = lsitem-po_number.
ls_schedle1–poitem = lssch–po_item.
ls_schedle1–serial = lssch–serial_no.
APPEND ls_schedle1 TO ls_order_items–navschedule.
ENDLOOP.
*————————————————————————-*
* Assign the Navigation Proprties name to Expanded Tech clauses
*————————————————————————-*
ls_expanded_clause1 = ‘NAVITEM’.
ls_expanded_clause2 = ‘NAVSCHEDULE’.
APPEND ls_expanded_clause1 TO et_expanded_tech_clauses.
APPEND ls_expanded_clause2 TO et_expanded_tech_clauses.
*————————————————————————-*
* Append Deep Strcture Values to Final Internal Table
*————————————————————————-*
APPEND ls_order_items TO lt_order_items.
*————————————————————————-*
* Send back Response to Consumer
*————————————————————————-*
copy_data_to_ref(
EXPORTING
is_data = lt_order_items
CHANGING
cr_data = er_entityset ).
WHEN OTHERS.
ENDCASE.
ENDMETHOD.
Coding Part Done….Lets move to Testing
Test Case 1:
URI : /sap/opu/odata/sap/ZPROJ_982_SRV/HeaderSet?$filter=PoNumber eq ‘4500000163’&$expand=NavItem
Test Case 2:
URI : /sap/opu/odata/sap/ZPROJ_982_SRV/HeaderSet?$filter=PoNumber eq ‘4500000163’&$expand=NavItem,NavSchedule
For Expand Entity :-
From the modelling point of view there wont be any changes
but in DPC we need to Redefine the method /iwbep/if_mgw_appl_srv_runtime~get_expanded_entity.
Also there would be a small change in Code , Like Below
*————————————————————————-*
* Deep Structure
*————————————————————————-*
DATA: BEGIN OF ls_order_items.
INCLUDE TYPE zcl_zproj_982_mpc=>ts_header.
DATA: navitem TYPE STANDARD TABLE OF zcl_zproj_982_mpc=>ts_item WITH DEFAULTKEY.
DATA: navschedule TYPE STANDARD TABLE OF zcl_zproj_982_mpc=>ts_schedule WITHDEFAULT KEY,
END OF ls_order_items,
ls_item1 TYPE zcl_zproj_982_mpc=>ts_item,
ls_schedle1 TYPE zcl_zproj_982_mpc=>ts_schedule.
copy_data_to_ref(
EXPORTING
is_data = ls_order_items
CHANGING
cr_data = er_entity ).
Hope this Blog now helps you to implement Expand Entity/Entityset
Waiting for your feed back and suggestions and more questions