Skip to Content
Technical Articles
Author's profile photo Vinu Kurian

Message Classes – Business Technology Platform (SAP Cloud Platform)

Definition : Message classes are created within an ABAP project at the ABAP package level. They are used to group messages within a development object. So, you can combine related messages and reuse them in other programs. After creating a message class, you add the individual messages.

Message Messages notify a user about unexpected behaviour, an error, a status, or a result of an action. An application will display the message at runtime. A message is specified by a unique 3-digit message number, a single-digit language key, text information, and a message class.

Why do we need message class in cloud ?

                                    Some of you might think that , hey we have SAP UI5 on cloud for front end , so why do we need a message from backend to show messages ?

Front end is not aware of every action or event happening at backend so we need meaningful response

The fact is, UI could bind dynamic responses , so that whatever happens at backend could be shown via messages .

Creating Message Class :

Step 1 : Right click on Package -> New -> Other ABAP Repository Object.

Step 2 : Choose Message Classes -> Next

Update : Earlier message classes were found under Message Class section after the latest update its under Text .

Step 3 : Give a name and Description -> Next

 

Step 4 : Choose Transport Request-> Next

Step 5 : now our message class should look like :

 

Step 6 : Insert some Messages and their Numbers, By clicking the respective cells . Keep in mind that the message number is only three digits long. After entering the specific number of messages save the class (Activation is not required or not permitted for message classes , saving is enough.). Until you save the message there will be a lock symbol in the lock column , lock symbol indicates that the changes in the respective row is not saved .

  • Before Saving

  • After Saving : 

‘&’ – Is the Parameter to be passed to the message , which will replace the symbol with the value of the passed parameter at run time , currently message classes in sap cloud platform support up to 4 parameters , first symbol will be replaced with first parameter , second symbol with second parameter and so on .

Using Message Classes :  Custom Messages using the message class could be used thrown from a behaviour implementation class or a function module / class-method called/ initiated from a  behaviour implementation. Sadly Custom Entities does not support these messages to be thrown. These  messages could be thrown from create/update/delete methods or from save method according to the need .

Since we have three messages configured for Create, Update and Delete  we will respective messages from each method.

Basic Syntax for creation and returning messages:

DATA(item_msg) = new_message( id = 'Z_MESSAGE_CLASS'  " id = Name Of message class

                      number = '001' "number of message defined in the message class 
                      severity = cl_abap_behv=>ms-success "type of message
                      v1 = ls_create-id "First Parameter
                      v2 = ''           "Second Parameter
                      v3 = ''           "Third Parameter
                      v4 = ''           "Fourth Parameter
                      ).
************************** Apeending the Message Response **********************************************
      APPEND VALUE #( %cid = ls_create-%cid " %cid = "Content ID" in ABAP Behavior
        id = ls_create-id "key
       %msg = item_msg "%msg  =  type ref to if_abap_behv_message / Message to be passed
       ) TO reported-zdatadefinition. "type response for reported early zdatadefinition

Now let’s use the message in a behaviour Implementation :

 

This is a basic behaviour Implementation for a CDS.

CLASS lcl_buffer DEFINITION.
* 1) define the data buffer
  PUBLIC SECTION.
    TYPES: BEGIN OF ty_buffer.
             INCLUDE TYPE  ztable  AS lv_table.
    TYPES:   flag TYPE c LENGTH 1,
           END OF ty_buffer.
    CLASS-DATA mt_buffer TYPE TABLE OF ty_buffer.
ENDCLASS.
CLASS lhc_zdatadefinition DEFINITION INHERITING FROM cl_abap_behavior_handler.
  PRIVATE SECTION.

    METHODS create FOR MODIFY
      IMPORTING entities FOR CREATE zdatadefinition.

    METHODS delete FOR MODIFY
      IMPORTING keys FOR DELETE zdatadefinition.

    METHODS update FOR MODIFY
      IMPORTING entities FOR UPDATE zdatadefinition.

    METHODS read FOR READ
      IMPORTING keys FOR READ zdatadefinition RESULT result.

ENDCLASS.

CLASS lhc_zdatadefinition IMPLEMENTATION.

  METHOD create.
    LOOP AT entities INTO DATA(ls_create).
      INSERT VALUE #( flag = 'C' lv_table = CORRESPONDING #( ls_create-%data ) ) INTO TABLE lcl_buffer=>mt_buffer.
****************************************Message Handling Create*******************************
**************C reating Message using Message Class *************************
      DATA(item_msg) = new_message( id = 'Z_MESSAGE_CLASS'  " id = Name Of message class

                      number = '001' "number of message defined in the message class
                      severity = cl_abap_behv=>ms-success "type of message
                      v1 = ls_create-id "First Parameter
                      v2 = ''           "Second Parameter
                      v3 = ''           "Third Parameter
                      v4 = ''           "Fourth Parameter
                      ).
************************** Apeending the Message Response *********************************************************
      APPEND VALUE #( %cid = ls_create-%cid " %cid = "Content ID" in ABAP Behavior
        id = ls_create-id "key
       %msg = item_msg "%msg  =  type ref to if_abap_behv_message / Message to be passed
       ) TO reported-zdatadefinition. "type response for reported early zdatadefinition
******************************************Message End**************************************
    ENDLOOP.

  ENDMETHOD.

  METHOD delete.
    LOOP AT keys INTO DATA(ls_delete).
      READ TABLE lcl_buffer=>mt_buffer
 ASSIGNING FIELD-SYMBOL(<ls_buffer>) WITH KEY id = ls_delete-id.
      " not yet in buffer.
      INSERT VALUE #( flag = 'D' id = ls_delete-id ) INTO TABLE lcl_buffer=>mt_buffer.
****************************************Message Handling Delete*******************************
**************C reating Message using Message Class *************************
      DATA(item_msg) = new_message( id = 'Z_MESSAGE_CLASS'  " id = Name Of message class

                      number = '003' "number of message defined in the message class
                      severity = cl_abap_behv=>ms-success "type of message
                      v1 = ls_delete-id "First Parameter
                      v2 = ''           "Second Parameter
                      v3 = ''           "Third Parameter
                      v4 = ''           "Fourth Parameter
                      ).
************************** Apeending the Message Response *********************************************************
      APPEND VALUE #( %cid = ls_delete-%cid_ref " %cid = "Content ID" in ABAP Behavior
        id = ls_delete-id "key
       %msg = item_msg "%msg  =  type ref to if_abap_behv_message / Message to be passed
       ) TO reported-zdatadefinition. "type response for reported early zdatadefinition
******************************************Message End**************************************
    ENDLOOP.
  ENDMETHOD.

  METHOD update.
    LOOP AT entities INTO DATA(ls_update).
      READ TABLE lcl_buffer=>mt_buffer
        ASSIGNING FIELD-SYMBOL(<ls_buffer>) WITH KEY id = ls_update-id.
      " not yet in buffer, read from table

      SELECT SINGLE * FROM ztable WHERE id = @ls_update-id  INTO @DATA(ls_db).

      INSERT VALUE #( flag = 'U' lv_table = ls_db ) INTO TABLE lcl_buffer=>mt_buffer ASSIGNING <ls_buffer>.
      IF ls_update-%control-name IS NOT INITIAL..
        <ls_buffer>-name = ls_update-name.
      ENDIF.
****************************************Message Handling Delete*******************************
**************C reating Message using Message Class *************************
      DATA(item_msg) = new_message( id = 'Z_MESSAGE_CLASS'  " id = Name Of message class

                      number = '002' "number of message defined in the message class
                      severity = cl_abap_behv=>ms-success "type of message
                      v1 = ls_update-id "First Parameter
                      v2 = ''           "Second Parameter
                      v3 = ''           "Third Parameter
                      v4 = ''           "Fourth Parameter
                      ).
************************** Apeending the Message Response *********************************************************
      APPEND VALUE #( %cid = ls_update-%cid_ref " %cid = "Content ID" in ABAP Behavior
        id = ls_update-id "key
       %msg = item_msg "%msg  =  type ref to if_abap_behv_message / Message to be passed
       ) TO reported-zdatadefinition. "type response for reported early zdatadefinition
******************************************Message End**************************************
    ENDLOOP.
  ENDMETHOD.

  METHOD read.
  ENDMETHOD.

ENDCLASS.

CLASS lsc_zdatadefinition DEFINITION INHERITING FROM cl_abap_behavior_saver.
  PROTECTED SECTION.

    METHODS check_before_save REDEFINITION.

    METHODS finalize          REDEFINITION.

    METHODS save              REDEFINITION.

ENDCLASS.

CLASS lsc_zdatadefinition IMPLEMENTATION.

  METHOD check_before_save.
  ENDMETHOD.

  METHOD finalize.
  ENDMETHOD.

  METHOD save.
    DATA lt_table TYPE STANDARD TABLE OF ztable.
    " find all rows in buffer with flag = created
    lt_table = VALUE #(  FOR row IN lcl_buffer=>mt_buffer WHERE  ( flag = 'C' ) (  row-lv_table ) ).
    IF lt_table IS NOT INITIAL.
      INSERT ztable FROM TABLE @lt_table.
    ENDIF.
    " find all rows in buffer with flag = updated
    lt_table = VALUE #(  FOR row IN lcl_buffer=>mt_buffer WHERE  ( flag = 'U' ) (  row-lv_table ) ).
    IF lt_table IS NOT INITIAL.
      UPDATE ztable FROM TABLE @lt_table.
    ENDIF.

    " find all rows in buffer with flag = deleted
    lt_table = VALUE #(  FOR row IN lcl_buffer=>mt_buffer WHERE  ( flag = 'D' ) (  row-lv_table ) ).
    IF lt_table IS NOT INITIAL.
      DELETE ztable FROM TABLE @lt_table.
    ENDIF.

    CLEAR lcl_buffer=>mt_buffer.
  ENDMETHOD.

ENDCLASS.

Before use of custom messages :

 

  • Creating : 

  • Updating :

  • Deleting :

After use of custom messages :

  • Creating : 
  • Updating :
  • Deleting :

Types of messages :

Message classes support different types of messages which will be available to front end via responses, Error messages will be in error response , Success messages will be retuned in Success .

  • 1.      Error Messages .
    severity = cl_abap_behv=>ms-error
  • 2.      None Messages
    severity = cl_abap_behv=>ms-none​
  • 3.      Warning Messages
    severity = cl_abap_behv=>ms-warning​
  • 4.      Information Messages
    severity = cl_abap_behv=>ms-warning​
  • 5.      Success Messages
    severity = cl_abap_behv=>ms-success​

Conclusion:

The blog is purely based on my experience on sap cloud and reference to other blogs , Please correct me in the comments if I have added any wrong information. Always happy to share my knowledge. 

 

Assigned Tags

      4 Comments
      You must be Logged on to comment or reply to a post.
      Author's profile photo mykyta bereziuk
      mykyta bereziuk

      Hi Vinu,

      Thanks a lot for the detailed explanation.

      As far as I understand, you have described the unmanaged scenario. Do you (or anybody who is reading this message) know how I can display info or warning messages in a managed scenario with draft functionality?

      Thanks in advance,

      Mykyta

      Author's profile photo Vinu Kurian
      Vinu Kurian
      Blog Post Author

      Haven't fully tried out MANAGED scenario, Will definitely update the blog once I have explored the scenario. 🙂

      Author's profile photo Jyothish Peter
      Jyothish Peter

      Hi Vinu,

      Blog was very much informative.

      Could you please add how to send messages to UI from SAVE sequence too.

      I have a requirement to save the data during update action.

      Initially I have written the code in update action ,But depth inside of code there is an update task running so Dump occurred.

      So I have shifted the code to SAVE sequence. Now the issue is resolved but challenge is to send messages to UI from SAVE sequence. Could you please guide on this part

       

      Thanks

      Jyothish Peter.

      Author's profile photo Vinu Kurian
      Vinu Kurian
      Blog Post Author

      Hi Jyothish ,

      happy to see you trying out out new platform , messages / message classes could be initiated from any point as a response to the request . As in the above example , message for create / update/ delete are  given at their own respective methods . If you want to initiate a message class from save method , you could initiate it after each CRUD operation (Create / Update / Delete code segment).

      Still if you are not clear , feel free to contact me directly . Always happy to help.