You are on page 1of 91

DAY 1

OOPS-ABAP

1. Oops concepts
2. Alv reporting using classes
3. Alv reporting using function modules (2-3 hrs.)

OOPS Concepts

Types of prog. Languages:

1. Procedure oriented languages: - c, pascal, Cobol…


 more focus is breaking the program in the forms
of modules (functions)
2. Object based languages: - VB, ADA…
3. Object oriented languages: - c++, java, .net, abap,
 more focus is on securing the data.

Features of OOPS:

1. Encapsulation
2. Data abstraction
3. Inheritance
4. Polymorphism

Applications of OOPS concepts:

1. Alv reporting using classes


2. Webdynpro
3. CRM-Technical
4. SRM-Technical
5. Enterprise portal
6. Workflow
7. Hr-abap.

Object oriented Languages: - Classes

Class-- is a user defined datatype which is a collection of different type of components.

C++ -- class  data member and member functions

Java - class- instance variables and methods

ABAP - class  attributes, methods, events, interfaces, aliases.


ABAP Class components

Attributes methods events interface aliases

Instance static

Data types constants

Normal special
Methods Methods
Instance static
Attributes Attributes

Instance static
Constructor constructor
Instance static

ABAP  2 types of classes


1. Local class (se38 – local to a program)
2. Global class (SE24- class builder tool)

Procedure for creating local classes:


1. Definition of class.
Syntax: -
Class <class name> definition.
Declaration of components.

Endclass.

2. Implementation of class:
Syntax: -
Class <class name> implementation.
Implementation of methods.
Endclass.

Note: implementation of class is required only if the class


definition contains methods.
Note: for using the components of the class,class must be
instantiated. i.e we need to create object for the class

Object creation -2 steps


1. Declaring reference for the class
Syntax:
Date <ref.name> type ref to <class name>
Note: - <ref.name> is alias (alternative name) for class.
<ref.name> doesn’t allocate any memory.
2. Create object based on reference
Syntax:
Create object <ref.name>.

Four steps for creating a class


1. Define the class
2. Implement the class
3. Create reference for the class
4. Convert the reference to an object.

Procedure for creating global class

1. Define and implement the global class in class builder


2. As part of excitable programs, create the reference and object
for accessing global class components.

Access specifiers for class components: they control the accessibility


and visibility of the components.

C++: -

1. Private (default)
2. Protected
3. Public

Java: -

1. Default(default)
2. Public
3. Protected
4. Private

Abap: -

1. Public section
2. Protected section
3. Private section

Variable are used to store the date as declared inside the class is
called attributes outside is called variables.

Attributes: are used for storing the properties.


Two types of attributes 1. Instance and 2. static attributes

Instance attributes: - 1. these attributes are specific to the objects


i.e. whenever new object is created, a fresh memory is will be
allocated for every instance attribute.
2. These attributes can be accessed only by using the object.
In local classes, they are declared by using the keyword ‘DATA’.

Static attributes: - 1. these attributes are not specific to any object


i.e. they get initialized whenever a class is loaded. i.e. all the
objects of the class will point to same memory location.
2. They can be accessed either by using the objects or by using class
name. They are declared by using the keyword ‘CLASS-DATA’.

Memory allocated only once and share the values

Compulsory we need to decelerated visible section.

DAY 2

REPORT Z7AMOOPS1. " INSTANCE AND STATIC ATTRIBUTES

CLASS ABC DEFINITION.


PUBLIC SECTION.
DATA X TYPE I. "instance attribute
CLASS-DATA Y TYPE I. "static attribute
ENDCLASS.

DATA OB1 TYPE REF TO ABC.


CREATE OBJECT OB1. “Memory is allocating

WRITE :/ 'Values of object ob1'.


WRITE :/ OB1->X,
OB1->Y,
ABC=>Y. “static components can be accessing using class name

OB1->X = 10.
OB1->Y = 20.

WRITE :/ 'Values of object ob1'.


WRITE :/ OB1->X,
OB1->Y,
ABC=>Y.

DATA OB2 TYPE REF TO ABC.


CREATE OBJECT OB2.

WRITE :/ 'Values of object ob2'.


WRITE :/ OB2->X,
OB2->Y.
Note: - Instance attribute a fresh memory will be allocated where as in static attributes only
once which while share all objects of the class.

Examples 2:

Ob2->y = 30.

WRITE :/ 'Values of object ob2'.


WRITE :/ OB2->X,
OB2->Y,
ABC=>Y.

WRITE :/ 'Values of object ob1'.


WRITE :/ OB1->X,
OB1->Y,
ABC=>Y.
Note: - only public components can be access out side the class and private and protected can’t
access outside the class.

Changes public to protected/private give error (we can use inheritance will discuss later)
DAY 3 (METHOD INSTANCE & STATIC)

Methods: Is a set of statements which is implemented only once and can be called any no of
times. Like subroutines and function module
Subroutines: -
Calling  perform <sub> {parameters}
Define  form … end form
Function modules:
Calling  call function <FM name> {parameters}
Define  function… end function.

Local class methods:


Declaration, implementation, calling
Procedure for using local class methods:
1. Declaration of method in the class definition
Syntax:
Methods/class-methods <method name> {parameters list}
2. Implementation of method in the class implementation.
Syntax:
Method <method name>
Statements.
End method.
3. Calling the method
Syntax:
Call method <method name>
{parameters list}.

Parameters: -
subroutines: - using, changing, tables.
FM’s: - import, Export, Changing, tables
Methods: - importing, exporting, changing, returning

Instance methods: - This method can access any kind of components they can we called only by using
the objects.
In local class they are declared by using the ‘methods’.
Static methods: - they can be access by using static components
They can be called either by using objects or by using class name
They are declared by using ‘class-methods’.

Note: - 1. If a class contains attributes and methods it is recommended to declared attribute under
protected or private section and methods under public section.
2.Static attributes are also called class attributes.

REPORT Z7AMOOPS2. " Instance and static methods


CLASS EMP DEFINITION.
PUBLIC SECTION.
METHODS: M1, “instance method
M2. “instance method
PROTECTED SECTION.
DATA : EMPNO TYPE I,
ENAME(20) TYPE C.
ENDCLASS.

DATA OB TYPE REF TO EMP.


CREATE OBJECT OB.
CALL METHOD : OB->M2,
OB->M1,
OB->M2.
ULINE.
OB->M2( ).

CLASS EMP IMPLEMENTATION.


METHOD M1.
EMPNO = 4.
ENAME = 'raju'.
ENDMETHOD.
METHOD M2.
WRITE :/ EMPNO, ENAME.
ENDMETHOD.
ENDCLASS.

DAY 4

Attributes empno, ename (protected/Private)

Methods  m1, m2 (public)

Note: - if a class contains methods and attributes and when we create object of the class
memory will be allocated only for the attributes but not for the methods.
REPORT Z7AMOOPS3. " local class with attributes and methods with class definition and implem
entation in sequence

CLASS EMP DEFINITION.


PUBLIC SECTION.
METHODS : M1,
M2.
PROTECTED SECTION.
DATA : EMPNO TYPE I,
ENAME(20) TYPE C.
ENDCLASS.

CLASS EMP IMPLEMENTATION.


METHOD M1.
EMPNO = 4.
ENAME = 'raju'.
ENDMETHOD.
METHOD M2.
WRITE :/ EMPNO,ENAME.
ENDMETHOD.
ENDCLASS.

DATA OB TYPE REF TO EMP.

START-OF-SELECTION.
CREATE OBJECT OB.
CALL METHOD : OB->M2,
OB->M1,
OB->M2.
ULINE.
OB->M2( ).
Eg 2

Eg3 Giving call method ob->m2.


REPORT Z7AMOOPS4. " Accessing protected/private components from public methods

CLASS EMP DEFINITION.

PUBLIC SECTION.
METHODS M1.
PROTECTED SECTION.
DATA : EMPNO TYPE I,
ENAME(20) TYPE C.
METHODS M2.
ENDCLASS.

CLASS EMP IMPLEMENTATION.


METHOD M1.
EMPNO = 4.
ENAME = 'raju'.
CALL METHOD M2.
ENDMETHOD.
METHOD M2.
WRITE :/ EMPNO,ENAME.
ENDMETHOD.
ENDCLASS.

START-OF-SELECTION.
DATA OB TYPE REF TO EMP.
CREATE OBJECT OB.

CALL METHOD OB->M1.


REPORT z7amoops5. " difference between instance and static methods

CLASS abc DEFINITION.


PUBLIC SECTION.
METHODS m1.
CLASS-METHODS m2.
PROTECTED SECTION.
DATA x TYPE i.
CLASS-DATA y TYPE i.
ENDCLASS.

CLASS abc IMPLEMENTATION.

METHOD m1.
WRITE :/ 'inside instance method m1'.
x = 10.
y = 20.

ENDMETHOD.

METHOD m2.
WRITE :/ 'inside static method m2'.
y = 45.
* x = 34.
ENDMETHOD.

ENDCLASS.

START-OF-SELECTION.

CALL METHOD abc=>m2.

DATA ob TYPE REF TO abc.


CREATE OBJECT ob.
ULINE.
CALL METHOD : ob->m1,
ob->m2.
REPORT z7amoops6. " local class methods with parameters

CLASS emp DEFINITION.

PUBLIC SECTION.
METHODS : m1 IMPORTING x TYPE i OPTIONAL
y TYPE c OPTIONAL,
m2.
PROTECTED SECTION.
DATA : empno TYPE i,
ename(20) TYPE c.

ENDCLASS.

CLASS emp IMPLEMENTATION.

METHOD m1.
empno = x.
ename = y.
ENDMETHOD.

METHOD m2.
WRITE :/ empno,ename.
ENDMETHOD.

ENDCLASS.

START-OF-SELECTION.

DATA ob TYPE REF TO emp.


CREATE OBJECT ob.

PARAMETERS : p_x TYPE i,


p_y(20) TYPE c.

CALL METHOD ob->m1


EXPORTING
* x = p_x
y = p_y.

CALL METHOD ob->m2.

ULINE.
*ob->m1( exporting x = 34 y = 'abc' ).
ob->m1( x = 34 y = 'abc' ).
ob->m2( ).

REPORT z7amoops7. " Access global class methods with parameters

DATA ob TYPE REF TO z7amclass1.


CREATE OBJECT ob.

PARAMETERS: p_x TYPE i,


p_y(20) TYPE c.

CALL METHOD ob->m1


EXPORTING
x = p_x
y = p_y.

CALL METHOD ob->m2.


REPORT z7amoops8. " methods returning multiple values

CLASS abc DEFINITION.

PUBLIC SECTION.
METHODS m1 IMPORTING x TYPE kunnr
EXPORTING y TYPE land1_gp
z TYPE name1_gp.
ENDCLASS.

CLASS abc IMPLEMENTATION.

METHOD m1.
IF x IS NOT INITIAL.
SELECT SINGLE land1 name1 FROM kna1
INTO (y,z) WHERE kunnr = x.
ENDIF.
ENDMETHOD.

ENDCLASS.

START-OF-SELECTION.

DATA ob TYPE REF TO abc.


CREATE OBJECT ob.

PARAMETERS p_kunnr TYPE kna1-kunnr.

DATA : lv_land1 TYPE kna1-land1,


lv_name1 TYPE kna1-name1.

CALL METHOD ob->m1


EXPORTING
x = p_kunnr
IMPORTING
y = lv_land1
z = lv_name1.

WRITE :/ 'Country :',lv_land1,


/ 'Name :',lv_name1.
ULINE.
CLEAR : lv_land1,lv_name1.
ob->m1( EXPORTING x = p_kunnr IMPORTING y = lv_land1 z = lv_name1 ).
WRITE :/ 'Country :',lv_land1,
/ 'Name :',lv_name1.

REPORT z7amoops9. " changing parameters

CLASS abc DEFINITION.

PUBLIC SECTION.
METHODS m1 IMPORTING x TYPE i
CHANGING y TYPE i.

ENDCLASS.

CLASS abc IMPLEMENTATION.

METHOD m1.
y = x + y.
ENDMETHOD.

ENDCLASS.
START-OF-SELECTION.
DATA ob TYPE REF TO abc.
CREATE OBJECT ob.

PARAMETERS : p_x TYPE i,


p_y TYPE i.

CALL METHOD ob->m1


EXPORTING
x = p_x
* x = 10
CHANGING
y = p_y.

WRITE :/ 'sum is ',p_y.

REPORT z7amoops10. " returning parameters

CLASS abc DEFINITION.

PUBLIC SECTION.
METHODS m1 IMPORTING x TYPE i y TYPE i
RETURNING VALUE(z) TYPE i.

ENDCLASS.

CLASS abc IMPLEMENTATION.


METHOD m1.
z = x + y.
ENDMETHOD.

ENDCLASS.

START-OF-SELECTION.

DATA ob TYPE REF TO abc.


CREATE OBJECT ob.

PARAMETERS : p_x TYPE i,


p_y TYPE i.

DATA lv_z TYPE i.

CALL METHOD ob->m1


EXPORTING
x = p_x
y = p_y
RECEIVING
z = lv_z.

WRITE :/ 'sum is ',lv_z.


CLEAR lv_z.

lv_z = ob->m1( x = 10 y = 20 ).
WRITE :/ 'sum is ',lv_z.
REPORT z7amoops11. " me keyword

CLASS abc DEFINITION.

PUBLIC SECTION.
METHODS m1 IMPORTING x TYPE i y TYPE i h TYPE i
EXPORTING z TYPE i.
PROTECTED SECTION.
DATA : x TYPE i,
y TYPE i,
m TYPE i.

ENDCLASS.

CLASS abc IMPLEMENTATION.

METHOD m1.
me->x = x.
me->y = y.
m = h.
z = me->x + me->y + m.
ENDMETHOD.

ENDCLASS.

START-OF-SELECTION.

DATA ob TYPE REF TO abc.


CREATE OBJECT ob.

PARAMETERS : p_x TYPE i,


p_y TYPE i,
p_h TYPE i.

DATA lv_z TYPE i.

CALL METHOD ob->m1


EXPORTING
x = p_x
y = p_y
h = p_h
IMPORTING
z = lv_z.

WRITE :/ 'sum is ',lv_z.


REPORT z7amoops12. " friends keyword

CLASS pqr DEFINITION.

PUBLIC SECTION.
METHODS m4.

ENDCLASS.

CLASS abc DEFINITION FRIENDS pqr.

PUBLIC SECTION.
METHODS m1.
PROTECTED SECTION.
METHODS m2.
PRIVATE SECTION.
METHODS m3.

ENDCLASS.

CLASS abc IMPLEMENTATION.

METHOD m1.
WRITE :/ 'inside public method m1'.
ENDMETHOD.

METHOD m2.
WRITE :/ 'inside protected method m2'.
ENDMETHOD.
METHOD m3.
WRITE :/ 'inside private method m3'.
ENDMETHOD.

ENDCLASS.

CLASS pqr IMPLEMENTATION.

METHOD m4.
WRITE :/ 'inside method m4'.
DATA k TYPE REF TO abc.
CREATE OBJECT k.
CALL METHOD k->m1.
CALL METHOD k->m2.
CALL METHOD k->m3.
ENDMETHOD.

ENDCLASS.

START-OF-SELECTION.

DATA ob TYPE REF TO pqr.


CREATE OBJECT ob.

CALL METHOD ob->m4.

REPORT z7amoops13. " friends and deferred keyword

CLASS pqr DEFINITION DEFERRED.

CLASS abc DEFINITION FRIENDS pqr.

PUBLIC SECTION.
METHODS m1.
PROTECTED SECTION.
METHODS m2.
PRIVATE SECTION.
METHODS m3.

ENDCLASS.

CLASS abc IMPLEMENTATION.


METHOD m1.
WRITE :/ 'inside public method m1'.
ENDMETHOD.

METHOD m2.
WRITE :/ 'inside protected method m2'.
ENDMETHOD.

METHOD m3.
WRITE :/ 'inside private method m3'.
ENDMETHOD.

ENDCLASS.

CLASS pqr DEFINITION.

PUBLIC SECTION.
METHODS m4.

ENDCLASS.

CLASS pqr IMPLEMENTATION.

METHOD m4.
WRITE :/ 'inside method m4'.
DATA k TYPE REF TO abc.
CREATE OBJECT k.
CALL METHOD k->m1.
CALL METHOD k->m2.
* call method k->m3. (or)
k->m3( ).

ENDMETHOD.

ENDCLASS.

START-OF-SELECTION.

DATA ob TYPE REF TO pqr.


CREATE OBJECT ob.

CALL METHOD ob->m4.


report Z7AMOOPS14. " accessing global class friends

data OB type ref to Z7AMCLASSB.


create object OB.

call method OB->M4.

REPORT z7amoops15. " normal methods and special methods (constructors)

CLASS abc DEFINITION.

PUBLIC SECTION.
METHODS : m1,
constructor.
CLASS-METHODS class_constructor.

ENDCLASS.

CLASS abc IMPLEMENTATION.

METHOD m1.
WRITE :/ 'inside instance method m1'.

ENDMETHOD.

METHOD constructor.
WRITE :/ 'inside instance constructor'.
ENDMETHOD.

METHOD class_constructor.
WRITE :/ 'inside static constructor'.
ENDMETHOD.

ENDCLASS.
START-OF-SELECTION.

WRITE :/ 'First object..'.


DATA ob1 TYPE REF TO abc.
CREATE OBJECT ob1.

ULINE.
WRITE :/ 'Second object..'.
DATA ob2 TYPE REF TO abc.
CREATE OBJECT ob2.

ULINE.
WRITE :/ 'Third object..'.
DATA ob3 TYPE REF TO abc.
CREATE OBJECT ob3.

ULINE.
CALL METHOD ob1->m1.
CALL METHOD ob1->m1.

REPORT z7amoops16. " Normal methods and special methods (static constr
uctor execution before creating any object)

CLASS abc DEFINITION.

PUBLIC SECTION.
METHODS : m1,
constructor.
CLASS-METHODS class_constructor.
CLASS-DATA x TYPE i.
ENDCLASS.

CLASS abc IMPLEMENTATION.

METHOD m1.
WRITE :/ 'inside instance method m1'.
ENDMETHOD.

METHOD constructor.
WRITE :/ 'inside instance constructor'.
ENDMETHOD.

METHOD class_constructor.
WRITE :/ 'inside static constructor'.
ENDMETHOD.

ENDCLASS.

START-OF-SELECTION.

abc=>x = 34.
WRITE :/ 'First object..'.
DATA ob1 TYPE REF TO abc.
CREATE OBJECT ob1.

ULINE.
WRITE :/ 'Second object..'.
DATA ob2 TYPE REF TO abc.
CREATE OBJECT ob2.

ULINE.
WRITE :/ 'Third object..'.
DATA ob3 TYPE REF TO abc.
CREATE OBJECT ob3.

ULINE.
CALL METHOD ob1->m1.
CALL METHOD ob1->m1.

*uline.
*call method ob1->constructor.
REPORT z7amoops17. " constructors initializing attributes of class

CLASS abc DEFINITION.

PUBLIC SECTION.
METHODS : constructor,
display.
PROTECTED SECTION.
DATA : empno TYPE i,
ename(20) TYPE c.

ENDCLASS.

CLASS abc IMPLEMENTATION.

METHOD constructor.
empno = 4.
ename = 'raju'.
ENDMETHOD.

METHOD display.
WRITE :/ empno,ename.
ENDMETHOD.

ENDCLASS.

START-OF-SELECTION.

DATA ob TYPE REF TO abc.


CREATE OBJECT ob.
CALL METHOD ob->display.

REPORT z7amoops18. " instance constructors with parameters

CLASS abc DEFINITION.

PUBLIC SECTION.
METHODS : constructor IMPORTING x TYPE i OPTIONAL
y TYPE c OPTIONAL,
display.
PROTECTED SECTION.
DATA : empno TYPE i,
ename(20) TYPE c.

ENDCLASS.

CLASS abc IMPLEMENTATION.

METHOD constructor.
empno = x.
ename = y.
ENDMETHOD.

METHOD display.
WRITE :/ empno,ename.
ENDMETHOD.

ENDCLASS.

START-OF-SELECTION.

PARAMETERS : p_x TYPE i,


p_y(20) TYPE c.

DATA ob TYPE REF TO abc.


CREATE OBJECT ob
EXPORTING
x = p_x
y = p_y.
CALL METHOD ob->display.

REPORT z7amoops19. " Local class inheritance (single and multilevel)

CLASS cycle DEFINITION.

*class cycle definition final.


PUBLIC SECTION.
METHODS : setcycle,
display.
PROTECTED SECTION.
DATA : wheels TYPE i,
brakes TYPE i,
colour(20) TYPE c.

ENDCLASS.

CLASS cycle IMPLEMENTATION.

METHOD setcycle.
wheels = 2.
brakes = 2.
colour = 'green'.
ENDMETHOD.

METHOD display.
WRITE :/ wheels,brakes,colour.
ENDMETHOD.

ENDCLASS.

CLASS scooter DEFINITION INHERITING FROM cycle.


PUBLIC SECTION.
METHODS setscooter.
PROTECTED SECTION.
CONSTANTS model TYPE i VALUE 2014.
ENDCLASS.

CLASS scooter IMPLEMENTATION.


METHOD setscooter.
wheels = 2.
brakes = 2.
colour = 'red'.
WRITE :/ 'Model of scooter is :',model.
ENDMETHOD.
ENDCLASS.

CLASS car DEFINITION INHERITING FROM scooter.


PUBLIC SECTION.
METHODS setcar.
PROTECTED SECTION.
CONSTANTS gears TYPE i VALUE 5.
ENDCLASS.

CLASS car IMPLEMENTATION.


METHOD setcar.
wheels = 4.
brakes = 3.
colour = 'white'.
WRITE :/ 'Gears of car :',gears.
ENDMETHOD.
ENDCLASS.

START-OF-SELECTION.
WRITE :/ 'CYCLE CLASS ....'.
DATA ob1 TYPE REF TO cycle.
CREATE OBJECT ob1.

CALL METHOD : ob1->setcycle,


ob1->display.

WRITE :/ 'SCOOTER class...'.


DATA ob2 TYPE REF TO scooter.
CREATE OBJECT ob2.

CALL METHOD : ob2->setscooter,


ob2->display.

WRITE :/ 'CAR class...'.


DATA ob3 TYPE REF TO car.
CREATE OBJECT ob3.
CALL METHOD : ob3->setcar,
ob3->display.

REPORT z7amoops20. " Access Global inheritance

WRITE :/ 'CYCLE class'.


DATA ob1 TYPE REF TO z7amcycle.
CREATE OBJECT ob1.

CALL METHOD : ob1->setcycle,


ob1->display.

WRITE :/ 'scooter class'.


DATA ob2 TYPE REF TO z7amscooter.
CREATE OBJECT ob2.

CALL METHOD : ob2->setscooter,


ob2->display.

WRITE :/ 'car class'.


DATA ob3 TYPE REF TO z7amcar.
CREATE OBJECT ob3.

CALL METHOD : ob3->setcar,


ob3->display.

REPORT z7amoops21. " method overloading (not supported)

CLASS abc DEFINITION.


PUBLIC SECTION.
METHODS : m1,
m1 IMPORTING x TYPE i,
m1 IMPORTING x TYPE c,
m1 IMPORTING x TYPE i y TYPE c.

ENDCLASS.

REPORT z7amoops22. " method overriding (local classes)

CLASS abc DEFINITION.


PUBLIC SECTION.
METHODS : m1,
m2 FINAL.
CLASS-METHODS m3.
ENDCLASS.

CLASS abc IMPLEMENTATION.


METHOD m1.
WRITE :/ 'inside super class method m1'.
ENDMETHOD.

METHOD m2.
WRITE :/ 'inside super class method m2'.
ENDMETHOD.

METHOD m3.
WRITE :/ 'inside static method m3 of super class'.
ENDMETHOD.
ENDCLASS.

CLASS pqr DEFINITION INHERITING FROM abc.


PUBLIC SECTION.
METHODS m1 REDEFINITION.
* class-methods m3 redefinition.
* methods m2 redefinition.
ENDCLASS.

CLASS pqr IMPLEMENTATION.


METHOD m1.
WRITE :/ 'inside sub class method m1'.
CALL METHOD super->m1.
ENDMETHOD.
ENDCLASS.

START-OF-SELECTION.

DATA ob TYPE REF TO pqr.


CREATE OBJECT ob.

CALL METHOD ob->m1.


REPORT z7amoops23. " method overriding (global classes)

DATA ob TYPE REF TO z7amclass3.


CREATE OBJECT ob.

CALL METHOD ob->m1.

REPORT z7amoops24. " Hierarchy of const.execution  scenario 1

CLASS abc DEFINITION.


PUBLIC SECTION.
METHODS constructor.
CLASS-METHODS class_constructor.
ENDCLASS.

CLASS abc IMPLEMENTATION.


METHOD constructor.
WRITE :/ 'inside instance constr of super class'.
ENDMETHOD.

METHOD class_constructor.
WRITE :/ 'inside static constr of super class'.
ENDMETHOD.
ENDCLASS.

CLASS pqr DEFINITION INHERITING FROM abc.

ENDCLASS.

START-OF-SELECTION.
WRITE :/ 'First object ..'.
DATA ob1 TYPE REF TO pqr.
CREATE OBJECT ob1.
ULINE.
WRITE :/ 'Second object ..'.
DATA ob2 TYPE REF TO pqr.
CREATE OBJECT ob2.
REPORT z7amoops25. " hierarchy of const.execution  scenario 2

CLASS abc DEFINITION.


PUBLIC SECTION.
METHODS constructor.
CLASS-METHODS class_constructor.
ENDCLASS.

CLASS abc IMPLEMENTATION.


METHOD constructor.
WRITE :/ 'inside instance constr of super class'.
ENDMETHOD.

METHOD class_constructor.
WRITE :/ 'inside static constr of super class'.
ENDMETHOD.
ENDCLASS.

CLASS pqr DEFINITION INHERITING FROM abc.


PUBLIC SECTION.
CLASS-METHODS class_constructor.
ENDCLASS.

CLASS pqr IMPLEMENTATION.


METHOD class_constructor.
WRITE :/ 'inside static constr of sub class'.
ENDMETHOD.
ENDCLASS.

START-OF-SELECTION.
WRITE :/ 'First object ..'.
DATA ob1 TYPE REF TO pqr.
CREATE OBJECT ob1.
ULINE.
WRITE :/ 'Second object ..'.
DATA ob2 TYPE REF TO pqr.
CREATE OBJECT ob2.

REPORT z7amoops26. " Hierarchy of const.execution  Scenaio 3

CLASS abc DEFINITION.


PUBLIC SECTION.
METHODS constructor.
CLASS-METHODS class_constructor.
ENDCLASS.

CLASS abc IMPLEMENTATION.


METHOD constructor.
WRITE :/ 'inside instance constr of super class'.
ENDMETHOD.

METHOD class_constructor.
WRITE :/ 'inside static constr of super class'.
ENDMETHOD.
ENDCLASS.

CLASS pqr DEFINITION INHERITING FROM abc.


PUBLIC SECTION.
CLASS-METHODS class_constructor.
METHODS constructor.
ENDCLASS.

CLASS pqr IMPLEMENTATION.


METHOD class_constructor.
WRITE :/ 'inside static constr of sub class'.
ENDMETHOD.

METHOD constructor.
WRITE :/ 'inside instance constr of sub class'.
CALL METHOD super->constructor.
ENDMETHOD.

ENDCLASS.
START-OF-SELECTION.
WRITE :/ 'First object ..'.
DATA ob1 TYPE REF TO pqr.
CREATE OBJECT ob1.
ULINE.
WRITE :/ 'Second object ..'.
DATA ob2 TYPE REF TO pqr.
CREATE OBJECT ob2.

REPORT z7amoops27. " Local abstract classes

CLASS restaurant DEFINITION ABSTRACT.


PUBLIC SECTION.
METHODS : store,
display,
payment ABSTRACT.
PROTECTED SECTION.
DATA : tableno TYPE i,
steward(20) TYPE c.
ENDCLASS.

CLASS restaurant IMPLEMENTATION.


METHOD store.
tableno = 44.
steward = 'abc'.
ENDMETHOD.

METHOD display.
WRITE :/ tableno,steward.
ENDMETHOD.
ENDCLASS.

CLASS cheque DEFINITION INHERITING FROM restaurant.


PUBLIC SECTION.
METHODS payment REDEFINITION.
PROTECTED SECTION.
DATA : cqno TYPE i,
bank(20) TYPE c,
amt TYPE i.
ENDCLASS.

CLASS cheque IMPLEMENTATION.


METHOD payment.
cqno = 555.
bank = 'SBI'.
amt = 333.
WRITE :/ cqno,bank,amt.
ENDMETHOD.
ENDCLASS.

CLASS creditcard DEFINITION INHERITING FROM restaurant.


PUBLIC SECTION.
METHODS payment REDEFINITION.
PROTECTED SECTION.
DATA : ccno TYPE i,
bankname(20) TYPE c,
amount TYPE i.
ENDCLASS.

CLASS creditcard IMPLEMENTATION.


METHOD payment.
ccno = 444.
bankname = 'RBS'.
amount = 3433.
WRITE :/ ccno,bankname,amount.
ENDMETHOD.
ENDCLASS.

START-OF-SELECTION.
DATA ob TYPE REF TO restaurant.

WRITE :/ 'Cheque class object..'.


DATA cq TYPE REF TO cheque.
CREATE OBJECT cq.

CALL METHOD : cq->store,


cq->display,
cq->payment.

ULINE.
WRITE :/ 'CHEQUE --> RESTAURANT'.
ob = cq.
CALL METHOD : ob->store,
ob->display,
ob->payment.

ULINE.
WRITE :/ 'CREDIT CARD object..'.
DATA cc TYPE REF TO creditcard.
CREATE OBJECT cc.

CALL METHOD : cc->store,


cc->display,
cc->payment.

ULINE.
WRITE :/ 'CREDIT CARD ---> RESTAURANT'.
ob = cc.
CALL METHOD : ob->store,
ob->display,
ob->payment.

REPORT z7amoops28. " Global abstract classes

DATA cc TYPE REF TO z7amcheque.


CREATE OBJECT cc.

CALL METHOD cc->store.


CALL METHOD cc->display.

CALL METHOD cc->payment.

REPORT z7amoops29. " local interfaces


INTERFACE rectangle.
CONSTANTS : length TYPE i VALUE 10,
breadth TYPE i VALUE 5.
METHODS : area,
perimeter.
ENDINTERFACE.

INTERFACE square.
CONSTANTS side TYPE i VALUE 5.
METHODS : area,
perimeter.
ENDINTERFACE.

CLASS abc DEFINITION.


PUBLIC SECTION.
INTERFACES : rectangle,
square.
PROTECTED SECTION.
DATA res TYPE i.
ENDCLASS.

CLASS abc IMPLEMENTATION.


METHOD rectangle~area.
res = rectangle~length * rectangle~breadth.
WRITE :/ 'Area of rectangle is ',res.
ENDMETHOD.

METHOD rectangle~perimeter.
res = 2 * ( rectangle~length + rectangle~breadth ).
WRITE :/ 'Perimeter of rectangle is ',res.
ENDMETHOD.

METHOD square~area.
res = square~side * square~side.
WRITE :/ 'Area of square is ',res.
ENDMETHOD.

METHOD square~perimeter.
res = 4 * square~side.
WRITE :/ 'perimeter of square is ',res.
ENDMETHOD.
ENDCLASS.

START-OF-SELECTION.
DATA r TYPE REF TO rectangle.

DATA ob TYPE REF TO abc.


CREATE OBJECT ob.
CALL METHOD : ob->rectangle~area,
ob->rectangle~perimeter,
ob->square~area,
ob->square~perimeter.

ULINE.
WRITE :/ 'IMPL.CLASS ---> RECTANGLE Interface'.
r = ob.
CALL METHOD : r->area,
r->perimeter.

ULINE.
DATA s TYPE REF TO square.
WRITE :/ 'IMPL.CLASS ---> SQUARE Interface'.
s = ob.
CALL METHOD : s->area,
s->perimeter.

REPORT z7amoops30. " Access global interfaces

DATA ob TYPE REF TO z7amimpl.


CREATE OBJECT ob.

CALL METHOD ob->z7amrectangle~area.


CALL METHOD ob->z7amrectangle~perimeter.
CALL METHOD ob->z7amsquare~area.
CALL METHOD ob->z7amsquare~perimeter.

REPORT z7amoops31. " Implementing interfaces partially

INTERFACE abc.
METHODS : m1,
m2,
m3.
ENDINTERFACE.

CLASS pqr DEFINITION ABSTRACT.


PUBLIC SECTION.
INTERFACES abc ABSTRACT METHODS m2 m3.
ENDCLASS.

CLASS pqr IMPLEMENTATION.


METHOD abc~m1.
WRITE :/ 'inside method m1'.
ENDMETHOD.
ENDCLASS.

CLASS lmn DEFINITION INHERITING FROM pqr.


PUBLIC SECTION.
METHODS : abc~m2 REDEFINITION,
abc~m3 REDEFINITION.

ENDCLASS.

CLASS lmn IMPLEMENTATION.


METHOD abc~m2.
WRITE :/ 'inside m2'.
ENDMETHOD.

METHOD abc~m3.
WRITE :/ 'inside m3'.
ENDMETHOD.

ENDCLASS.

START-OF-SELECTION.
DATA ob TYPE REF TO lmn.
CREATE OBJECT ob.

CALL METHOD : ob->abc~m1,


ob->abc~m2,
ob->abc~m3.
REPORT z7amoops32. " Local aliases

INTERFACE pqr.
METHODS : m1,
m2.
ENDINTERFACE.

CLASS abc DEFINITION.


PUBLIC SECTION.
INTERFACES pqr.
ALIASES a1 FOR pqr~m1.
PROTECTED SECTION.
ALIASES a2 FOR pqr~m2.
ENDCLASS.

CLASS abc IMPLEMENTATION.


METHOD a1.
WRITE :/ 'inside method m1'.
CALL METHOD a2.
ENDMETHOD.

METHOD a2.
WRITE :/ 'inside method m2'.
ENDMETHOD.

ENDCLASS.

START-OF-SELECTION.
DATA ob TYPE REF TO abc.
CREATE OBJECT ob.

CALL METHOD ob->a1.


CALL METHOD ob->pqr~m2.

REPORT z7amoops33. " Access Global aliases

DATA ob TYPE REF TO z7amimpl2.


CREATE OBJECT ob.

CALL METHOD : ob->a1,


ob->a2.
ULINE.
CALL METHOD ob->z7amintf~m1.

REPORT z7amoops34. " Including interfaces inside other interfaces

INTERFACE intf1.
METHODS : m1,
m2.
ENDINTERFACE.

INTERFACE intf2.
METHODS m3.
INTERFACES intf1.
ENDINTERFACE.

CLASS impl DEFINITION.


PUBLIC SECTION.
INTERFACES intf2.
ENDCLASS.

CLASS impl IMPLEMENTATION.


METHOD intf2~m3.
WRITE :/ 'inside method m3'.
ENDMETHOD.

METHOD intf1~m1.
WRITE :/ 'inside method m1'.
ENDMETHOD.

METHOD intf1~m2.
WRITE :/ 'inside method m2'.
ENDMETHOD.

ENDCLASS.

START-OF-SELECTION.
DATA ob TYPE REF TO impl.
CREATE OBJECT ob.

CALL METHOD : ob->intf1~m1,


ob->intf1~m2,
ob->intf2~m3.
REPORT z7amoops35. " Global including of interfaces inside other

DATA ob TYPE REF TO z7amimpl3.


CREATE OBJECT ob.

CALL METHOD : ob->zinf1~m1,


ob->zinf1~m2,
ob->zinf2~m3.

REPORT z7amoops36. " Handling Standard exceptions (class cx_sy_zerodiv


ide)

CLASS abc DEFINITION.


PUBLIC SECTION.
METHODS m1 IMPORTING x TYPE i y TYPE i
EXPORTING z TYPE i.
ENDCLASS.

CLASS abc IMPLEMENTATION.


METHOD m1.
TRY.
WRITE :/ 'Begin of method'.
z = x / y.
WRITE :/ 'end of method'.
CATCH cx_sy_zerodivide.
MESSAGE 'Cannot divide by zero' TYPE 'I'.
ENDTRY.
ENDMETHOD.
ENDCLASS.

START-OF-SELECTION.
DATA ob TYPE REF TO abc.
CREATE OBJECT ob.

PARAMETERS : p_x TYPE i,


p_y TYPE i.

DATA lv_z TYPE i.

CALL METHOD ob->m1


EXPORTING
x = p_x
y = p_y
IMPORTING
z = lv_z.

WRITE :/ 'Division is ',lv_z.


WRITE :/ 'end of program'.

REPORT z7amoops37. " Handling standard exceptions (single statement in


try block)

CLASS abc DEFINITION.


PUBLIC SECTION.
METHODS m1 IMPORTING x TYPE i y TYPE i
EXPORTING z TYPE i.
ENDCLASS.

CLASS abc IMPLEMENTATION.


METHOD m1.
WRITE :/ 'Begin of method'.
TRY.
z = x / y.
CATCH cx_sy_zerodivide.
MESSAGE 'Cannot divide by zero' TYPE 'I'.
ENDTRY.

WRITE :/ 'end of method'.


ENDMETHOD.
ENDCLASS.
START-OF-SELECTION.
DATA ob TYPE REF TO abc.
CREATE OBJECT ob.

PARAMETERS : p_x TYPE i,


p_y TYPE i.

DATA lv_z TYPE i.

CALL METHOD ob->m1


EXPORTING
x = p_x
y = p_y
IMPORTING
z = lv_z.

WRITE :/ 'Division is ',lv_z.


WRITE :/ 'end of program'.

REPORT z7amoops38. " Handling standard exceptions (class cx_root)

CLASS abc DEFINITION.


PUBLIC SECTION.
METHODS m1 IMPORTING x TYPE i y TYPE i
EXPORTING z TYPE i.
ENDCLASS.

CLASS abc IMPLEMENTATION.


METHOD m1.
WRITE :/ 'Begin of method'.
TRY.
z = x / y.
* catch cx_sy_zerodivide.
CATCH cx_root.
MESSAGE 'Cannot divide by zero' TYPE 'I'.
ENDTRY.

WRITE :/ 'end of method'.


ENDMETHOD.
ENDCLASS.

START-OF-SELECTION.
DATA ob TYPE REF TO abc.
CREATE OBJECT ob.

PARAMETERS : p_x TYPE i,


p_y TYPE i.

DATA lv_z TYPE i.

CALL METHOD ob->m1


EXPORTING
x = p_x
y = p_y
IMPORTING
z = lv_z.

WRITE :/ 'Division is ',lv_z.


WRITE :/ 'end of program'.
REPORT z7amoops39. " Capturing standard exception messages

DATA k TYPE REF TO cx_sy_zerodivide.

DATA lv_str TYPE string.

DATA : lv_pname TYPE sy-repid,


lv_iname TYPE sy-repid,
lv_pos TYPE i.

CLASS abc DEFINITION.


PUBLIC SECTION.
METHODS m1 IMPORTING x TYPE i y TYPE i
EXPORTING z TYPE i.
ENDCLASS.

CLASS abc IMPLEMENTATION.


METHOD m1.
WRITE :/ 'Begin of method'.
TRY.
z = x / y.
CATCH cx_sy_zerodivide INTO k.
ULINE.
CALL METHOD k->if_message~get_text
RECEIVING
result = lv_str.

WRITE :/ 'Short text ',lv_str.

ULINE.
CLEAR lv_str.
CALL METHOD k->if_message~get_longtext
RECEIVING
result = lv_str.

WRITE :/ 'Long text is ',lv_str.


ULINE.
CALL METHOD k->get_source_position
IMPORTING
program_name = lv_pname
include_name = lv_iname
source_line = lv_pos.
ULINE.
WRITE :/ 'Program name :',lv_pname,
/ 'Include name :',lv_iname,
/ 'Line no :',lv_pos.
ENDTRY.

WRITE :/ 'end of method'.


ENDMETHOD.
ENDCLASS.

START-OF-SELECTION.
DATA ob TYPE REF TO abc.
CREATE OBJECT ob.

PARAMETERS : p_x TYPE i,


p_y TYPE i.

DATA lv_z TYPE i.

CALL METHOD ob->m1


EXPORTING
x = p_x
y = p_y
IMPORTING
z = lv_z.

WRITE :/ 'Division is ',lv_z.


WRITE :/ 'end of program'.
REPORT z7amoops40. " user defined exceptions in local classes

CLASS abc DEFINITION.


PUBLIC SECTION.
METHODS m1 IMPORTING x TYPE i y TYPE i
EXPORTING z TYPE i
EXCEPTIONS myexception.
ENDCLASS.

CLASS abc IMPLEMENTATION.


METHOD m1.
IF y EQ 0.
RAISE myexception.
ELSE.
z = x / y.
ENDIF.
ENDMETHOD.
ENDCLASS.

START-OF-SELECTION.
PARAMETERS : p_x TYPE i,
p_y TYPE i.

DATA lv_z TYPE i.

DATA ob TYPE REF TO abc.


CREATE OBJECT ob.

CALL METHOD ob->m1


EXPORTING
x = p_x
y = p_y
IMPORTING
z = lv_z
EXCEPTIONS
myexception = 1
OTHERS = 2.

IF sy-subrc EQ 0.
WRITE :/ 'Division is ',lv_z.
ELSEIF sy-subrc EQ 1.
WRITE :/ 'cannot divide by zero'.
ELSEIF sy-subrc EQ 2.
WRITE :/ 'Unknown error'.
ENDIF.

REPORT z7amoops40. " user defined exceptions in local classes

CLASS abc DEFINITION.


PUBLIC SECTION.
METHODS m1 IMPORTING x TYPE i y TYPE i
EXPORTING z TYPE i
EXCEPTIONS myexception.
ENDCLASS.

CLASS abc IMPLEMENTATION.


METHOD m1.
IF y EQ 0.
RAISE myexception.
ELSE.
z = x / y.
ENDIF.
ENDMETHOD.
ENDCLASS.

START-OF-SELECTION.
PARAMETERS : p_x TYPE i,
p_y TYPE i.

DATA lv_z TYPE i.

DATA ob TYPE REF TO abc.


CREATE OBJECT ob.

CALL METHOD ob->m1


EXPORTING
x = p_x
y = p_y
IMPORTING
z = lv_z
EXCEPTIONS
myexception = 1
OTHERS = 2.

IF sy-subrc EQ 0.
WRITE :/ 'Division is ',lv_z.
ELSEIF sy-subrc EQ 1.
WRITE :/ 'cannot divide by zero'.
ELSEIF sy-subrc EQ 2.
WRITE :/ 'Unknown error'.
ENDIF.

REPORT z7amoops41. " Accessing global user defined exceptions

DATA ob TYPE REF TO z7amclass4.


CREATE OBJECT ob.

PARAMETERS : p_x TYPE i,


p_y TYPE i.

DATA lv_z TYPE i.

CALL METHOD ob->m1


EXPORTING
i_x = p_x
i_y = p_y
IMPORTING
e_z = lv_z
EXCEPTIONS
myexception = 11
OTHERS = 20.

IF sy-subrc EQ 0.
WRITE :/ 'Division is ',lv_z.
ELSEIF sy-subrc EQ 11.
WRITE :/ 'Cannot divide by zero'.
ELSEIF sy-subrc EQ 20.
WRITE :/ 'Unknown errror'.
ENDIF.

REPORT z7amoops42. " Raising keyword

CLASS abc DEFINITION.


PUBLIC SECTION.
METHODS m1 IMPORTING x TYPE i y TYPE i
EXPORTING z TYPE i
RAISING cx_sy_zerodivide.
ENDCLASS.

CLASS abc IMPLEMENTATION.


METHOD m1.
WRITE :/ 'Begin of method'.
z = x / y.
WRITE :/ 'end of method'.
ENDMETHOD.
ENDCLASS.

START-OF-SELECTION.
DATA ob TYPE REF TO abc.
CREATE OBJECT ob.

PARAMETERS : p_x TYPE i,


p_y TYPE i.

DATA lv_z TYPE i.

TRY.
CALL METHOD ob->m1
EXPORTING
x = p_x
y = p_y
IMPORTING
z = lv_z.
CATCH cx_sy_zerodivide.
WRITE :/ 'Cannot divide by zero'.
ENDTRY.

WRITE :/ 'Division is ',lv_z.

ULINE.
DATA k TYPE REF TO cx_sy_zerodivide.
DATA lv_str TYPE string.
TRY.
CALL METHOD ob->m1
EXPORTING
x = 99
y = 0
IMPORTING
z = lv_z.
CATCH cx_sy_zerodivide INTO k.
CALL METHOD k->if_message~get_text
RECEIVING
result = lv_str.

WRITE :/ 'Short text is ',lv_str.


ENDTRY.

WRITE :/ 'end of program'.

REPORT z7amoops43. " cleanup block

CLASS abc DEFINITION.


PUBLIC SECTION.
METHODS m1 IMPORTING x TYPE i y TYPE i
EXPORTING z TYPE i.
ENDCLASS.

CLASS abc IMPLEMENTATION.


METHOD m1.
TRY.
TRY.
WRITE :/ 'Begin of method'.
z = x / y.
CLEANUP.
WRITE :/ 'inside cleanup block'.
WRITE :/ 'end of method'.
ENDTRY.
CATCH cx_sy_zerodivide.
MESSAGE 'Cannot divide by zero' TYPE 'I'.
ENDTRY.
ENDMETHOD.
ENDCLASS.

START-OF-SELECTION.
DATA ob TYPE REF TO abc.
CREATE OBJECT ob.

PARAMETERS : p_x TYPE i,


p_y TYPE i.

DATA lv_z TYPE i.

CALL METHOD ob->m1


EXPORTING
x = p_x
y = p_y
IMPORTING
z = lv_z.

WRITE :/ 'Division is ',lv_z.


WRITE :/ 'end of program'.
REPORT z7amoops44. "Raising exceptions from exception classes Using OT
R

DATA k TYPE REF TO zcx_7amexcep1.


DATA : lv_str TYPE string.

TRY.
RAISE EXCEPTION TYPE zcx_7amexcep1
EXPORTING
textid = zcx_7amexcep1=>id1.
CATCH zcx_7amexcep1 INTO k.
CALL METHOD k->if_message~get_text
RECEIVING
result = lv_str.

WRITE :/ 'short text is ',lv_str.

CLEAR lv_str.

CALL METHOD k->if_message~get_longtext


RECEIVING
result = lv_str.
WRITE :/ 'long text is :',lv_str.

ENDTRY.

ULINE.
TRY.
RAISE EXCEPTION TYPE zcx_7amexcep1
EXPORTING
textid = zcx_7amexcep1=>id2.
CATCH zcx_7amexcep1 INTO k.
CALL METHOD k->if_message~get_text
RECEIVING
result = lv_str.

WRITE :/ 'Short text for id2 is ',lv_str.

CLEAR lv_str.
CALL METHOD k->if_message~get_longtext
RECEIVING
result = lv_str.
WRITE :/ 'long text for id2 is ',lv_str.

ENDTRY.

REPORT z7amoops45. " raising exceptions from exception classes Using m


essage classes

DATA k TYPE REF TO zcx_7amexcep2.


DATA : lv_str TYPE string.

TRY.
RAISE EXCEPTION TYPE zcx_7amexcep2
EXPORTING
textid = zcx_7amexcep2=>id1.
CATCH zcx_7amexcep2 INTO k.
CALL METHOD k->if_message~get_text
RECEIVING
result = lv_str.

WRITE :/ ' text is ',lv_str.

ENDTRY.

ULINE.
CLEAR lv_str.
TRY.
RAISE EXCEPTION TYPE zcx_7amexcep2
EXPORTING
textid = zcx_7amexcep2=>id2.
CATCH zcx_7amexcep2 INTO k.
CALL METHOD k->if_message~get_text
RECEIVING
result = lv_str.

WRITE :/ ' text is ',lv_str.

ENDTRY.

ULINE.
TRY.
RAISE EXCEPTION TYPE zcx_7amexcep2
EXPORTING
textid = zcx_7amexcep2=>id3
attr1 = 'CORE ABAP'
attr2 = 'OOPS ABAP'
attr3 = 'CROSS APPS'
attr4 = 'WEBDYNPRO ABAP'.
CATCH zcx_7amexcep2 INTO k.
CALL METHOD k->if_message~get_text
RECEIVING
result = lv_str.

WRITE :/ 'Text is ',lv_str.

ENDTRY.

ULINE.
TRY.
RAISE EXCEPTION TYPE zcx_7amexcep2
EXPORTING
textid = zcx_7amexcep2=>id4
atr1 = 'CMC'
atr2 = 'WIPRO'
atr3 = 'TCS'
atr4 = 'IBM'.
CATCH zcx_7amexcep2 INTO k.
CALL METHOD k->if_message~get_text
RECEIVING
result = lv_str.

WRITE :/ 'Text is ',lv_str.

ENDTRY.

REPORT z7amoops46. " public classes

*class abc definition.


CLASS abc DEFINITION CREATE PUBLIC.

ENDCLASS.

*class pqr definition inheriting from abc.


*class pqr definition create protected inheriting from abc.
CLASS pqr DEFINITION CREATE PRIVATE INHERITING FROM abc.

ENDCLASS.

DATA ob TYPE REF TO abc.


CREATE OBJECT ob.

*data ob1 type ref to pqr.


*create object ob1.

REPORT z7amoops47. " protected classes

CLASS abc DEFINITION CREATE PROTECTED.


PUBLIC SECTION.
METHODS m1.
ENDCLASS.

CLASS abc IMPLEMENTATION.


METHOD m1.
DATA k TYPE REF TO abc.
CREATE OBJECT k.
ENDMETHOD.
ENDCLASS.

CLASS pqr DEFINITION INHERITING FROM abc.


*class pqr definition create public inheriting from abc.
*class pqr definition create private inheriting from abc.
PUBLIC SECTION.
METHODS m2.
ENDCLASS.

CLASS pqr IMPLEMENTATION.


METHOD m2.
DATA r TYPE REF TO abc.
CREATE OBJECT r.
ENDMETHOD.
ENDCLASS.

START-OF-SELECTION.
*data ob type ref to abc.
*create object ob.
*data ob1 type ref to pqr.
*create object ob1.

REPORT z7amoops48. " private classes

*class pqr definition deferred.

CLASS abc DEFINITION CREATE PRIVATE. "friends pqr.


PUBLIC SECTION.
METHODS m1.
ENDCLASS.

CLASS abc IMPLEMENTATION.


METHOD m1.
DATA k TYPE REF TO abc.
CREATE OBJECT k.
ENDMETHOD.
ENDCLASS.

CLASS pqr DEFINITION INHERITING FROM abc.


*class pqr definition create protected inheriting from abc.
*class pqr definition create public inheriting from abc.
PUBLIC SECTION.
METHODS m2.
ENDCLASS.

CLASS pqr IMPLEMENTATION.


METHOD m2.
* data m type ref to abc.
* create object m.
ENDMETHOD.
ENDCLASS.

START-OF-SELECTION.
*data ob type ref to abc.
*create object ob.

*data k type ref to pqr.


*create object k.

REPORT z7amoops49 LINE-SIZE 200. " RTTS EXAMPLE

PARAMETERS p_tname TYPE dd02l-tabname.

* declare the references


DATA : ref_rowtype TYPE REF TO cl_abap_structdescr,
ref_tabletype TYPE REF TO cl_abap_tabledescr.

*dynamic instantiation
DATA o_type TYPE REF TO cl_abap_typedescr.
CALL METHOD cl_abap_typedescr=>describe_by_name "RTTI
EXPORTING
p_name = p_tname
RECEIVING
p_descr_ref = o_type.

ref_rowtype ?= o_type.

* create the internal table type dynamically


*TRY.
CALL METHOD cl_abap_tabledescr=>create "RTTC
EXPORTING
p_line_type = ref_rowtype
RECEIVING
p_result = ref_tabletype.

* create the object


DATA : ref_itab TYPE REF TO data,
ref_wa TYPE REF TO data.

CREATE DATA ref_itab TYPE HANDLE ref_tabletype.


CREATE DATA ref_wa TYPE HANDLE ref_rowtype.

* value assignment
FIELD-SYMBOLS : <fitab> TYPE ANY TABLE, "fieldsymbol int.table
<fwa> TYPE any, "fieldsymbol work area
<fs>. "fieldsymbol individual field

ASSIGN ref_itab->* TO <fitab>.


ASSIGN ref_wa->* TO <fwa>.

* data retrieval
SELECT * FROM (p_tname) INTO TABLE <fitab> UP TO 10 ROWS.

* data display
LOOP AT <fitab> INTO <fwa>.
DO.
ASSIGN COMPONENT sy-index OF STRUCTURE <fwa> TO <fs>.
IF sy-subrc EQ 0.
WRITE <fs>.
ELSE.
EXIT.
ENDIF.
ENDDO.
NEW-LINE.
ENDLOOP.

REPORT z7amoops49 LINE-SIZE 200. " RTTS EXAMPLE

PARAMETERS p_tname TYPE dd02l-tabname.


* declare the references
DATA : ref_rowtype TYPE REF TO cl_abap_structdescr,
ref_tabletype TYPE REF TO cl_abap_tabledescr.

*dynamic instantiation
DATA o_type TYPE REF TO cl_abap_typedescr.
CALL METHOD cl_abap_typedescr=>describe_by_name "RTTI
EXPORTING
p_name = p_tname
RECEIVING
p_descr_ref = o_type.

ref_rowtype ?= o_type.

* create the internal table type dynamically


*TRY.
CALL METHOD cl_abap_tabledescr=>create "RTTC
EXPORTING
p_line_type = ref_rowtype
RECEIVING
p_result = ref_tabletype.

* create the object


DATA : ref_itab TYPE REF TO data,
ref_wa TYPE REF TO data.

CREATE DATA ref_itab TYPE HANDLE ref_tabletype.


CREATE DATA ref_wa TYPE HANDLE ref_rowtype.

* value assignment
FIELD-SYMBOLS : <fitab> TYPE ANY TABLE, "fieldsymbol int.table
<fwa> TYPE any, "fieldsymbol work area
<fs>. "fieldsymbol individual field

ASSIGN ref_itab->* TO <fitab>.


ASSIGN ref_wa->* TO <fwa>.

* data retrieval
SELECT * FROM (p_tname) INTO TABLE <fitab> UP TO 10 ROWS.

* data display
LOOP AT <fitab> INTO <fwa>.
DO.
ASSIGN COMPONENT sy-index OF STRUCTURE <fwa> TO <fs>.
IF sy-subrc EQ 0.
WRITE <fs>.
ELSE.
EXIT.
ENDIF.
ENDDO.
NEW-LINE.
ENDLOOP.
REPORT z7amoops50. " State of the object (local to program)

CLASS abc DEFINITION.


PUBLIC SECTION.
DATA : empno TYPE i,
ename(20) TYPE c.
ENDCLASS.
DATA ob TYPE REF TO abc.
CREATE OBJECT ob.
ob->empno = 6.
ob->ename = 'raju'.

WRITE :/ 'Values of object ob'.


WRITE :/ ob->empno,
ob->ename.

REPORT z7amoops51. " Creating Persistent object using Business key ide
ntity

PARAMETERS : p_empno TYPE z7amempl-empno,


p_ename TYPE z7amempl-ename,
p_desig TYPE z7amempl-empdesig.

DATA : actor TYPE REF TO zca_7amempl,


pers TYPE REF TO zcl_7amempl.

START-OF-SELECTION.
actor = zca_7amempl=>agent.

TRY.
CALL METHOD actor->create_persistent
EXPORTING
i_empdesig = p_desig
i_empno = p_empno
i_ename = p_ename
RECEIVING
result = pers.

IF pers IS NOT INITIAL.


COMMIT WORK. "saves the transaction permanently in the db
ENDIF.
CATCH cx_os_object_existing .
MESSAGE 'Exception in creating persistent object' TYPE 'I'.
ENDTRY.

automatically create Actor class


REPORT z7amoops51. " Creating Persistent object using Business key ide
ntity

PARAMETERS : p_empno TYPE z7amempl-empno,


p_ename TYPE z7amempl-ename,
p_desig TYPE z7amempl-desig.

DATA : actor TYPE REF TO zca_7amempl,


pers TYPE REF TO zcl_7amempl.

START-OF-SELECTION.
actor = zca_7amempl=>agent.

TRY.
CALL METHOD actor->create_persistent
EXPORTING
i_empdesig = p_desig
i_empno = p_empno
i_ename = p_ename
RECEIVING
result = pers.

IF pers IS NOT INITIAL.


COMMIT WORK. "saves the transaction permanently in the db
ENDIF.
CATCH cx_os_object_existing .
MESSAGE 'Exception in creating persistent object' TYPE 'I'.
ENDTRY.

REPORT z7amoops52. " Deleting persistent object using Business key ide
ntity

PARAMETERS : p_empno TYPE z7amempl-empno.

DATA : actor TYPE REF TO zca_7amempl.

START-OF-SELECTION.
actor = zca_7amempl=>agent.

TRY.
CALL METHOD actor->delete_persistent
EXPORTING
i_empno = p_empno.

COMMIT WORK.

CATCH cx_os_object_not_existing .
MESSAGE 'Object not existing for deletion' TYPE 'I'.
ENDTRY.

REPORT z7amoops53. " get persistent (business key identity)

PARAMETERS p_empno TYPE z7amempl-empno.

DATA : actor TYPE REF TO zca_7amempl,


pers TYPE REF TO zcl_7amempl,
lv_ename TYPE z7amempl-ename,
lv_desig TYPE z7amempl-empdesig.

START-OF-SELECTION.
actor = zca_7amempl=>agent.

TRY.
CALL METHOD actor->get_persistent
EXPORTING
i_empno = p_empno
RECEIVING
result = pers.
IF pers IS NOT INITIAL.
CLEAR : lv_ename,
lv_desig.
lv_ename = pers->get_ename( ).
lv_desig = pers->get_empdesig( ).
WRITE :/ 'Employee name :',lv_ename,
/ 'Designation :',lv_desig.
ENDIF.
CATCH cx_os_object_not_found .
MESSAGE 'Object not found' TYPE 'I'.
ENDTRY.

REPORT z7amoops54. " modify persistent object (business key identity)

PARAMETERS p_empno TYPE z7amempl-empno.

DATA : actor TYPE REF TO zca_7amempl,


pers TYPE REF TO zcl_7amempl.

START-OF-SELECTION.
actor = zca_7amempl=>agent.

TRY.
CALL METHOD actor->get_persistent
EXPORTING
i_empno = p_empno
RECEIVING
result = pers.
IF pers IS NOT INITIAL.
pers->set_ename( 'Gensoft' ).
pers->set_empdesig( 'Training' ).
COMMIT WORK.

ENDIF.
CATCH cx_os_object_not_found .
MESSAGE 'Object not found' TYPE 'I'.
ENDTRY.

REPORT z7amoops55. " create persistent by guid

PARAMETERS : p_empno TYPE z7am_empl-empno,


p_ename TYPE z7am_empl-ename,
p_desig TYPE z7am_empl-empdesig.

DATA : actor TYPE REF TO zca_7am_empl,


pers TYPE REF TO zcl_7am_empl.

START-OF-SELECTION.
actor = zca_7am_empl=>agent.

TRY.
CALL METHOD actor->create_persistent
EXPORTING
i_empdesig = p_desig
i_empno = p_empno
i_ename = p_ename
RECEIVING
result = pers.

IF pers IS NOT INITIAL.


COMMIT WORK.
ENDIF.
CATCH cx_os_object_existing .
MESSAGE 'Exception in creating object' TYPE 'I'.
ENDTRY.

REPORT z7amoops56. " get persistent by oid

PARAMETERS p_guid TYPE z7am_empl-guid.

DATA : actor TYPE REF TO zca_7am_empl,


ob TYPE REF TO object,
pers TYPE REF TO zcl_7am_empl.

DATA : lv_empno TYPE z7am_empl-empno,


lv_ename TYPE z7am_empl-ename,
lv_desig TYPE z7am_empl-empdesig.

START-OF-SELECTION.
actor = zca_7am_empl=>agent.

TRY.
CALL METHOD actor->if_os_ca_persistency~get_persistent_by_oid
EXPORTING
i_oid = p_guid
RECEIVING
result = ob.
IF ob IS NOT INITIAL.
pers ?= ob.
lv_empno = pers->get_empno( ).
lv_ename = pers->get_ename( ).
lv_desig = pers->get_empdesig( ).
WRITE :/ 'Employee No :',lv_empno,
/ 'Employee Name :',lv_ename,
/ 'Designation :',lv_desig.
ENDIF.
CATCH cx_os_object_not_found .
MESSAGE 'object not found' TYPE 'I'.
CATCH cx_os_class_not_found .
MESSAGE 'class not found' TYPE 'I'.
ENDTRY.

REPORT z7amoops57. " delete persistent by guid

PARAMETERS p_guid TYPE z7am_empl-guid.

DATA : actor TYPE REF TO zca_7am_empl,


ob TYPE REF TO object,
pers TYPE REF TO zcl_7am_empl.

START-OF-SELECTION.
actor = zca_7am_empl=>agent.

TRY.
CALL METHOD actor->if_os_ca_persistency~get_persistent_by_oid
EXPORTING
i_oid = p_guid
RECEIVING
result = ob.
IF ob IS NOT INITIAL.
pers ?= ob.
IF pers IS NOT INITIAL.
TRY.
CALL METHOD actor->if_os_factory~delete_persistent
EXPORTING
i_object = pers.
COMMIT WORK.
CATCH cx_os_object_not_existing .
MESSAGE 'Object not exisiting for deletion' TYPE 'I'.
ENDTRY.
ENDIF.
ENDIF.
CATCH cx_os_object_not_found .
MESSAGE 'object not found' TYPE 'I'.
CATCH cx_os_class_not_found .
MESSAGE 'class not found' TYPE 'I'.
ENDTRY.

REPORT z7amoops58. " modify persistent object by guid

PARAMETERS p_guid TYPE z7am_empl-guid.

DATA : actor TYPE REF TO zca_7am_empl,


ob TYPE REF TO object,
pers TYPE REF TO zcl_7am_empl.

START-OF-SELECTION.
actor = zca_7am_empl=>agent.

TRY.
CALL METHOD actor->if_os_ca_persistency~get_persistent_by_oid
EXPORTING
i_oid = p_guid
RECEIVING
result = ob.
IF ob IS NOT INITIAL.
pers ?= ob.
IF pers IS NOT INITIAL.
pers->set_empno( 20 ).
pers->set_ename( 'Srini' ).
pers->set_empdesig( 'Ceo' ).
COMMIT WORK.
ENDIF.
ENDIF.
CATCH cx_os_object_not_found .
MESSAGE 'object not found' TYPE 'I'.
CATCH cx_os_class_not_found .
MESSAGE 'class not found' TYPE 'I'.
ENDTRY.
REPORT z7amoops59. " Accessing transaction service class (doesn’t work
)

DATA ob TYPE REF TO z7amtrans.


CREATE OBJECT ob.

CALL METHOD ob->m1.

REPORT z7amoops60. " event raised but doesn’t call event handler metho
d as there is no handler registration

CLASS abc DEFINITION.


PUBLIC SECTION.
EVENTS e1. "instance event
METHODS : m1 FOR EVENT e1 OF abc, "instance event handler method
m2. "instance normal method
ENDCLASS.

CLASS abc IMPLEMENTATION.


METHOD m1.
WRITE :/ 'inside event handler method m1'.
ENDMETHOD.

METHOD m2.
WRITE :/ 'inside normal method m2,about to raise event'.
RAISE EVENT e1.
ENDMETHOD.
ENDCLASS.

START-OF-SELECTION.
DATA ob1 TYPE REF TO abc.
CREATE OBJECT ob1.

CALL METHOD ob1->m2.

REPORT z7amoops61. " event raised but doesn’t call event handler metho
d as handler is registered after raising event

CLASS abc DEFINITION.


PUBLIC SECTION.
EVENTS e1. "instance event
METHODS : m1 FOR EVENT e1 OF abc, "instance event handler method
m2. "instance normal method
ENDCLASS.

CLASS abc IMPLEMENTATION.


METHOD m1.
WRITE :/ 'inside event handler method m1'.
ENDMETHOD.
METHOD m2.
WRITE :/ 'inside normal method m2,about to raise event'.
RAISE EVENT e1.
ENDMETHOD.
ENDCLASS.

START-OF-SELECTION.
DATA ob1 TYPE REF TO abc.
CREATE OBJECT ob1.

CALL METHOD ob1->m2.


SET HANDLER ob1->m1 FOR ob1.

REPORT z7amoops62. " event raised and also executes event handler meth
od

CLASS abc DEFINITION.


PUBLIC SECTION.
EVENTS e1. "instance event
METHODS : m1 FOR EVENT e1 OF abc, "instance event handler method
m2. "instance normal method
ENDCLASS.

CLASS abc IMPLEMENTATION.


METHOD m1.
WRITE :/ 'inside event handler method m1'.
ENDMETHOD.

METHOD m2.
WRITE :/ 'inside normal method m2,about to raise event'.
RAISE EVENT e1.
ENDMETHOD.
ENDCLASS.

START-OF-SELECTION.
DATA ob1 TYPE REF TO abc.
CREATE OBJECT ob1.

SET HANDLER ob1->m1 FOR ob1.


CALL METHOD ob1->m2.

REPORT z7amoops63. " Event raised but event handler method is not call
ed as the wrong object is registered while registering the handlers

CLASS abc DEFINITION.


PUBLIC SECTION.
EVENTS e1. "instance event
METHODS : m1 FOR EVENT e1 OF abc, "instance event handler method
m2. "instance normal method
ENDCLASS.

CLASS abc IMPLEMENTATION.


METHOD m1.
WRITE :/ 'inside event handler method m1'.
ENDMETHOD.

METHOD m2.
WRITE :/ 'inside normal method m2,about to raise event'.
RAISE EVENT e1.
ENDMETHOD.
ENDCLASS.

START-OF-SELECTION.
DATA ob1 TYPE REF TO abc.
CREATE OBJECT ob1.
DATA ob2 TYPE REF TO abc.
CREATE OBJECT ob2.
SET HANDLER ob1->m1 FOR ob2.
CALL METHOD ob1->m2.

REPORT z7amoops64. " event raised and also event handler method is ca
lled

CLASS abc DEFINITION.


PUBLIC SECTION.
EVENTS e1. "instance event
METHODS : m1 FOR EVENT e1 OF abc, "instance event handler method
m2. "instance normal method
ENDCLASS.
CLASS abc IMPLEMENTATION.
METHOD m1.
WRITE :/ 'inside event handler method m1'.
ENDMETHOD.

METHOD m2.
WRITE :/ 'inside normal method m2,about to raise event'.
RAISE EVENT e1.
ENDMETHOD.
ENDCLASS.

START-OF-SELECTION.
DATA ob1 TYPE REF TO abc.
CREATE OBJECT ob1.
DATA ob2 TYPE REF TO abc.
CREATE OBJECT ob2.
SET HANDLER ob2->m1 FOR ob2.
CALL METHOD ob1->m2.
REPORT z7amoops65. " event raised and event handler method is called

CLASS abc DEFINITION.


PUBLIC SECTION.
EVENTS e1. "instance event
METHODS : m1 FOR EVENT e1 OF abc, "instance event handler method
m2. "instance normal method
ENDCLASS.

CLASS abc IMPLEMENTATION.


METHOD m1.
WRITE :/ 'inside event handler method m1'.
ENDMETHOD.

METHOD m2.
WRITE :/ 'inside normal method m2,about to raise event'.
RAISE EVENT e1.
ENDMETHOD.
ENDCLASS.

START-OF-SELECTION.
DATA ob1 TYPE REF TO abc.
CREATE OBJECT ob1.

DATA ob2 TYPE REF TO abc.


CREATE OBJECT ob2.

SET HANDLER ob2->m1 FOR ob1.


CALL METHOD ob1->m2.

REPORT z7amoops66. " multiple objects raising events but event handler
method is not called as the handler is not registered

CLASS abc DEFINITION.


PUBLIC SECTION.
EVENTS e1. "instance event
METHODS : m1 FOR EVENT e1 OF abc, "instance event handler method
m2. "instance normal method
ENDCLASS.

CLASS abc IMPLEMENTATION.


METHOD m1.
WRITE :/ 'inside event handler method m1'.
ENDMETHOD.

METHOD m2.
WRITE :/ 'inside normal method m2,about to raise event'.
RAISE EVENT e1.
ENDMETHOD.
ENDCLASS.
START-OF-SELECTION.
DATA ob1 TYPE REF TO abc.
CREATE OBJECT ob1.

DATA ob2 TYPE REF TO abc.


CREATE OBJECT ob2.

*set handler ob2->m1 for ob1.


CALL METHOD ob1->m2.
CALL METHOD ob2->m2.

REPORT z7amoops67. " multiple objects raising events but only one obje
ct is registered

CLASS abc DEFINITION.


PUBLIC SECTION.
EVENTS e1. "instance event
METHODS : m1 FOR EVENT e1 OF abc, "instance event handler method
m2. "instance normal method
ENDCLASS.

CLASS abc IMPLEMENTATION.


METHOD m1.
WRITE :/ 'inside event handler method m1'.
ENDMETHOD.

METHOD m2.
WRITE :/ 'inside normal method m2,about to raise event'.
RAISE EVENT e1.
ENDMETHOD.
ENDCLASS.

START-OF-SELECTION.
DATA ob1 TYPE REF TO abc.
CREATE OBJECT ob1.

DATA ob2 TYPE REF TO abc.


CREATE OBJECT ob2.

SET HANDLER ob2->m1 FOR ob1.


CALL METHOD ob1->m2.
CALL METHOD ob2->m2.

REPORT z7amoops68. " multiple objects raising event and all objects ar
e registered

CLASS abc DEFINITION.


PUBLIC SECTION.
EVENTS e1. "instance event
METHODS : m1 FOR EVENT e1 OF abc, "instance event handler method
m2. "instance normal method
ENDCLASS.

CLASS abc IMPLEMENTATION.


METHOD m1.
WRITE :/ 'inside event handler method m1'.
ENDMETHOD.

METHOD m2.
WRITE :/ 'inside normal method m2,about to raise event'.
RAISE EVENT e1.
ENDMETHOD.
ENDCLASS.

START-OF-SELECTION.
DATA ob1 TYPE REF TO abc.
CREATE OBJECT ob1.

DATA ob2 TYPE REF TO abc.


CREATE OBJECT ob2.

SET HANDLER ob2->m1 FOR ob1.


SET HANDLER ob2->m1 FOR ob2.
CALL METHOD ob1->m2.
CALL METHOD ob2->m2.

REPORT z7amoops69. " Multiple objects raising event and all objects ar
e registered at a time

CLASS abc DEFINITION.


PUBLIC SECTION.
EVENTS e1. "instance event
METHODS : m1 FOR EVENT e1 OF abc, "instance event handler method
m2. "instance normal method
ENDCLASS.

CLASS abc IMPLEMENTATION.


METHOD m1.
WRITE :/ 'inside event handler method m1'.
ENDMETHOD.

METHOD m2.
WRITE :/ 'inside normal method m2,about to raise event'.
RAISE EVENT e1.
ENDMETHOD.
ENDCLASS.
START-OF-SELECTION.
DATA ob1 TYPE REF TO abc.
CREATE OBJECT ob1.

DATA ob2 TYPE REF TO abc.


CREATE OBJECT ob2.

*set handler ob2->m1 for ob1.


*set handler ob2->m1 for ob2.
SET HANDLER ob2->m1 FOR ALL INSTANCES.
CALL METHOD ob1->m2.
CALL METHOD ob2->m2.

REPORT z7amoops72. " multiple event handler methods within the same cl
ass and across the classes

CLASS abc DEFINITION.


PUBLIC SECTION.
EVENTS e1. "instance event
METHODS : m1 FOR EVENT e1 OF abc,
m2 FOR EVENT e1 OF abc,
m3.
ENDCLASS.

CLASS abc IMPLEMENTATION.


METHOD m1.
WRITE :/ 'inside first event handler method m1'.
ENDMETHOD.

METHOD m2.
WRITE :/ 'inside second event handler method m2'.
ENDMETHOD.

METHOD m3.
WRITE :/ 'inside m3, about to raise event'.
RAISE EVENT e1.
ENDMETHOD.
ENDCLASS.

CLASS pqr DEFINITION.


PUBLIC SECTION.
METHODS m4 FOR EVENT e1 OF abc.
ENDCLASS.

CLASS pqr IMPLEMENTATION.


METHOD m4.
WRITE :/ 'inside third event hndler method m4'.
ENDMETHOD.
ENDCLASS.

START-OF-SELECTION.
DATA ob1 TYPE REF TO abc.
CREATE OBJECT ob1.

DATA ob2 TYPE REF TO pqr.


CREATE OBJECT ob2.

SET HANDLER ob1->m2 FOR ob1.


SET HANDLER ob1->m1 FOR ob1.
*set handler ob1->m4 for ob1.
SET HANDLER ob2->m4 FOR ob1.
CALL METHOD ob1->m3.

REPORT z7amoops73. " events with parameters

CLASS abc DEFINITION.


PUBLIC SECTION.
EVENTS e1 EXPORTING VALUE(p1) TYPE i OPTIONAL.
METHODS : m1 FOR EVENT e1 OF abc IMPORTING p1,
m2.
ENDCLASS.
CLASS abc IMPLEMENTATION.
METHOD m1.
WRITE :/ 'inside event handler method m1'.
WRITE :/ 'Parameter received is ',p1.
ENDMETHOD.

METHOD m2.
WRITE :/ 'inside m2, about to raise event with parameters'.
RAISE EVENT e1
EXPORTING
p1 = 10.
ENDMETHOD.
ENDCLASS.

START-OF-SELECTION.

DATA ob TYPE REF TO abc.


CREATE OBJECT ob.

SET HANDLER ob->m1 FOR ob.


CALL METHOD ob->m2.

REPORT z7amoops74. " Access global events

DATA ob TYPE REF TO z7amevents.


CREATE OBJECT ob.

SET HANDLER ob->m1 FOR ob.


CALL METHOD ob->m2.

REPORT z7amoops75. " events in interfaces

INTERFACE abc.
EVENTS e1. "instance event
METHODS : m1 FOR EVENT e1 OF abc, "instance event handler method
m2. "normal method
ENDINTERFACE.

CLASS pqr DEFINITION.


PUBLIC SECTION.
INTERFACES abc.
METHODS m3 FOR EVENT e1 OF abc.
ENDCLASS.

CLASS pqr IMPLEMENTATION.


METHOD abc~m1.
WRITE :/ 'inside first event handler method m1'.
ENDMETHOD.

METHOD m3.
WRITE :/ 'inside second event handler method m3'.
ENDMETHOD.

METHOD abc~m2.
WRITE :/ 'inside method m2, about to raise event'.
RAISE EVENT abc~e1.
ENDMETHOD.

ENDCLASS.

START-OF-SELECTION.
DATA ob TYPE REF TO pqr.
CREATE OBJECT ob.

SET HANDLER ob->abc~m1 FOR ob.


SET HANDLER ob->m3 FOR ob.
CALL METHOD ob->abc~m2.

REPORT z7amoops76. " Types declaration in local classes

CLASS abc DEFINITION.


PUBLIC SECTION.
METHODS : m1,
m2.
PROTECTED SECTION.
TYPES : BEGIN OF ty_kna1.
INCLUDE TYPE zmykna1.
TYPES END OF ty_kna1.
DATA : lt_kna1 TYPE TABLE OF ty_kna1,
ls_kna1 TYPE ty_kna1.
ENDCLASS.

CLASS abc IMPLEMENTATION.


METHOD m1.
SELECT kunnr land1 name1 FROM kna1 INTO TABLE lt_kna1
UP TO 10 ROWS.
ENDMETHOD.

METHOD m2.
LOOP AT lt_kna1 INTO ls_kna1.
WRITE :/ ls_kna1-kunnr,
ls_kna1-land1,
ls_kna1-name1.
ENDLOOP.
ENDMETHOD.
ENDCLASS.

START-OF-SELECTION.
DATA ob TYPE REF TO abc.
CREATE OBJECT ob.

CALL METHOD : ob->m1,


ob->m2.

Global class Types :


Accessing global types in executable programs

REPORT Z7AMOOPS77.

data ob type ref to z7amtypes.


create object ob.
call method : ob->m1,
ob->m2.

REPORT z7amoops78. " Singleton classes

CLASS abc DEFINITION CREATE PRIVATE.


PUBLIC SECTION.
CLASS-METHODS class_constructor.
CLASS-METHODS m1 RETURNING VALUE(m) TYPE REF TO abc.
METHODS m2.
PROTECTED SECTION.
CLASS-DATA k TYPE REF TO abc.
ENDCLASS.

CLASS abc IMPLEMENTATION.


METHOD class_constructor.
CREATE OBJECT k.
ENDMETHOD.

METHOD m1.
WRITE :/ 'inside static method m1'.
m = k.
ENDMETHOD.

METHOD m2.
WRITE :/ 'inside instance method m2'.
ENDMETHOD.
ENDCLASS.

START-OF-SELECTION.
DATA ob TYPE REF TO abc.

ob = abc=>m1( ).
CALL METHOD ob->m2.
WRITE :/ 'hello'.

REPORT z7amoops79. " Narrow casting


CLASS animal DEFINITION.
PUBLIC SECTION.
METHODS hungry.
ENDCLASS.

CLASS animal IMPLEMENTATION.


METHOD hungry.
WRITE :/ 'animal is hungry'.
ENDMETHOD.
ENDCLASS.

CLASS lion DEFINITION INHERITING FROM animal.


PUBLIC SECTION.
METHODS hungry REDEFINITION.
METHODS fasting.
ENDCLASS.

CLASS lion IMPLEMENTATION.


METHOD hungry.
WRITE :/ 'lion is hungry'.
ENDMETHOD.

METHOD fasting.
WRITE :/ 'Lion is on fasting'.
ENDMETHOD.
ENDCLASS.

START-OF-SELECTION.
WRITE :/ 'ANIMAL Class object ..'.
DATA ob1 TYPE REF TO animal.
CREATE OBJECT ob1.

CALL METHOD ob1->hungry.

ULINE.
WRITE :/ 'LION Class object ..'.
DATA ob2 TYPE REF TO lion.
CREATE OBJECT ob2.

CALL METHOD ob2->hungry.


CALL METHOD ob2->fasting.

ULINE.
WRITE :/ 'LION CLASS OBJECT ---> ANIMAL CLASS OBJECT'.
ob1 = ob2.
CALL METHOD ob1->hungry.
*call method ob1->fasting. not possible
CALL METHOD ob1->('FASTING'). "dynamic calling
In macros editor :
REPORT Z7AMOOPS80.  Accessing macros

data ob type ref to z7ammacros.


create object ob.

call method ob->m1.


Implementation for method ‘M1’ :

METHOD m1.
* get the reference of transaction manager
DATA o_trans_mng TYPE REF TO if_os_transaction_manager.
CALL METHOD cl_os_system=>get_transaction_manager
RECEIVING
result = o_trans_mng.
* get the reference of transaction
DATA o_trans TYPE REF TO if_os_transaction.
CALL METHOD o_trans_mng->create_transaction
RECEIVING
result = o_trans.
* start the transaction
TRY.
CALL METHOD o_trans->start.
* perform the operation (create persistent)
* get the actor class object
DATA o_actor TYPE REF TO zca_7amempl.
o_actor = zca_7amempl=>agent.
* create the persistent object
DATA o_pers TYPE REF TO zcl_7amempl.
TRY.
CALL METHOD o_actor->create_persistent
EXPORTING
i_empdesig = 'Ceo'
i_empno = 250
i_ename = 'Satish'
RECEIVING
result = o_pers.
CATCH cx_os_object_existing .
MESSAGE 'Exception in creating persistent object' TYPE 'I'.
ENDTRY.
* end the transaction
TRY.
CALL METHOD o_trans->end.
CATCH cx_os_check_agent_failed .
CATCH cx_os_transaction .
* cancel the transaction
o_trans->undo( ).
ENDTRY.

CATCH cx_os_transaction .
MESSAGE 'error in starting the transaction' TYPE 'I'.
ENDTRY.

ENDMETHOD.

You might also like