Skip to Content
Technical Articles
Author's profile photo Srinivas Narra

Display Messages in ODATA Header Response while success and update and usage of ALL Query operations.

 

Introduction

This article explains the gradual creation of OData services, mapping messages on the OData response header, and simple operations($filter, $orderby, $inline count, $skip and $top).

Overview:-

 1) Creation of OData service

 2) Registering the OData Service

 3) Redefine methods to write the code

 4) Simple operations of OData

 5) Add Success/ Error Message

 6) Configuration settings to resolve HTTP proxy error

 

1) Creation of OData service

Go to transaction code – SEGW.

 

Click on Icon Create. A pop window will appear, Fill the details as per below mention in screen shot and click on check icon or enter.

 

 

Below screen will appear where you can see below folder in project. In Folder data model, we can see three sub folders. Entity Type – it acts as work area, Entity Sets -It act as internal table and associations.
Now we are going to define structure of work area and internal table, Right click on Data model select import and select DDIC structure .

 

 

Here give the details of structure and structure name as per below screen below.
Select radio button Entity type and click on check box entity set. fill ABAP structure as required and click on next.

 

 

Now you will get the popup screen with provided table fields name. Select fields for your structure and click on next.

 

 

Other window will appear where we have to select the key field. Please select the key field
and click on finish.

 

 

Let’s generate Runtime Artifacts. Click on generate runtime objects button. It will display a popup and it will ask for a package, provide it. Keep the default class names as-is and click on enter button.

 

 

 

On successful generation, you will see this kind of message log and generated artifacts. 4 classes will get generated. 2 for Data provider and 2 for Model provider class.

 

 

 2) Registering the Service

Go to transaction code /IWFND/MAINT_SERVICE and Click on Add services button .

 

Below screen will appear. Provide system Alias and click on Get services button.
Now select your service and click on Add selected Services.

 

The below screen will appear, enter the package details and click on tick icon. An Information message will be shown where it will confirm about the service is created and metadata loaded successfully.

 

Now click back and go to main screen of transaction /IWFND/MAINT_SERVICE and find your service. Click on SAP Gateway Client and actually test your service.

 

Click on execute button and you can see your first created OData in action.

 

If you want to see your output in JSON, just change $format=xml to $format=Json. You can see these options in ADD URI OPTION button.

 

Now we will write code to get data.

 3) Redefine methods to write the code

Go to transaction code SEGW and open Runtime artifacts folder and right click on Class ZCL_ZODATA_SERVICE_DPC_EXT and select Go to ABAP Workbench option. Select edit mode and redefine method SOHEADERSET_GET_ENTITYSET. Write code in the methods. Save and activate all related objects for classes.

 

The corresponding Methods displayed like

 

Again Go to The Transaction /IWFND/MAINT_SERVICE and find your service.
Click on SAP Gateway Client and select the Entity set from the entity sets button and execute, you will get the header data in response.

 

 4) Simple operations of OData

$count,$filter,$orderby,$inlinecount,$top and $skip operations using OData services

SOURCE CODE :

 

SELECT * FROM zsodetails into CORRESPONDING FIELDS OF TABLE ET_ENTITYSET UP TO  3 ROWS.


***The below method is for Filter conditions
       CALL METHOD /IWBEP/CL_MGW_DATA_UTIL=>FILTERING
       EXPORTING
       IT_SELECT_OPTIONS = IT_FILTER_SELECT_OPTIONS
       CHANGING
       CT_DATA = ET_ENTITYSET.


*** The below method is for Skip and Top Functions
       CALL METHOD /IWBEP/CL_MGW_DATA_UTIL=>PAGING
       EXPORTING
       IS_PAGING = IS_PAGING
       CHANGING
       CT_DATA = ET_ENTITYSET.


***The below method is for Ascending and Descending order
        CALL METHOD /IWBEP/CL_MGW_DATA_UTIL=>orderby
        EXPORTING
        IT_ORDER = IT_ORDER
        CHANGING
        CT_DATA = ET_ENTITYSET.

***The below logic is for inline count

        IF io_tech_request_context->has_inlinecount( ) = abap_true.
        DESCRIBE TABLE et_entityset LINES es_response_context-inlinecount.
        ELSE.
        CLEAR es_response_context-inlinecount.

        ENDIF.








$Filter:-

Filter option is used to limit the results.

 

$Inline count:-

Inline count means it displays the data with count as below

 

$Top:-

top=1 means first 1 record will be displayed in the data

 

$Skip:-

Skip1 means it skips one record while displaying.

 

$Skip and Top:-

Top 2 means it will display the first two records and skip 1 means only one record skip in the data.

 

$Count:-

It gets all the records count of the data

 

$orderby:-

Displays data either Ascending or Descending order.

Descending Order:-

 

Ascending order:-

 

 5) Add Success/ Error Message

Success/Error messages on ODATA Header response.

 SOURCE CODE:

 

DATA lo_message_container TYPE REF TO /iwbep/if_message_container.

lo_message_container = me->mo_context->get_message_container( ).

"only to display message text.

CALL METHOD lo_message_container->add_message_text_only
EXPORTING
iv_msg_type = 'S'
iv_msg_text = 'SUCCESS'
iv_add_to_response_header = abap_true.

"To display msg id in combination with message text.

lo_message_container = me->mo_context->get_message_container( ).
lo_message_container->add_message(
EXPORTING
iv_msg_type = 'S'
iv_msg_id = 'ZMSG1'
iv_msg_number = '1'
iv_msg_v1 = 'Success'
iv_is_leading_message = abap_true
iv_add_to_response_header = abap_true
).

"To display msg id in combination with message text by using  add_message_from_bapi “
 method SOHEADERSET_UPDATE_ENTITY.

    DATA(lt_headers) = /iwbep/if_mgw_conv_srv_runtime~get_dp_facade( )->get_request_header( ).
    DATA(lv_request_uri) = lt_headers[ name = '~request_uri' ]-value.
    DATA(lv_context_path) = match( val = lv_request_uri regex = `/([^\/]+)\/?$` ).
    DATA(lv_message_target) = lv_context_path && |/Field1|. "/MyEntity('Key')/Field1

DATA lt_msg_types TYPE TABLE OF char1.

  io_data_provider->read_entry_data( IMPORTING es_data = ls_request_input_data ).

** Update fields of table Zsodetails

    UPDATE zsodetails SET
                          time     = ls_request_input_data-time
                          ernam     = ls_request_input_data-ernam
                          name1   = ls_request_input_data-name1
                          WHERE Vbeln  = lv_Vbeln.
    IF sy-subrc = 0.
      er_entity = ls_request_input_data. "Fill exporting parameter ER_ENTITY
*     er_entity-show_warning = 'X'.
*     er_entity-show_Info = 'X'.
      er_entity-show_success = 'X'.
*     er_entity-show_error = 'X'.
    ENDIF.

*** determine which messages to show

    IF er_entity-show_warning = abap_true.
      APPEND /iwbep/if_message_container=>gcs_message_type-warning TO lt_msg_types.
    ENDIF.
    IF er_entity-show_info EQ abap_true.
      APPEND /iwbep/if_message_container=>gcs_message_type-info TO lt_msg_types.
    ENDIF.
    IF er_entity-show_success EQ abap_true.
      APPEND /iwbep/if_message_container=>gcs_message_type-success TO lt_msg_types.
    ENDIF.
    IF er_entity-show_error EQ abap_true.
      APPEND /iwbep/if_message_container=>gcs_message_type-error TO lt_msg_types.
    ENDIF.

    DATA lt_return TYPE STANDARD TABLE OF bapiret2.
  LOOP AT lt_msg_types ASSIGNING FIELD-SYMBOL(<fs_msg_type>).

 " create bapi message
      APPEND INITIAL LINE TO lt_return ASSIGNING FIELD-SYMBOL(<fs_return>).

      MESSAGE ID '00' TYPE <fs_msg_type> NUMBER 001
         INTO <fs_return>-message
*        WITH |message { sy-tabix } type { <fs_msg_type> } value { er_entity-Vbeln }|.
         WITH |Error { <fs_msg_type> } value { er_entity-Vbeln }|.

      CALL FUNCTION 'BALW_BAPIRETURN_GET2'
        EXPORTING
          type   = sy-msgty
          cl     = sy-msgid
          number = sy-msgno
          par1   = sy-msgv1
        IMPORTING
          return = <fs_return>.

*--- only link Errors and Warning to the target field

 <fs_return>-field=COND#(WHEN<fs_msg_type>=/iwbep/if_message_container=>gcs_message_type-warning THEN
                   lv_message_target
                   WHEN <fs_msg_type> = /iwbep/if_message_container=>gcs_message_type-error THEN 
                   lv_message_target ELSE || ).
    ENDLOOP.

  LOOP AT lt_return ASSIGNING <fs_return>.
      " add message from bapi structure
      mo_context->get_message_container( )->add_message_from_bapi(
      EXPORTING is_bapi_message   = <fs_return>
        iv_entity_type = iv_entity_set_name
        it_key_tab = VALUE /iwbep/t_mgw_name_value_pair( ( name = 'Vbeln' value = er_entity-Vbeln ) )
        iv_add_to_response_header = abap_true
        iv_message_target = CONV string( <fs_return>-field ) ).
   ENDLOOP.
     MODIFY zsodetails FROM er_entity.
  endmethod.

Displaying messages by using add_messages method.

Success:-

 

Displaying messages by using add_message_from_bapi Method.

Success:-

 

Warning:-

 

Error:-

 

Note:- If the below error is encountered while executing the ODATA service please follow the below steps to resolve.

6) Configuration settings to resolve HTTP proxy error

 

Go to transaction SICF (HTTP service Hierarchy maintenance)

 

 

 

Go to client -> Proxy settings

 

Please uncheck “Proxy setting is active” and it will resolve the issue.

 

Conclusion

You have just created a basic OData service and have done simple operations and as well as mapping messages on the OData response header. I hope you enjoyed it.

Assigned tags

      3 Comments
      You must be Logged on to comment or reply to a post.
      Author's profile photo Dominik Eira Elias
      Dominik Eira Elias

      Hi Srinivas,

      please be aware that this is not possible in SAP BTP ABAP Environment as transaction SEGW is not available. The recommended way to build services is the ABAP RESTful Programming Model: https://help.sap.com/viewer/923180ddb98240829d935862025004d6/Cloud/en-US/289477a81eec4d4e84c0302fb6835035.html

      You can read more about the messages concept in RAP here: https://help.sap.com/viewer/923180ddb98240829d935862025004d6/Cloud/en-US/ac74189b5cae49c1b091f04393bac069.html

      However, when building SEGW project (in OnPremise) it is recommended to use the ABAP Programming Model for SAP Fiori. More information about messages in this programming model can be found here: https://help.sap.com/viewer/cc0c305d2fab47bd808adcad3ca7ee9d/1809.000/en-US/e82b394740b047ff8b86bb628f7a1ef2.html?q=messages

      When building SEGW projects using SEGW it is recommended to use Reference Data Source (RDS) over custom built projects: https://help.sap.com/doc/saphelp_nw75/7.5.5/en-US/d0/d28697a5804135afa8d188c91dae83/content.htm?no_cache=true

      In both frameworks, the involved frameworks take over the responsibility to map and return messages accordingly.

      Best regards,
      Dominik

      Author's profile photo Srinivas Narra
      Srinivas Narra
      Blog Post Author

      Thank you for your valuable corrections and suggestions that enused.

      Author's profile photo Jelena Perfiljeva
      Jelena Perfiljeva

      Hi Srinivas,

      As Dominik pointed out, there are other development models available these days. This blog describes a code-based OData development approach that would be valid for older releases, like 7.31.

      There have been many blogs on this subject posted around 2012-2013 when this was the most common approach to development. Here is just one example: https://blogs.sap.com/2013/06/20/how-to-develop-query-options-for-an-odata-service-using-code-based-implementation/

      Since there is already a lot of material on this, I'm not sure if much can be added to the conversation. But if you chose to write about that type of development then you could save the explanation of the basics like setting up a SEGW project by including a link to one of many blogs that explain the same steps, and just focus on a specific aspect in more detail. That would make the blog easier to read and more concise.

      Edit: just saw a new blog with an availability matrix for all the different GW development models. Take a look: https://blogs.sap.com/2021/07/12/compact-feature-availability-matrix-of-abap-programming-models/

      Thank you!