Message Handling in ABAP enables structured output of user and system messages. With the MESSAGE statement and message classes, you can create consistent, multilingual messages.
Message Types
Type
Name
Behavior
A
Abend
Program terminates
E
Error
Input blocked
W
Warning
Confirmation possible
I
Information
Popup message
S
Status (Success)
Status bar
X
Exit
Program terminates with dump
Syntax
" With message class and number
MESSAGE e001(zmessages).
" With variables
MESSAGE e002(zmessages) WITH lv_value1 lv_value2.
" Dynamic
MESSAGEID'ZMESSAGES' TYPE'E'NUMBER'001'.
" Store in variable
MESSAGE e001(zmessages) INTODATA(lv_message).
Examples
1. Simple Messages
" Success message in status bar
MESSAGE s001(zmessages).
" 'Operation completed successfully'
" Error message
MESSAGE e002(zmessages).
" 'Error during processing'
" Warning
MESSAGE w003(zmessages).
" 'Attention: Data has been changed'
" Information (Popup)
MESSAGE i004(zmessages).
" 'Please note the instructions'
2. Messages with Variables
" Message text: "Customer & was created"
MESSAGE s010(zmessages) WITH lv_kunnr.
" Message text: "Order & item & was changed"
MESSAGE s011(zmessages) WITH lv_vbeln lv_posnr.
" Up to 4 variables possible
MESSAGE e012(zmessages) WITH lv_var1 lv_var2 lv_var3 lv_var4.
3. Store Message in Variable
" Don't display message, store it instead
MESSAGE e001(zmessages) INTODATA(lv_message).
" With variables
MESSAGE e010(zmessages) WITH lv_kunnr INTO lv_message.
" sy-msgty, sy-msgid, sy-msgno are set
WRITE: /'Type:', sy-msgty,
/'Class:', sy-msgid,
/'Number:', sy-msgno,
/'Text:', lv_message.
4. Dynamic Messages
DATA: lv_msgid TYPEsy-msgidVALUE'ZMESSAGES',
lv_msgty TYPEsy-msgtyVALUE'E',
lv_msgno TYPEsy-msgnoVALUE'001',
lv_msgv1 TYPE sy-msgv1,
lv_msgv2 TYPEsy-msgv2.
" Dynamic output
MESSAGEID lv_msgid TYPE lv_msgty NUMBER lv_msgno
WITH lv_msgv1 lv_msgv2.
" Or with INTO
MESSAGEID lv_msgid TYPE lv_msgty NUMBER lv_msgno
WITH lv_msgv1 lv_msgv2
INTODATA(lv_text).
5. Messages from Exceptions
TRY.
" Code that throws exception
DATA(lo_processor) =NEW zcl_processor( ).
lo_processor->process( ).
CATCH cx_root INTODATA(lx_error).
" Exception text as message
MESSAGE lx_error TYPE'E'.
" Or in status bar
MESSAGE lx_error TYPE'S'DISPLAY LIKE'E'.
ENDTRY.
6. DISPLAY LIKE for Status Bar Appearance
" Error message as status message (no popup)
MESSAGE e001(zmessages) DISPLAY LIKE'S'.
" Success in status bar with error icon
MESSAGE s001(zmessages) DISPLAY LIKE'E'.
" Information displayed as warning
MESSAGE i001(zmessages) DISPLAY LIKE'W'.
7. Message Class as Constants
CLASS zcl_messages DEFINITION.
PUBLIC SECTION.
CONSTANTS:
" Message class
c_msgid TYPEsy-msgidVALUE'ZMYAPP',
" Message numbers
c_success_saved TYPEsy-msgnoVALUE'001',
c_error_not_found TYPEsy-msgnoVALUE'002',
c_error_no_auth TYPEsy-msgnoVALUE'003',
c_warning_duplicate TYPEsy-msgnoVALUE'004'.
CLASS-METHODS: show_success
IMPORTING iv_object TYPE string.
CLASS-METHODS: show_error
IMPORTING iv_message TYPE string.
CLASS-METHODS: get_message
IMPORTING iv_msgno TYPEsy-msgno
iv_var1 TYPE clikeOPTIONAL
iv_var2 TYPE clikeOPTIONAL
RETURNINGVALUE(rv_text) TYPE string.
ENDCLASS.
CLASS zcl_messages IMPLEMENTATION.
METHODshow_success.
MESSAGE s001(zmyapp) WITH iv_object.
ENDMETHOD.
METHODshow_error.
MESSAGEID c_msgid TYPE'E'NUMBER c_error_not_found
WITH iv_message.
ENDMETHOD.
METHODget_message.
MESSAGEID c_msgid TYPE'S'NUMBER iv_msgno
WITH iv_var1 iv_var2
INTO rv_text.
ENDMETHOD.
ENDCLASS.
" Usage
zcl_messages=>show_success( 'Customer 1000' ).
DATA(lv_msg) = zcl_messages=>get_message(
iv_msgno = zcl_messages=>c_error_not_found
iv_var1 ='Order'
).
8. BAPIRET2 for Return Messages
TYPES: ty_messages TYPE STANDARD TABLE OF bapiret2 WITHEMPTY KEY.
CLASS zcl_message_collector DEFINITION.
PUBLIC SECTION.
METHODS: add_success
IMPORTING iv_message TYPE string.
METHODS: add_error
IMPORTING iv_msgid TYPEsy-msgid
iv_msgno TYPEsy-msgno
iv_var1 TYPE clikeOPTIONAL
iv_var2 TYPE clikeOPTIONAL.
METHODS: add_from_sy.
METHODS: has_errors
RETURNINGVALUE(rv_result) TYPE abap_bool.
METHODS: get_messages
RETURNINGVALUE(rt_messages) TYPE ty_messages.
METHODS: display_all.
PRIVATE SECTION.
DATA: mt_messages TYPE ty_messages.
ENDCLASS.
CLASS zcl_message_collector IMPLEMENTATION.
METHODadd_success.
APPENDVALUE bapiret2(
type='S'
message= iv_message
) TO mt_messages.
ENDMETHOD.
METHODadd_error.
DATA: lv_text TYPE string.
MESSAGEID iv_msgid TYPE'E'NUMBER iv_msgno
WITH iv_var1 iv_var2
INTO lv_text.
APPENDVALUE bapiret2(
type='E'
id= iv_msgid
number= iv_msgno
message= lv_text
message_v1 = iv_var1
message_v2 = iv_var2
) TO mt_messages.
ENDMETHOD.
METHODadd_from_sy.
" Message from sy-msg* variables
APPENDVALUE bapiret2(
type=sy-msgty
id=sy-msgid
number=sy-msgno
message_v1 =sy-msgv1
message_v2 =sy-msgv2
message_v3 =sy-msgv3
message_v4 =sy-msgv4
) TO mt_messages.
ENDMETHOD.
METHODhas_errors.
rv_result =xsdbool( line_exists( mt_messages[ type='E' ] ) OR