ABAP Environment, SAP ABAP

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.

Leave a Reply

Your email address will not be published. Required fields are marked *