Netweaver Gateway Development

how to implement $expand query(GET_EXPANDED_ENTITY method) in SAP?

                     The $expand query option is very powerful and allows you to provide multiple entities and/or entity sets in one single service call, instead of performing several calls subsequently.
                       In our previous tutorial we implemented GET_EXPANDED_ENTITYSET method.In this tutorial we will implement GET_EXPANDED_ENTITY method.ie $expand for single entry.
                       For $expand query to work an association or navigation property should be created.To know more about association refer Implement association.
                      In this tutorial we will create an association from our flight entity set to flight schedule entityset.Then we will implement get_expanded_entity method.

Pre-requisites


  1. GET_ENTITYSET of flightset implemented already.(GET_ENTITYSET implementation)
  2. GET_ENTITY of flightset implemented already.(Refer OData Service Implementation for GET_ENTITY)
  3. FlightScheduleSet created by importing ddic structure SPFLI table(Please refer  my previous post step-by-step-gateway-odata-service)
Syntax
    
http://<host>:<port>/sap/opu/odata/SAP/ZTEST_ODATA_SRV_01/FlightSet('AC')?$expand=ToFlightSchedules


Steps

  1. First step is creating association.For this Open the service and click on edit button.Expand Data Model.Right click on Associations and click on create button.Association wizard will be opened.
  2. In the association wizard you have to give Association Name,Principal entity type name,Dependant entity type name,cardinality and Navigation Property name.Navigation Property name is used when accessing associated entity data in our OData url.(Create related navigation property check box will be checked by default).After entering values to these fields click next.
  3. You will land on step 2 of association wizard.Select dependent property and click next.Dependent property will be the key relating two entities.
  4. In step 3 select Principal entityset and dependant entityset and click finish.
  5. Finally our odata service should look like this.See navigation propery is added to flight entity set.Also an association and association set is created.Press generate button.
  6. Now open our ****_DPC_EXT class and go to edit mode.
     
  7. From inherited methods node find /IWBEP/IF_MGW_APPL_SRV_RUNTIME~GET_EXPANDED_ENTITY and right click and press redefine.
  8. Its time for some coding.Paste below code inside GET_EXPANDED_ENTITY method.

  9.     
        data lv_entityset_name type string.
        data: begin of str_exp.
                include  type zcl_ztest_odata_01_mpc_ext=>ts_flight.
        data: toflightschedules type  zcl_ztest_odata_01_mpc_ext=>tt_flightschedule.
    
          data:    end of str_exp.
    
        data: lt_expand   like   str_exp,
              ls_expand   like str_exp,
              ls_schedule type zcl_ztest_odata_01_mpc=>ts_flightschedule.
        data:it_flight   type  table of scarr,
             wa_flight   like line of it_flight,
             it_schedule type table of spfli,
             wa_schedule like line of it_schedule.
        data:ls_keytab TYPE LINE OF /IWBEP/T_MGW_NAME_VALUE_PAIR.
    
    
        constants: lc_expand_tech_clause type string value 'TOFLIGHTSCHEDULES'.
        lv_entityset_name = io_tech_request_context->get_entity_set_name( ).
    
        case lv_entityset_name.
          when 'FlightSet'.
            loop at it_key_tab INTO ls_keytab.
        ENDLOOP.
            select * from scarr into corresponding fields of table it_flight WHERE carrid = ls_keytab-value.
            select * from spfli into table it_schedule WHERE carrid = ls_keytab-value.
            if sy-subrc = 0.
    
              loop at it_flight into wa_flight.
                move-corresponding wa_flight to ls_expand .
                loop at it_schedule into wa_schedule where carrid = wa_flight-carrid.
                  move-corresponding wa_schedule to ls_schedule.
                  append ls_schedule to ls_expand-toflightschedules.
                  clear ls_schedule.
                endloop.
    
              endloop.
            endif.
        endcase.
    
        copy_data_to_ref(
      exporting
       is_data = ls_expand
      changing
       cr_data = er_entity ).
    insert lc_expand_tech_clause into table et_expanded_tech_clauses.
    

  10. Now we can test  in gateway client( /IWFND/GW_CLIENT).Our service url look like this.http://<host>:<port>/sap/opu/odata/SAP/ZTEST_ODATA_SRV_01/FlightSet('AC')?$expand=ToFlightSchedules.Press execute button.ToFlightSchedules is the navigation property.
If you enjoyed this post, Please Share!!

24 comments :

  1. Hi! First of all thanks for your help with this post. I am trying to do this, but I am receving a error:

    URL:
    /sap/opu/odata/sap/ZTESTE_ODATA_SRV/FlightSet('AA')?$expand=ToFlightSchedules

    ERROR:
    In the context of Data Services an unknown internal server error occurred

    Can you HELP-ME?

    ReplyDelete
    Replies
    1. Check the error log '/IWFND/ERROR_LOG'.And Resolve the error

      Delete
  2. Hi. Thanks for the explanation. 2 questions:
    1) Why do i have to redefine GET_ENTITY and GET_ENTITYSET for use GET_EXPANDED_ENTITYSET?
    2) I redefined as your example but when i test it the only method called is GET_ENTITY, with or without $expand.

    ReplyDelete
    Replies
    1. 1.Try without redefining those methods..You will get method not implemented error while calling expanded entityset method.
      2.For get_entity to work first get_entityset has to work right?

      Delete
    2. Thanks for the explanation. You are absolute right! Now, i'm following your examples to implement this kind of query into a SAPUI5 app. Thanks again!

      Delete
  3. You are welcome. Thank for feedback

    ReplyDelete
  4. When to use ~GET_EXPANDED_ENTITY VS GET_EXPANDED_ENTITYSET ?

    ReplyDelete
    Replies
    1. when you need to show a list of items with nested data you can use get_expanded_entityset. for example salesorders with lineitems as a list. When you need to show just a salesorder with multiple lineitems use get_expandedentity. use case is Suppose we just need to show the lineitems when clicking on a listitem in a list.

      Delete
  5. Hi, i'm new to odata, i already created a deep entity to get from a fiori UI. i redefined the method Define in MPC and redefined the CREATE Deep entity. Also created an custom method just to read the data from fiori using io_data_provider. the problem is i can only get the values from the entity but for the entityset there are no data during this process. Upon debugging there are data in the entityset.

    ReplyDelete
    Replies
    1. Are you using er_entityset to export data.. If Data is available as table structure it should export values

      Delete
  6. Hi Rajesh,

    I have a scenario where i will pass the filter values .Suppose if the record is present in the parent entity and not present in the child entity.I should not display the parent entity record in the front end . Can you help me out on that.

    ReplyDelete
  7. I have implemented in same way with 2 entityset set. header displayed on the output but not item data. er_entiryset is having header and item data both

    ReplyDelete
    Replies
    1. did you forget this line of code?
      'insert lc_expand_tech_clause into table et_expanded_tech_clauses.'
      Please check

      Delete
  8. I have implemented in same way with 2 entityset set. header displayed on the output but not item data. er_entiryset is having header and item data both,also implemented 'insert lc_expand_tech_clause into table et_expanded_tech_clauses.' this line too..

    ReplyDelete
  9. I have created in the same manner as described above.. but while testing GET_EXPANDED_ENTITYSET method triggering multiple times and the results are also coming wrong.

    ReplyDelete
  10. Here we are implementing GET_EXPANDED_ENTITY not GET_EXPANDED_ENTITYSET method.

    ReplyDelete
  11. Dear Rajesh,

    could you please let me know whether $expand = AB,BC/BD/DE will work or are there any limitations..
    In your example ToFlightSchedules is navigation, here you are using only one navigation, suppose i have 3 navigation in same FlightSet then what will be $expand and will it work? Am facing issue with this, your comment will help..

    Thanks in Advance

    ReplyDelete
    Replies
    1. I think it should work. Here BC should be parent of BD and BD should be parent of DE and Also BC Should be parent of DE. Here multiple and multilevel exapand come in same query.

      Delete

Powered by Blogger.