Preface – This post is part of the ABAP Beginner series.
SAP SD (SALES AND DISTRIBUTION)

Preface – This post is part of the ABAP Beginner series.

Preface – This post is part of the ABAP Beginner series.
ABAP is an event driven Programming language. ABAP Report Events are used to handle different kinds of events during runtime. It starts with the event name, followed by the programming codes belonging to that event.
It is advisable to use Comment line to declare the end of an event, since Events do not have a closing Keyword and it ends as soon any other Event starts.
There are different kinds of events in ABAP, SAP has categorized these events together.
There are three categories of Events in ABAP:
|
Event Category |
Explanation |
Events in the Category |
|
Program Constructor Events |
Except Pool programs it occurs in every programs. |
LOAD-OF-PROGRAM |
|
Reporting Events |
These events occur only in Executable Reports. |
INITIALIZATION START-OF-SELECTION END-OF-SELECTION (obsolete) |
|
Selection Screen Events |
These events occur during Selection Screen Processing |
AT SELECTION-SCREEN OUTPUT AT SELECTION-SCREEN |
|
List Events |
These events occur during Classical List Processing [List can be a table or consecutive Write statements, etc.] |
TOP-OF-PAGE END-OF-PAGE AT-LINE-SELECTION AT USER-COMMAND AT PFnn SET USER-COMMAND
|
Classical Reports have following events:
Ref: https://www.gotothings.com/abap/what-are-classical-reports.htm
https://www.sapnuts.com/courses/core-abap/classical-reports/classical-report-events.html
Preface – This post is part of the ABAP Programs series.
Note: If you are searching for basic type casting/conversion of ABAP variable in Reports/Program, click here.
1. You must have a basic Idea of local class and instance/reference of class.
2. Inheritance and Polymorphism concept
Note: Parent Class is also called base class and Child class is also called Sub class.
Before we talk about type casting, we need to know what are static Type and Dynamic type. Each reference variable has a dynamic type and a static type.
Suppose we have a class C1 and its child class C2.
So, in our program we will write following code to make reference and create object.
DATA: obj1 TYPE REF TO C1.
Here obj1 is our reference variable and C1 is the Static Type.
Thus anything that comes after TYPE REF TO is a static type because the object obj1 is pointing to fixed or static type [here class C1].
Now, in our code, we proceed as below:
CREATE OBJECT obj1.
In this line we actually point to the class C1 using our object obj1. This pointing is called Dynamic Type and it is pointing to C1 same as the static type above.
We can also write following code:
CREATE OBJETC obj1 TYPE C2.
In this line we are pointing to child class C2 of C1. This pointing is defined at runtime and called as Dynamic Type, and this time it is not same as the static type.
Thus we conclude that Dynamic type is defined at runtime of the program while static type is declared with the declaration of reference variable. Static type can be same as Dynamic type or less specific than it [it means, it can just point to the parents and not all the child unlike the dynamic type which can].
Type Casting in ABAP is just like casting in other computer languages. It is one way of inheriting the properties from either base/parent class or sub/child class into one another. It is used to cast one data type, class or Interface into another data type, class or interface.
For data type casting, refer here.
Type casting is a process of converting reference of class or interface to another, given both the class are from same hierarchy i.e. either one of them must be a parent class and the other a child class.
Destination_Ref = | ?= Source_Ref.
Some questions for you:
Why do we need Type casting?
How to achieve a type casting?
Example of Type casting
What are types of Type Casting?
Some Basic rules of type casting.
Preface – This post is part of the ABAP Programs series.
To delete duplicates in ABAP either from a string or an internal table, we need to use ABAP statement “DELETE ADJACENT DUPLICATES FROM”. In this article, we have taken an example, which implements deletion of duplicate data when two strings are merged. This process also involves internal table.
DELETE ADJACENT DUPLICATES FROM <Internal Table> COMPARING <field name>.
Using the ABAP statement mentioned above, we can compare values of a column of any table/ internal table and delete the duplicates. Once the duplicates are deleted, we get unique values from a string/ internal table.
SPLIT <variable> AT ‘,’ INTO TABLE <internal table>.
Using the ABAP statement mentioned above, we can divide a string in to a form of internal table where each data is separated by comma ‘,’.

DATA : lv_string TYPE string,
lv_string2 TYPE string,
lv_string_final TYPE string.
TYPES: BEGIN OF ty_data,
auth TYPE c,
END OF ty_data.
DATA: ls_user TYPE ty_data,
ls_user2 TYPE ty_data,
lt_user2 TYPE TABLE OF ty_data,
lt_user TYPE TABLE OF ty_data.
lv_string = 'a,b,c,a'.
lv_string2 = 'd,b,c,a'.
SPLIT lv_string AT ',' INTO TABLE lt_user.
SPLIT lv_string2 AT ',' INTO TABLE lt_user2.
LOOP AT lt_user2 ASSIGNING FIELD-SYMBOL(<fs_field>).
INSERT <fs_field> INTO TABLE lt_user.
ENDLOOP.
SORT lt_user BY auth.
DELETE ADJACENT DUPLICATES FROM lt_user COMPARING auth.
IF sy-subrc = 0.
LOOP AT lt_user ASSIGNING FIELD-SYMBOL(<fs_user_table>).
IF lv_string_final IS INITIAL.
lv_string_final = <fs_user_table>-auth.
ELSE.
CONCATENATE lv_string_final <fs_user_table>-auth INTO lv_string_final SEPARATED BY ','.
ENDIF.
ENDLOOP.
ENDIF.
WRITE lv_string_final.
Here, we have written program which tIn the above program, following steps have been implemented:
Preface – This post is part of the SAP ABAP OData Tutorial series.
In this article we have just mentioned imported keys related to ODATA in ABAP. To learn OData in detail view our OData tutorial here.
Index
ODATA is the representation of Data in form of XML/JSON.
io_data_provider->read_entry_data(IMPORTINGes_data=wa_entity).
1.To read all files just open your entity and click GET and press Execute
2.To read one file -Write the primary keys in bracket just after the URI as mentioned here: (ACQ_ID=’NEW1′,BUKRS=’7070′).
3.To Create, you need to read one file. After reading, click USE AS REQUEST. Change the values of primary keys and other fields you want, click POST Radio Button, remove the Primary keys from URI and click Execute.
4.To Update Perform Step 02, Click Use as request, just change the fields other than primary keys, Click PUT Radio Button, and Execute.
5.To Delete, perform Step 02. Click Delete Radio Button, Execute.
Preface – This post is part of the ABAP Programs series.
TYPE-POOLS truxs.
PARAMETERS p_file TYPE rlgrap-filename.
TYPES : BEGIN OF t_tab,
workstream TYPE char50,
task TYPE zci_task,
task_type TYPE char50,
END OF t_tab.
DATA : t_upload1 TYPE STANDARD TABLE OF ZDEMO_TEST2,
wa_upload1 TYPE ZDEMO_TEST2.
AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_file.
CALL FUNCTION 'F4_FILENAME'
EXPORTING
field_name = 'P_FILE'
IMPORTING
file_name = p_file.
START-OF-SELECTION.
CALL FUNCTION 'TEXT_CONVERT_XLS_TO_SAP'
EXPORTING
i_tab_raw_data = it_type
i_filename = p_file
TABLES
i_tab_converted_data = t_upload[]
EXCEPTIONS
conversion_failed = 1
OTHERS = 2.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 .
ENDIF.
CALL FUNCTION 'UPLOAD_XLS_FILE_2_ITAB'
EXPORTING
i_filename = p_file
tables
e_itab = t_upload1
EXCEPTIONS
FILE_ERROR = 1
OTHERS = 2
.
IF sy-subrc <> 0.
Implement suitable error handling here
ENDIF.
END-OF-SELECTION.
DATA : ls_cc_impl TYPE ZDEMO_TEST2,
lt_cc_impl TYPE STANDARD TABLE OF ZDEMO_TEST2.
LOOP AT t_upload1 INTO wa_upload1.
ls_cc_impl-mandt = sy-mandt.
ls_cc_impl-INCIDENT = wa_upload1-INCIDENT.
APPEND ls_cc_impl TO lt_cc_impl.
ENDLOOP.
MODIFY ZDEMO_TEST2 FROM TABLE lt_cc_impl.
CLASS cl_grand DEFINITION.
PUBLIC SECTION.
CLASS-DATA v_test TYPE char40.
CLASS-METHODS class_constructor.
METHODS constructor.
DATA a type i.
CLASS-DATA b TYPE i.
ENDCLASS. "cl_grand DEFINITION
*----------------------------------------------------------------------*
* CLASS cl_grand IMPLEMENTATION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS cl_grand IMPLEMENTATION.
METHOD class_constructor.
v_test = 'Static Constructor - Grand Parent'.
b = 30.
WRITE: /3 v_test.
ENDMETHOD. "class_constructor
METHOD constructor.
a = 30.
v_test = 'Instance Constructor - Grand Parent'.
WRITE: /3 v_test.
ENDMETHOD.
ENDCLASS. "cl_grand IMPLEMENTATION
*----------------------------------------------------------------------*
* CLASS cl_parent DEFINITION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS cl_parent DEFINITION INHERITING FROM cl_grand.
PUBLIC SECTION.
CLASS-METHODS class_constructor.
METHODS constructor.
ENDCLASS. "cl_parent DEFINITION
*----------------------------------------------------------------------*
* CLASS cl_parent IMPLEMENTATION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS cl_parent IMPLEMENTATION.
METHOD class_constructor.
v_test = 'Static Constructor - Parent'.
b = 20.
WRITE: /3 v_test.
ENDMETHOD. "class_constructor
METHOD constructor .
* data a type i.
super->constructor( ).
a = 20.
v_test = 'Instance Constructor -Parent'.
WRITE: /3 v_test.
ENDMETHOD.
ENDCLASS. "cl_parent IMPLEMENTATION
*----------------------------------------------------------------------*
* CLASS cl_child DEFINITION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS cl_child DEFINITION INHERITING FROM cl_parent.
PUBLIC SECTION.
CLASS-METHODS class_constructor.
METHODS constructor.
* DATA a.
ENDCLASS. "cl_child DEFINITION
*----------------------------------------------------------------------*
* CLASS cl_child IMPLEMENTATION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS cl_child IMPLEMENTATION.
METHOD class_constructor.
v_test = 'Static Constructor - Child'.
WRITE: /3 v_test.
b = 10.
ENDMETHOD. "class_constructor
METHOD constructor.
data a type i.
a = 10.
super->constructor( ).
v_test = 'Instance Constructor - Child'.
WRITE: /3 v_test.
ENDMETHOD.
ENDCLASS. "cl_child IMPLEMENTATION
START-OF-SELECTION.
DATA obj_child TYPE REF TO cl_child.
CREATE OBJECT obj_child.
data: a type i,
b type i.
a = obj_child->a.
write a.
write sy-uname.
delete from ztms_score .
delete from ztms_ans .
TYPES: BEGIN OF TY_DATA, "user defined type
ID TYPE N ,
NAME TYPE CHAR20,
SALARY TYPE I,
END OF TY_DATA.
DATA : ITAB TYPE TABLE OF TY_DATA. "internal table
DATA : WA TYPE TY_DATA. "work area
WA-ID = 1.
WA-NAME = 'Sapnuts'.
WA-SALARY = 5000.
COLLECT WA INTO ITAB. "collect
CLEAR WA.
WA-ID = 2.
WA-NAME = 'SAPabap'.
WA-SALARY = 50000.
COLLECT WA INTO ITAB. "collect
CLEAR WA.
WA-ID = 1.
WA-NAME = 'Sapnuts'.
WA-SALARY = 15000.
COLLECT WA INTO ITAB. "collect
CLEAR WA.
LOOP AT ITAB INTO WA.
WRITE:/ WA-ID, WA-NAME, WA-SALARY. "loop and display data
ENDLOOP.
**delete from ztms_score .
**delete from ztms_ans .
delete from ztms_user .
delete from ztms_set .
delete from ztms_ques .
Preface – This post is part of the ABAP Programs series.
CLASS a1 DEFINITION.
PUBLIC SECTION.
DATA: num1 TYPE i VALUE 100.
METHODS:m1.
ENDCLASS.
CLASS a1 IMPLEMENTATION.
METHOD m1.
WRITE: 'a1:',num1.
ENDMETHOD.
ENDCLASS.
CLASS b1 DEFINITION INHERITING FROM a1.
PUBLIC SECTION.
METHODS:m2, m1 REDEFINITION.
ENDCLASS.
CLASS b1 IMPLEMENTATION.
METHOD m1.
num1 = num1 .
WRITE: 'b1:',num1.
ENDMETHOD.
METHOD m2.
WRITE: 'M2 in class b1'.
ENDMETHOD.
ENDCLASS.
START-OF-SELECTION.
DATA: a TYPE REF TO a1.
DATA: b TYPE REF TO b1.
*data: c type REF TO c1.
****************************************************************
CREATE OBJECT b.
a = b. "upcasting
CALL METHOD a->m1( ).
*call METHOD a->m2( ). " we can't access the own sub class methods using super class ref.
NEW-LINE.
b ?= a. " down casting
CALL METHOD b->m1( ).
NEW-LINE.
CALL METHOD b->m2( ).
*****************************************************************
" error null ref
create OBJECT a.
b ?= a. "down casting still its giving dump
call METHOD b->m1( ).
*****************************************************************
CREATE OBJECT a.
TRY.
b ?= a. "u r attempted to use a 'NULL' object reference dump
CATCH cx_sy_move_cast_error.
CALL METHOD b->m1( ).
ENDTRY.
*****************************************************************
CREATE OBJECT a.
CREATE OBJECT b.
TRY.
b ?= a.
CATCH cx_sy_move_cast_error.
CALL METHOD b->m1( ).
call METHOD b->m2( ).
ENDTRY.
CLASS lcl_shape DEFINITION.
PUBLIC SECTION.
METHODS draw.
ENDCLASS.
CLASS lcl_circle DEFINITION INHERITING FROM lcl_shape.
PUBLIC SECTION.
METHODS: draw REDEFINITION,
calc_area.
ENDCLASS.
CLASS lcl_shape IMPLEMENTATION.
METHOD draw.
WRITE :/ 'Drawing any Shape'.
ENDMETHOD.
ENDCLASS.
CLASS lcl_circle IMPLEMENTATION.
METHOD draw.
WRITE :/ 'Drawing specific shape: Circle'.
ENDMETHOD.
METHOD calc_area.
WRITE :/ 'Area Of Crcle = 2iiR'.
ENDMETHOD.
ENDCLASS.
START-OF-SELECTION.
DATA : o_cir TYPE REF TO lcl_circle.
CREATE OBJECT o_cir.
CALL METHOD o_cir->draw( ). " calls subclass Draw() method
CALL METHOD o_cir->calc_area( ).
ULINE.
"--------- Narrow cast(Upcast)---------------"
DATA : o_shp TYPE REF TO lcl_shape.
o_shp = o_cir. " Narrow cast(Upcast)
CALL METHOD o_shp->draw( ). " calls sub class Draw() method
"call METHOD o_shp->calc_area( ) . " compilation error
ULINE.
"---------- Widening Cast(Downcast) -----------"
DATA : o_cir1 TYPE REF TO lcl_circle.
" o_cir1 = o_shp. " complilation error
o_cir1 ?= o_shp. " Widening Cast(Downcast)
CALL METHOD o_cir1->draw( ). " calls subclass Draw() method
CALL METHOD o_cir1->calc_area( ).
CLASS a1 DEFINITION.
PUBLIC SECTION.
DATA: num1 TYPE i VALUE 100.
METHODS:m1.
ENDCLASS.
CLASS a1 IMPLEMENTATION.
METHOD m1.
WRITE: 'a1:',num1.
ENDMETHOD.
ENDCLASS.
CLASS b1 DEFINITION INHERITING FROM a1.
PUBLIC SECTION.
METHODS:m2, m1 REDEFINITION.
ENDCLASS.
CLASS b1 IMPLEMENTATION.
METHOD m1.
num1 = num1 .
WRITE: 'b1:',num1.
ENDMETHOD.
METHOD m2.
WRITE: 'M2 in class b1'.
ENDMETHOD.
ENDCLASS.
START-OF-SELECTION.
DATA: parent TYPE REF TO a1.
DATA: child TYPE REF TO b1.
*data: c type REF TO c1.
****************************************************************
CREATE OBJECT child.
parent = child. "upcasting
CALL METHOD parent->m1( ).
CALL METHOD child->m1( ).
CALL METHOD child->m2( ).
*call METHOD a->m2( ). " we can't access the own sub class methods using super class ref.
NEW-LINE.
child ?= parent. " down casting
CALL METHOD child->m1( ).
NEW-LINE.
CALL METHOD child->m2( ).
******************************************************************
*" error null ref
*create OBJECT a.
*b ?= a. "down casting still its giving dump
*call METHOD b->m1( ).
******************************************************************
*
CREATE OBJECT a.
TRY.
b ?= a. "u r attempted to use a 'NULL' object reference dump
CATCH cx_sy_move_cast_error.
CALL METHOD b->m1( ).
ENDTRY.
******************************************************************
*
CREATE OBJECT a.
CREATE OBJECT b.
TRY.
b ?= a.
CATCH cx_sy_move_cast_error.
CALL METHOD b->m1( ).
call METHOD b->m2( ).
ENDTRY.
******** Unique Values******************
DATA : lv_string TYPE string,
lv_string2 TYPE string,
lv_string_final TYPE string.
TYPES: BEGIN OF ty_data,
auth TYPE c,
END OF ty_data.
DATA: ls_user TYPE ty_data,
ls_user2 TYPE ty_data,
lt_user2 TYPE TABLE OF ty_data,
lt_user TYPE TABLE OF ty_data.
lv_string = 'a,b,c,a'.
lv_string2 = 'd,b,c,a'.
SPLIT lv_string AT ',' INTO TABLE lt_user.
SPLIT lv_string2 AT ',' INTO TABLE lt_user2.
LOOP AT lt_user2 ASSIGNING FIELD-SYMBOL(<fs_field>).
INSERT <fs_field> INTO TABLE lt_user.
ENDLOOP.
SORT lt_user BY auth.
DELETE ADJACENT DUPLICATES FROM lt_user COMPARING auth.
IF sy-subrc = 0.
LOOP AT lt_user ASSIGNING FIELD-SYMBOL(<fs_user_table>).
IF lv_string_final IS INITIAL.
lv_string_final = <fs_user_table>-auth.
ELSE.
CONCATENATE lv_string_final <fs_user_table>-auth INTO lv_string_final SEPARATED BY ','.
ENDIF.
ENDLOOP.
ENDIF.
WRITE lv_string_final.
Preface – This post is part of the ABAP Programs series.
ALV in ABAP enables users to view data in a tabular format. We can even make it editable. In this article, we will explore the same.
************************************************************************
* INTERNAL TABLES
************************************************************************
DATA: lt_mapping TYPE STANDARD TABLE OF zBarry_emp,
lt_fieldcat TYPE lvc_t_fcat.
************************************************************************
* WORK AREAS
************************************************************************
DATA: ls_fieldcat TYPE lvc_s_fcat,
ls_mapping TYPE zBarry_emp,
lw_layout TYPE lvc_s_layo.
************************************************************************
* REFERENCE OBJECT
************************************************************************
DATA: r_container TYPE REF TO cl_gui_custom_container,
r_grid TYPE REF TO cl_gui_alv_grid.
************************************************************************
* Field symbol
************************************************************************
FIELD-SYMBOLS: <ls_fieldcat> TYPE lvc_s_fcat.
************************************************************************
* START-OF-SELECTION.
************************************************************************
START-OF-SELECTION.
SELECT *
FROM zBarry_emp
INTO TABLE lt_mapping
UP TO 20 ROWS.
* Call screen 200
CALL SCREEN 200.
MODULE status_0200 OUTPUT.
SET PF-STATUS 'PF-STATUS'.
SET TITLEBAR 'TITLE'.
CREATE OBJECT r_container
EXPORTING
container_name = 'CUSTOM_1'.
CREATE OBJECT r_grid
EXPORTING
i_parent = r_container.
* create Field Catalog
ls_fieldcat-fieldname = 'EMP_FNAME'.
ls_fieldcat-tabname = 'zBarry_emp'.
ls_fieldcat-seltext = 'Employee Name'.
ls_fieldcat-edit = 'X'.
APPEND ls_fieldcat TO lt_fieldcat.
CLEAR ls_fieldcat.
ls_fieldcat-fieldname = 'EMP_LNAME'.
ls_fieldcat-tabname = 'zBarry_emp'.
ls_fieldcat-seltext = 'Employee Last Name'.
ls_fieldcat-edit = 'X'.
*ls_fieldcat-hotspot = 'X'.
APPEND ls_fieldcat TO lt_fieldcat.
CLEAR ls_fieldcat.
CALL METHOD r_grid->set_table_for_first_display
EXPORTING
* I_BUFFER_ACTIVE =
* I_BYPASSING_BUFFER =
* I_CONSISTENCY_CHECK =
i_structure_name = 'zBarry_emp'
* IS_VARIANT =
i_save = 'A'
i_default = abap_true
is_layout = lw_layout
* IS_PRINT =
* IT_SPECIAL_GROUPS =
* IT_TOOLBAR_EXCLUDING =
* IT_HYPERLINK =
* IT_ALV_GRAPHICS =
* IT_EXCEPT_QINFO =
* IR_SALV_ADAPTER =
CHANGING
it_outtab = lt_mapping
it_fieldcatalog = lt_fieldcat
* IT_SORT =
* IT_FILTER =
EXCEPTIONS
invalid_parameter_combination = 1
program_error = 2
too_many_lines = 3
OTHERS = 4.
IF sy-subrc <> 0.
* Implement suitable error handling here
ENDIF.
ENDMODULE.
*&---------------------------------------------------------------------*
*& Module USER_COMMAND_0200 INPUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
MODULE user_command_0200 INPUT.
CASE sy-ucomm.
WHEN 'BACK' OR 'EXIT' OR 'CANCEL'.
LEAVE PROGRAM.
LEAVE TO SCREEN 0.
WHEN 'SAVE'.
DATA: lt_t_row TYPE lvc_t_row,
ls_t_row LIKE LINE OF lt_t_row
.
FIELD-SYMBOLS: <fs_changed_data> LIKE LINE OF lt_mapping.
CALL METHOD r_grid->check_changed_data.
CALL METHOD r_grid->get_selected_rows
IMPORTING
et_index_rows = lt_t_row. " Indexes of Selected Rows
LOOP AT lt_t_row INTO ls_t_row.
READ TABLE lt_mapping ASSIGNING <fs_changed_data> INDEX ls_t_row-index.
IF sy-subrc = 0.
MODIFY zBarry_emp FROM <fs_changed_data>.
ENDIF.
ENDLOOP.
ENDCASE.
ENDMODULE.
Preface – This post is part of the ABAP Programs series.
In ABAP, you might have learned to create global classes using SE24, Transaction code. But some time, there is a requirement to create a local class and its method call altogether in a report. In this article, we will learn how to implement Local Classes in ABAP.
Local Classes in ABAP are just like classes of Programming language C/C++. We define following while doing Local classes implementation in ABAP:

Program Requirement: Get basic and salary details of an employee from two different classes. Take Employee ID as input.
CLASS class_test DEFINITION DEFERRED.
PARAMETERS: p_empid TYPE char8.
DATA: wa_emp TYPE zBarry_emp,
wa_emp2 TYPE zBarry_sal.
DATA: obj TYPE REF TO class_test.
INTERFACE interface.
METHODS: method2
IMPORTING imp2 TYPE char8
EXPORTING exp2 TYPE zBarry_sal.
ENDINTERFACE.
CLASS class_test DEFINITION.
PUBLIC SECTION.
EVENTS: event1.
INTERFACES: interface.
METHODS: method1
IMPORTING imp TYPE char8
EXPORTING exp TYPE zBarry_emp.
METHODS: eventhandler FOR EVENT event1 OF class_test.
ENDCLASS.
CREATE OBJECT obj.
SET HANDLER obj->eventhandler FOR obj.
CALL METHOD obj->method1
EXPORTING
imp = p_empid
IMPORTING
exp = wa_emp.
CALL METHOD obj->interface~method2
EXPORTING
imp2 = p_empid
IMPORTING
exp2 = wa_emp2.
WRITE:/ wa_emp.
write:/ wa_emp2-empid, wa_emp2-tid,wa_emp2-mon.
*&---------------------------------------------------------------------*
*& Class (Implementation) class_test
*&---------------------------------------------------------------------*
* Text
*----------------------------------------------------------------------*
CLASS class_test IMPLEMENTATION.
METHOD method1.
SELECT * FROM zBarry_emp INTO exp WHERE empid = imp.
ENDSELECT.
IF sy-subrc NE 0.
RAISE EVENT event1 .
ENDIF.
ENDMETHOD.
METHOD interface~method2.
SELECT * FROM zBarry_sal INTO exp2 WHERE empid = imp2.
ENDSELECT.
ENDMETHOD.
METHOD eventhandler.
WRITE:/ 'wrong empid'.
ENDMETHOD.
ENDCLASS. "class_test
In the above code, we have done following implementation, step by step:
Preface – This post is part of the ABAP Programs series.
Lock Objects in SAP ABAP are global reusable component which generates function modules i.e. ENQUEUE_E_TABLE and DEQUEUE_E_TABLE that are used to set and release locks on data record. This Enqueue and Dequeue method is used to lock and unlock any object in SAP ABAP. In this article, we will learn these methods with the help of a program. Before starting this, you must read the basic concepts of Lock Objects in SAP ABAP.
It is very important to lock an object that is under development. By object we mean everything i.e. Tables, Views, Reports, Methods, Function Modules, and all. ABAP too provides these features by default for their standard interfaces. But what if you need to create one for your own table. Then you need to use the given two Function Modules:

DATA: varkey LIKE rstable-varkey.
varkey = sy-mandt.
CALL FUNCTION 'ENQUEUE_E_TABLE' "Add Lock
EXPORTING
* MODE_RSTABLE = 'E'
tabname = 'ZBarry_TEST'
varkey = varkey
* X_TABNAME = ' '
* X_VARKEY = ' '
* _SCOPE = '2'
* _WAIT = ' '
* _COLLECT = ' '
EXCEPTIONS
foreign_lock = 1
system_failure = 2
OTHERS = 3.
CASE sy-subrc.
WHEN 1.
MESSAGE i184(bctrain) WITH 'Foreign lock'.
WHEN 2.
MESSAGE i184(bctrain) WITH 'system failure'.
WHEN 0.
MESSAGE i184(bctrain) WITH 'success'.
WHEN OTHERS.
MESSAGE i184(bctrain) WITH 'others'.
ENDCASE.
CALL FUNCTION 'DEQUEUE_E_TABLE' "Remove Lock
EXPORTING
* MODE_RSTABLE = 'E'
tabname = 'ZBarry_TEST'
varkey = varkey
* X_TABNAME = ' '
* X_VARKEY = ' '
* _SCOPE = '3'
* _SYNCHRON = ' '
* _COLLECT = ' '
.
IF sy-subrc <> 0.
* Implement suitable error handling here
ENDIF.
The above program is self explanatory, still we will explain key points below: