ABAP OBJECTS - STEP-BY-STEP GUIDE Added by Vikrant Trivedi, last edited by Vikrant Trivedi on Apr 28, 2008 SUMMARY This is a step-by-step guide to learn ABAP Objects. Typically used to enable ABAP developers to place their first step into ABAP Objects. This guide includes examples with ready to use source codes (with output) to explain every topic. PREREQUISITES This guide assumes that the reader has a good knowledge of ABAP Workbench Fundamentals and has hands on experience of creating Report Programs as well as Module Pool Programs. AUTHER AUTHER: Vikrant Trivedi SAP Technical Consultant (ABAP + Web Dynpro + EP) COMPANY: VC ERP Consulting Pvt. Ltd. CREATED ON: 18 - April - 2008 CONTENTS Basic Terminology Classes Objects / Instances Attributes Methods Constructor Object Identity and Reference Semantics Visibility Events Inheritance Polymorphism Interfaces ALV Grid Control ALV Grid Control Using Events ALV Grid Control Using Field Catalogs BASIC TERMINOLOGY For a long time it was standard practice in software development to subdivide software systems according to the system's functions. Object-orientation takes another approach. Instead of concentrating on functions, the object-oriented approach concentrates on data abstractions using - so-called Classes. CLASSES Classes are the central element of object-orientation. A Class describes a general element or a general concept. Classes realize an abstract data type. Classes contain components like: Attributes, Methods and Events. These components are described later in this document. In ABAP Objects classes are made up of a definition and an implementation part. CLASS CL_CLASSNAME DEFINITION. ENDCLASS. CLASS CL_CLASSNAME IMPLEMENTATION.
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
ABAP OBJECTS - STEP-BY-STEP GUIDE
Added by Vikrant Trivedi, last edited by Vikrant Trivedi on Apr 28, 2008
SUMMARY
This is a step-by-step guide to learn ABAP Objects. Typically used to enable ABAP developers to place their first step into ABAP Objects. This guide includes examples with ready to use
source codes (with output) to explain every topic.
PREREQUISITES
This guide assumes that the reader has a good knowledge of ABAP Workbench Fundamentals and has hands on experience of creating Report Programs as well as Module Pool
Programs.
AUTHER
AUTHER: Vikrant Trivedi
SAP Technical Consultant
(ABAP + Web Dynpro + EP)
COMPANY: VC ERP Consulting Pvt. Ltd.
CREATED ON: 18 - April - 2008
CONTENTS
Basic Terminology
Classes
Objects / Instances
Attributes
Methods
Constructor
Object Identity and Reference Semantics
Visibility
Events
Inheritance
Polymorphism
Interfaces
ALV Grid Control
ALV Grid Control Using Events
ALV Grid Control Using Field Catalogs
BASIC TERMINOLOGY
For a long time it was standard practice in software development to subdivide software systems according to the system's functions. Object-orientation takes another approach. Instead
of concentrating on functions, the object-oriented approach concentrates on data abstractions using - so-called Classes.
CLASSES
Classes are the central element of object-orientation. A Class describes a general element or a general concept. Classes realize an abstract data type. Classes contain components like:
Attributes, Methods and Events. These components are described later in this document. In ABAP Objects classes are made up of a definition and an implementation part.
CLASS CL_CLASSNAME DEFINITION.
ENDCLASS.
CLASS CL_CLASSNAME IMPLEMENTATION.
ENDCLASS.
OBJECTS / INSTANCES
An object is nothing more than an instance of a Class.
Object - A person, place, thing, concept, or event that is applicable to the system at hand. Objects both know things (i.e., they have data) and they do things (i.e. they have functionality).
In ABAP Objects, objects are created with the command CREATE OBJECT. The developer receives an object reference as a result of its creation:
DATA: instance TYPE REF TO CL_CLASSNAME.
START-OF-SELECTION.
CREATE OBJECT instance.
ATTRIBUTES
Attributes can take on values within an object at runtime. The sum of all attributes and their values describes the state of an object.
Attributes can be defined as instance dependent as well as Class dependent. Class attributes (Class attributes are also called static attributes.) are not tied to a single instance, rather
they "belong" to all instances of the Class. These attributes exist only once in main memory. Instance-dependent attributes exist once per instance and are tied to a single instance.
In ABAP Objects you differentiate between instance-dependent and class-dependent attributes by means of the ABAP keywords DATA or CLASS-DATA to be used in the definition
As well as attributes, Classes have so-called Methods. While attributes describe the static structure of a class and its objects, Methods describe the behavior of objects within a class.
With the help of methods, the system provides operations, services and functions. Via methods, a user can manipulate the objects in a class or also the class itself. As for attributes,
there are instance-dependent as well as class-dependent (static) methods. ABAP Objects differentiate between instance-dependent and class-dependent methods via the ABAP
keywords METHODS or CLASS-METHODS used in the definition part.
In order to carry out instance-dependent (or instance-dependent) methods, the calling program needs a specific instance of the class. That is, the calling program must have a defined
reference variable that points to a specific instance. Class methods are not instance-dependent. They can be called at any time by a user. To see how the syntax calls the various
" CHECK IF ANY INSTANCE OF THIS CLASS HAS BEEN CREATED BEFORE
CALL METHOD CL_NAME=>IS_CLASS_INITIATED
IMPORTING
RE_BOOL = BOOL.
IF BOOL = CO_FALSE.
" CREATE INSTANCE OF THIS CLASS, IF NO INSTANCE EXIST
DATA: INSTANCE TYPE REF TO CL_NAME,
NAME TYPE TY_NAME.
CREATE OBJECT INSTANCE.
" SET VALUE FOR NAME ATTRIBUTE
CALL METHOD INSTANCE->SET_NAME
EXPORTING
IM_NAME = 'VIKRANT J. TRIVEDI'.
" GET VALUE OF NAME ATTRIBUTE
CALL METHOD INSTANCE->GET_NAME
IMPORTING
EX_NAME = NAME.
WRITE: / 'NAME : ' , NAME.
" CLEAR MEMORY OCCUPIED BY OBJECTS
CLEAR: INSTANCE.
ENDIF.
Program Output : 002
NAME : VIKRANT J. TRIVEDI
CONSTRUCTOR
Objects must be created at runtime (using CREATE OBJECT). With their creation they also get their own identity. However, there are no fixed attribute values linked to the identity. You
are probably already wondering how objects get to their initial state. How do objects recognize their initial attribute values?
TheConstructor concept exists specifically to answer this question. The constructor is a method which runs automatically during the creation of an object. The constructor allows you to
define IMPORTING-parameters.
In ABAP Objects you differentiate between instance-dependent and class-dependent constructors via the language elements METHODS{{ }}and CLASS-METHODS to be used in the
definition part and via their namesconstructor and CLASS_CONSTRUCTOR:
The class constructor is called by the first access to a class element (method, attribute, event, and object), the (instance) constructor by the creation of an object (CREATE OBJECT).
" CREATE INSTANCE OF THIS CLASS, IF NO INSTANCE EXISTS.
DATA: INSTANCE1 TYPE REF TO CL_NAME,
INSTANCE2 TYPE REF TO CL_NAME,
NAME1 TYPE TY_NAME,
NAME2 TYPE TY_NAME.
CREATE OBJECT INSTANCE1
EXPORTING
IM_NAME = 'VIKRANT J. TRIVEDI'.
CREATE OBJECT INSTANCE2
EXPORTING
IM_NAME = 'TULSI V. TRIVEDI'.
" GET VALUE OF NAME ATTRIBUTE
CALL METHOD INSTANCE1->GET_NAME
IMPORTING
EX_NAME = NAME1.
CALL METHOD INSTANCE2->GET_NAME
IMPORTING
EX_NAME = NAME2.
" DISPLAY ATTRIBUTES OF INSTANCE1
WRITE: 'ATTRIBUTES OF INSTANCE 1 : ',
/ 'COUNT : ', INSTANCE1->I_COUNT,
/ 'NAME : ' , NAME1.
SKIP.
SKIP.
" DISPLAY ATTRIBUTES OF INSTANCE2
WRITE: 'ATTRIBUTES OF INSTANCE 2 : ',
/ 'COUNT : ', INSTANCE2->I_COUNT,
/ 'NAME : ' , NAME2.
" CLEAR MEMORY OCCUPIED BY OBJECTS
CLEAR: INSTANCE1,
INSTANCE2.
Program Output : 003
ATTRIBUTES OF INSTANCE 1 :
COUNT : 10
NAME : VIKRANT J. TRIVEDI
ATTRIBUTES OF INSTANCE 2 :
COUNT : 10
NAME : TULSI V. TRIVEDI
OBJECT IDENTITY AND REFERENCE SEMANTICS
With the help of the previous examples, you have established that objects belonging to a class are not created by the simple definition of the class. Neither does the instruction DATA:
instance ref to CL_NAME creates an object. This instruction only creates a Reference, which in its initial state has the logical value INITIAL. Only with the instruction CREATE
OBJECTinstance is the memory area for a new object requested from the system. The reference instance then refers to the object which has just been created. (The
command CLEAR{{ instance. }}at this point means that the object, to which the reference variable refers, cannot be referenced. Therefore it can no longer be addressed in this program
run. A Garbage Collector running in the background ensures that the object is removed from memory.
This separates object-oriented implementation from classic implementation. With the classic DATA instruction, main memory is reserved (which might never be used) and is pre-allocated
the initial state of the relevant variable. With the "object-oriented" instruction DATA-x-TYPE-REF-TO, only the intention to create an object is expressed. The only storage space occupied
is for an object reference.
In addition, every object has its own identity. Two references, which refer to objects, are only identical if they refer to the same object. Similarity between the attribute values of these
objects is not the deciding factor. To get more idea about this see the following example.
WRITE 'This will never print, as instance1 refers to a
different object than instance2.'.
ENDIF.
" Attribute values are the same !!!
IF INSTANCE1->NAME = INSTANCE2->NAME.
WRITE 'Attribute values of instance1 and instace2 are same.'.
ENDIF.
INSTANCE3 = INSTANCE1.
IF INSTANCE3 = INSTANCE1.
WRITE 'Both references instance1 and instace3 refer to the
same object and are therefore identical.'.
ENDIF.
Program Output : 004
Attribute values of instance1 and instace2 are same.
Both references instance1 and instace3 refer to the same object and are therefore identical.
In the above program, the first IF-Query (IF }}INSTANCE1 = INSTANCE2{{.) via the object reference produces the value false, although both objects have the same attribute value
"VIKRANT". Note that in object-oriented languages the reference semantics apply for classes and their objects. Both objects have the attribute value {{NAME = }}VIKRANT, but they are
independent objects with their own identity. The references therefore refer to two different objects, although their attribute values are completely identical.
VISIBILITY
An important feature of object-orientation is the encapsulation of attributes and methods - ultimately of functionality - in classes. A class guarantees its user specific properties and
specific behavior. The sum of these properties is called the class interface. The Visibility mechanism defines the class interface which is available to the users.
There are three commonly defined types of visibility in object-oriented technology:
Public
The relevant class component (attribute, method, event etc.) is visible to all classes.
Protected
The relevant class component (attribute, method, event etc.) is visible to the class itself and all inheritors. (We will return to the terms Inheritor and Inheritance later in this document.)
Private
The relevant class component (attribute, method, event etc.) is only visible to the class itself.
" CREATE INSTANCE OF THIS CLASS, IF NO INSTANCE EXIST
DATA: INSTANCE TYPE REF TO CL_NAME,
NAME TYPE TY_NAME.
CREATE OBJECT INSTANCE.
" SET VALUE FOR NAME ATTRIBUTE
CALL METHOD INSTANCE->SET_NAME
EXPORTING
IM_NAME = 'VIKRANT J. TRIVEDI'.
" GET VALUE OF NAME ATTRIBUTE
CALL METHOD INSTANCE->GET_NAME
IMPORTING
EX_NAME = NAME.
WRITE: / 'NAME : ' , NAME.
" CLEAR MEMORY OCCUPIED BY OBJECTS
CLEAR: INSTANCE.
Program Output : 005
NAME : VIKRANT J. TRIVEDI
EVENTS
Events are recognized in particular by programming interfaces of the GUIs (Windows, Motif, etc.), for example, you can "ask" the GUI to trigger an event if the user moves the mouse
over a specific part of the screen. When the event occurs you are telling the GUI to change the shape of the mouse pointer.
Events allow for the loose coupling of components (classes or objects) in a system. The event trigger does not normally know at the time of coding who is going to react to the event.
Those components, which want to react to the event, register at the event runtime, in that they tell the runtime environment which method is to be executed when the event is raised. In
this way many components can register for an event.
Event handler methods can proceed synchronously as well as asynchronously. At present, ABAP Objects only supports synchronous calling of the event handler method.
" Register the event handlers for the corresponding/all
" instance/s.
SET HANDLER PROCESS_EVENT FOR ALL INSTANCES.
" Raise event OBJECT_CREATED.
RAISE EVENT OBJECT_CREATED EXPORTING EX_OBJ = ME.
"ME refers to current instance
ENDMETHOD. "CL_NAME
" EVENT HANDLER
METHOD PROCESS_EVENT.
WRITE: 'EVENT FIRED :', ME->MSG.
ENDMETHOD. "PROCESS_EVENT
ENDCLASS. "CL_NAME IMPLEMENTATION
DATA INSTANCE TYPE REF TO CL_NAME.
START-OF-SELECTION.
CREATE OBJECT INSTANCE.
CLEAR INSTANCE.
Program Output : 006
EVENT FIRED : OBJECT CREATED
In the previous program, instances of the Class CL_NAMEcreate an event OBJECT_CREATED. The class method PROCESS_EVENT processes this event. With the help of the constructor
the class registers the method PROCESS_EVENT at the event OBJECT_CREATED for all instances of the class CL_NAME. When an object is created for the class CL_NAME (CREATE
OBJECT instance.), the event OBJECT_CREATED is raised in the constructor. The consequence is that the method PROCESS_EVENT{{ }}is executed.
Program : 007
Code listing for: Z_007_EVENT2
Description: EVENT OF ONE CLASS HANDLED BY ANOTHER CLASS
In the above program, with the help of the class method initialize, the class CL_CLASS2 registers the method PROCESS_EVENT at the event OBJECT_CREATED for all instances of
the classCL_CLASS1. When an object is created for the class CL_CLASS1 (CREATE OBJECT instance.), the event OBJECT_CREATED is raised in the constructor. The consequence
is that the methodPROCESS_EVENT{{ }}belonging to the class CL_CLASS2 is executed.
INHERITANCE
Inheritance defines the relationship between classes, in which a class (subclass) uses the structure and behavior that has already been defined in one or more other classes
(superclasses). So simply this means "Inheritance is about reuse!".
Allow me to use a concrete example to explain inheritance: Collection.
A collection is any number of objects (more precisely object references). However, there could be many types of collection. Therefore, I will implement each type of collection as a class.
In principle this approach is correct. However, you will soon establish that all collections have several components in common like:
1. Each class requires a method in order to add objects to a collection.
2. Each class requires a method in order to delete objects from a collection.
3. Each class has a method which identifies the number of object references in the collection and so on.
Inheritance is the solution to this situation. You implement all of the similarities in the class which is Superclass. You then implement the individual types of collection in their own classes
which are Subclassesof the Superclass. As a subclass, these classes inherit all of the components of the Superclass. Attributes, methods and events are inherited. In addition, you can
implement additional attributes, methods and events in the subclass.
POLYMORPHISM
Polymorphism occurs, where classes implement the same functionality with different methods (one functionality, several methods but the same name). This can occur via an inheritance
relationship, in that the methods belonging to the superclass are redefined in the subclasses and implemented differently. ABAP Objects requires the method names to be the same and
the signature to be the same (signature = method interface).
Polymorphism can be achieved in 2 ways:
(1) Two independent classes implement methods with the same names and the same signature with the intention, that the methods should be called dynamically from a third location.
(2) A superclass implements a method, and in a subclass you want to re-implement the same method, as the superclass implementation is not suitable for the subclass.
The first scenario will not occur very often in ABAP Objects, as the interface concept was created precisely for such cases.
In the above example, I have partially implemented the class CL_COLLECTION and its inheritor class CL_NAME. The method ADD{{ }}belonging to the class CL_COLLECTION is redefined
by the method ADD{{ }}belonging to the class CL_NAME. In the method ADDbelonging to the CL_NAME the method ADD belonging to the superclass CL_COLLECTION is called via CALL
METHOD SUPER->ADD.
INTERFACES
TheInterface concept describes a class interface. You can define the same components in an interface that you can in classes, however without implementing them.
Classes can implement interfaces, and subsequently be addressed via these interfaces. This opens an additional mechanism of polymorphism, however without being dependent on
inheritance. This combination of classes with simple inheritance and interfaces is more highly regarded by many experts than full multiple inheritances.
In addition to object references (DATA: instance TYPE REF TO CL_CLASS) there are also Interface References (DATA: reference TYPE REF TO CL_INTERFACE). A class
which implements a specific interface can be addressed via this interface reference. Using such an interface reference, you can access the components defined in the interface. In this
way a user can view different classes through the 'spectacles' of an interface and address them in a uniform manner.
Interfaces therefore define specific, generic functionality. In contrast to classes, interfaces generally have not only many users, but also many implementers.
INTERFACE = INSTANCE1. " THIS ASSIGNATIN IS CALLED CASTING
CALL METHOD INTERFACE->DISPLAY.
CREATE OBJECT INSTANCE2.
INTERFACE = INSTANCE2.
CALL METHOD INTERFACE->DISPLAY.
Program Output : 009
METHOD IMPLEMENTED IN CLASS 1.
METHOD IMPLEMENTED IN CLASS 2.
ALV GRID CONTROL
The ALV Grid Control is a tool that you can use to display non-hierarchical lists in a uniform format. The list data is displayed as a table on the screen. This tool is very user-friendly: You
only have to carry out a minimum number of programming steps.
The ALV Grid Control has a number of interactive standard functions that list users frequently use, for example, printing, and export. Developers can hide these standard functions if they
wish. However, you can modify the implementations on an application-specific basis if required. You can also add your own functions to the application toolbar.
Application controls like ALV Grid Control, Tree Controls, and Picture Controls must be embedded in a Container Control, which in turn must be connected with the screen. Container
Controls form the technical connection between a screen and an application control. There are different types of container controls. All of these types encapsulate basic control functions
(for example, scroll bars).
In the following sections, we will work trough a standard case as an example: Positioning an ALV Grid Control in a screen area with a fixed size. To do this, an instance of each of the
global classes CL_GUI_CUSTOM_CON-
TAINER and CL_GUI_ALV_GRID must be generated.
For a basic standard display, it is enough to program the following steps:
1. Define a custom control area on your screen using the screen painter's graphical full screen editor.
1. Generate an instance of the CL_GUI_CUSTOM_CONTAINER class and give the constructor the name of the custom control area you have defined.
1. Generate an instance of the class CL_GUI_ALV_GRID and assign the constructor the reference to the container control instance you have just generated.
1. Call the SET_TABLE_FOR_FIRST_DISPLAY method of the Grid Control instance and assign it the internal standard table and application data.
If this method has a global line type, you can give it the name of this global structure. The field catalog will then be set up by the grid control instance itself.
If the contents of the internal table change during the rest of the program run, it is enough to call the method REFRESH_TABLE_DISPLAY in the corresponding dialog step, to update the
FORM GET_DATA USING VALUE(P_CARRID) TYPE SFLIGHT-CARRID.
IF P_CARRID IS INITIAL.
SELECT * FROM SFLIGHT INTO CORRESPONDING
FIELDS OF TABLE T_SFLIGHT.
ELSE.
SELECT * FROM SFLIGHT INTO CORRESPONDING
FIELDS OF TABLE IT_SFLIGHT
WHERE CARRID = P_CARRID.
ENDIF.
ENDFORM. "GET_DATA
ALV GRID CONTROL USING EVENTS
An ALV Grid Control can react to a user double-clicking the mouse button. One possible reaction is that a subsequent processing is triggered in which additional information is displayed.
The event DOUBLE_CLICK is caught using a handler method. A handler method can be either a class method (static method) or an object's instance method. If a class method is
defined as a handler method, there is no need to instantiate an object of the handling class, to use the method. To create a handler object for an event, you must first of all define a class.
This class has a public method (in the PUBLIC SECTION) that can react to an event. In the handler method's implementation, create the source text that will run when you trigger the
event. The method receives the information delivered by the event from the position of the mouse when the user executes a double-click, and in the control example, generates an
information message that displays the line and field where the mouse is clicked.
FORM GET_DATA USING VALUE(P_CARRID) TYPE SFLIGHT-CARRID.
IF P_CARRID IS INITIAL.
SELECT * FROM SFLIGHT INTO CORRESPONDING
FIELDS OF TABLE IT_SFLIGHT.
ELSE.
SELECT * FROM SFLIGHT INTO CORRESPONDING
FIELDS OF TABLE IT_SFLIGHT WHERE CARRID = P_CARRID.
ENDIF.
ENDFORM. "GET_DATA
ALV GRID CONTROL USING FIELD CATALOGS
The internal table with the data to be displayed can have a user-specific line type. In order for the proxy instance to satisfactorily format the data it receives during the screen output or
when a print list is created, it requires relevant information known as the field catalog.
You can have the proxy instance automatically generate the field catalog. For line types that are defined in the ABAP Dictionary, you only need to inform the proxy instance of the
structure's name in the ABAP Dictionary.
Alternatively, or in addition to this, you can provide the proxy instance with this display information using an additional internal table. For the sake of simplicity, we will call this additional
table a field catalog. The global data type of this internal table is LVC_T_FCAT. Its line type is LVC_S_FCAT.
Typical examples of where you need to transfer a field catalog include:
The internal table with data has a line type with a dictionary reference, but the display of the column position or heading is different.
The internal table has (exclusive or additional) columns that are not contained in a dictionary structure.
For each column in the data table that deviates from an underlying dictionary structure or is not available in a dictionary structure, the field catalog must contain a line that determines the
technical characteristics and other column format information.