Professional Documents
Culture Documents
Back | Contact |
Back to main menu
Public attributes
Private attributes
Instance attributes
Static attributes
Public methods
Private methods
Constructor method
Static constructor
Protected components
Polymorphism
Public attributes
Public attributes are defined in the PUBLIC section and can be viewed and
changed from outside the class. There is direct access to public attributes. As a
general rule, as few public attributes should be defined as possible.
PUBLIC SECTION.
DATA: Counter type i.
Private attributes
Private attributes are defined in the PRIVATE section. The can only be viewes
and changed from within the class. There is no direct access from outside the
class.
PRIVATE SECTION.
DATA: name(25) TYPE c,
planetype LIKE saplane-planetyp,
Instance attributes
There exist one instance attribute for each instance of the class, thus they exist
seperately for each object. Instance attributes are declared with the DATA
keyword.
Static attributes
Static attributes exist only once for each class. The data are the same for all
instances of the class, and can be used e.g. for instance counters. Static
attributes are defined with the keyword CLASS-DATA.
PRIVATE SECTION.
CLASS-DATA: counter type i,
Public methods
Can called from outside the class
PUBLIC SECTION.
METHODS: set_attributes IMPORTING p_name(25) TYPE c,
p_planetype LIKE saplane-planetyp,
Private methods
Can only be called from inside the class. They are placed in the PRIVATE section
of the class.
Constructor method
Implicitly, each class has an instance constructor method with the reserved name
constructor and a static constructor method with the reserved name
class_constructor.
The instance constructor is executed each time you create an object (instance)
with the CREATE OBJECT statement, while the class constructor is executed
exactly once before you first access a class.
The constructors are always present. However, to implement a constructor you
must declare it explicitly with the METHODS or CLASS-METHODS statements.
An instance constructor can have IMPORTING parameters and exceptions. You
must pass all non-optional parameters when creating an object. Static
constructors have no parameters.
Static constructor
The static constructor is always called CLASS_CONSTRUCTER, and is called
autmatically before the clas is first accessed, that is before any of the following
actions are executed:
Protected components
When we are talking subclassing and enheritance there is one more component
than Public and Private, the Protected component. Protected components can be
used by the superclass and all of the subclasses. Note that Subclasses cannot
access Private components.
Polymorphism
Polymorphism: When the same method is implemented differently in different
classes. This can be done using enheritance, by redefining a method from the
superclass in subclasses and implement it differently.
Syntax
Back | Contact |
Template for making a class
Template for calling a class
Subclass
Template for calling a class
Using af class as a parameter for a method
Interfaces
Events
*---------------------------------------------------*
Subclass
CLASS xxx DEFINITION INHERITING FROM yyy.
Interfaces
In ABAP interfaces are implemented in addition to, and independently of classes. An interface
only has a declaration part, and do not have visibillity sections. Components (Attributes, methods,
constants, types) can be defined the same way as in classes.
Interfaces are listed in the definition part lof the class, and must always be
in the PUBLIC SECTION.
Operations defined in the interface atre impemented as methods of the
class. All methods of the interface must be present in the
implementation part of the class.
Attributes, events, constants and types defined in the interface are
automatically available to the class carying out the implementation.
Interface components are adresse in the class by <interface
name>~<component name>
Examples
Back | Contact |
Back to main menu
Define, implement and use simple class
Use constructor to create an object with parameters
Subclassing
Polymorphism
Events
TYPE t_name
TYPE saplane-planetype,
ENDCLASS.
******************************************
* Implementation part
******************************************
CLASS lcl_airplane IMPLEMENTATION.
METHOD constructor.
*
Counts number of instances
n_o_airplanes = n_o_airplanes + 1.
ENDMETHOD.
METHOD set_attributes.
name
= p_name.
planetype = p_planetype.
ENDMETHOD.
METHOD display_attributes.
WRITE:/ 'Name:', name, 'Planetype:', planetype.
ENDMETHOD.
METHOD display_n_o_airplanes.
WRITE: / 'No. planes:', n_o_airplanes.
ENDMETHOD.
ENDCLASS.
REPORT zbc404_hf_maintain_airplanes .
INCLUDE zbc404_hf_lcl_airplane.
* Create reference to class lcl_airplane
DATA: airplane1 TYPE REF TO lcl_airplane,
airplane2 TYPE REF TO lcl_airplane.
START-OF-SELECTION.
* Create instance
CREATE OBJECT airplane1.
CALL METHOD: airplane1->display_n_o_airplanes.
CREATE OBJECT airplane2.
* Setting attributes using a method with parameters
CALL METHOD airplane1->set_attributes EXPORTING p_name
= 'Kurt'
p_planetype = 'MD80'.
END-OF-SELECTION.
* Using methods
CALL METHOD: airplane1->display_n_o_airplanes,
airplane1->display_attributes.
1
2
Planetype: MD80
importing p2_name
type t_name
p2_planetype TYPE saplane-planetype,
..... more code .......
CLASS lcl_airplane IMPLEMENTATION.
METHOD constructor.
name
= p2_name.
planetype = p2_planetype.
..... more code .......
START-OF-SELECTION.
CREATE OBJECT airplane1 exporting p2_name = 'Hansemand'
p2_planetype = 'Boing 747'.
Subclassing
This example uses a superclass LCL_AIRPLANE and subclasses it into
LCL_PASSENGER_AIRPLANE and LCL_CARGO_PLANE.
LCL_AIRPLANE has a method display_n_o_airplanes that displays the number
of object instances.
LCL_PASSENGER_AIRPLANE has the private instance attribute n_o_seats, and
redefines the superclass method display_attributes, so it also displays
n_o_seats.
LCL_CARGO_PLANE has the private instance attribute cargomax, and redefines
the superclass method display_attributes, so it also displays cargomax.
All instance attributes are provided by the cunstructor method.
Superclass LCL_AIRPLANE
***INCLUDE ZBC404_HF_LCL_AIRPLANE .
******************************************
* Definition part
******************************************
CLASS lcl_airplane DEFINITION.
*-----------------------------* Public section
*-----------------------------PUBLIC SECTION.
TYPES: t_name(25) TYPE c.
METHODS:
constructor
IMPORTING im_name
TYPE t_name
im_planetype TYPE saplane-planetype,
display_attributes.
Static methods
CLASS-METHODS:
display_n_o_airplanes.
ENDCLASS.
PRIVATE SECTION.
DATA: n_o_seats TYPE sflight-seatsmax.
ENDCLASS.
CLASS lcl_passenger_airplane IMPLEMENTATION.
METHOD constructor.
*
The constructor method of the superclass MUST be called withing the
*
construtor
CALL METHOD super->constructor
EXPORTING im_name
= im_name
im_planetype = im_planetype.
n_o_seats = im_n_o_seats.
*
ENDMETHOD.
The redefined display_attributes method
METHOD display_attributes.
CALL METHOD super->display_attributes.
WRITE: / 'No. seats:', n_o_seats.
ENDMETHOD.
ENDCLASS.
->
Result:
No. planes: 0
Name: LH505 Planetype: Boing 747
No. seats: 350
Name: AR13 Planetype: DC 3
Cargo max: 35,0000
No. planes: 2
Polymorphism
Polymorphism: When the same method is implemented differently in different
classes. This can be done using enheritance, by redefining a method from the
superclass in subclasses and implement it differently.
Classes:
lcl_airplane Superclass
lcl_cargo_airplane Subclass
lcl_passenger_airplane Subclass
ex_name = name.
ENDMETHOD.
METHOD create_a_new_flight.
DATA: wa_list_of_flights TYPE flight_list_type.
wa_list_of_flights-connid
= im_connid.
wa_list_of_flights-fldate
= im_fldate.
wa_list_of_flights-airplane = im_airplane.
IF im_seatsocc IS INITIAL.
wa_list_of_flights-cargo = im_cargo.
ELSE.
wa_list_of_flights-seatsocc = im_seatsocc.
ENDIF.
APPEND wa_list_of_flights TO list_of_flights.
ENDMETHOD.
METHOD add_a_new_airplane.
APPEND im_airplane TO list_of_airplanes.
ENDMETHOD.
METHOD display_airplanes.
DATA: l_airplane TYPE REF TO lcl_airplane.
LOOP AT list_of_airplanes INTO l_airplane.
CALL METHOD l_airplane->display_attributes.
ENDLOOP.
ENDMETHOD.
ENDCLASS.
REPORT zbc404_hf_main .
*******************************************************************
* This reprort uses class LCL_AIRPLNAE and subclasses
* LCL_CARGO_PLANE and LCL_PASSENGER_AIRPLANE and class LCL_CARRIER
*******************************************************************
* Super class for airplanes
INCLUDE zbc404_hf_lcl_airplane.
* Sub classes for airplanes
INCLUDE zbc404_hf_lcl_passenger_plane.
INCLUDE zbc404_hf_lcl_cargo_plane.
* Carrier class
INCLUDE zbc404_hf_lcl_carrier.
DATA:
* Type ref to classes
o_passenger_airplane TYPE REF TO lcl_passenger_airplane,
o_passenger_airplane2 TYPE REF TO lcl_passenger_airplane,
o_cargo_plane
TYPE REF TO lcl_cargo_plane,
o_cargo_plane2
TYPE REF TO lcl_cargo_plane,
o_carrier
TYPE REF TO lcl_carrier.
START-OF-SELECTION.
* Create objects
CREATE OBJECT o_passenger_airplane
EXPORTING
im_name
= 'LH505'
im_planetype = 'Boing 747'
im_n_o_seats = 350.
CREATE OBJECT o_passenger_airplane2
EXPORTING
im_name
= 'SK333'
im_planetype = 'MD80'
im_n_o_seats = 110.
CREATE OBJECT o_cargo_plane
EXPORTING
im_name
= 'AR13'
im_planetype = 'DC 3'
im_cargomax = 35.
CREATE OBJECT o_cargo_plane2
EXPORTING
im_name
= 'AFL124'
im_planetype = 'Iljutsin 2'
im_cargomax = 35000.
CREATE OBJECT o_carrier
EXPORTING im_name = 'Spritisch Airways'.
* Add passenger and cargo planes to the list of airplanes
CALL METHOD o_carrier->add_a_new_airplane
EXPORTING im_airplane = o_passenger_airplane.
CALL METHOD o_carrier->add_a_new_airplane
EXPORTING im_airplane = o_passenger_airplane2.
CALL METHOD o_carrier->add_a_new_airplane
EXPORTING im_airplane = o_cargo_plane.
CALL METHOD o_carrier->add_a_new_airplane
EXPORTING im_airplane = o_cargo_plane2.
* Display list of airplanes
call method o_carrier->display_airplanes.
Result:
Name: LH505
Planetype: Boing 747
No. seats:
350
Name: SK333
Planetype: MD80
No. seats:
110
Name: AR13
Planetype: DC 3
Cargo max:
35,0000
Name: AFL124
Planetype: Iljutsin 2
Cargo max:
35.000,0000
Events
Below is a simple example of how to implement an event.
REPORT zbc404_hf_events_5.
*---------------------------------------------------------------------*
*
CLASS lcl_dog DEFINITION
*---------------------------------------------------------------------*
CLASS lcl_dog DEFINITION.
PUBLIC SECTION.
*
Declare events
EVENTS:
dog_is_hungry
EXPORTING value(ex_time_since_last_meal) TYPE i.
METHODS:
constructor
IMPORTING im_name TYPE string,
set_time_since_last_meal
IMPORTING im_time TYPE i,
on_dog_is_hungry FOR EVENT dog_is_hungry OF lcl_dog
IMPORTING ex_time_since_last_meal.
ENDCLASS.
*---------------------------------------------------------------------*
*
CLASS lcl_dog IMPLEMENTATION
*---------------------------------------------------------------------*
CLASS lcl_dog IMPLEMENTATION.
METHOD constructor.
WRITE: / 'I am a dog and my name is', im_name.
ENDMETHOD.
METHOD set_time_since_last_meal.
IF im_time < 4.
SKIP 1.
WRITE: / 'You fool, I am not hungry yet'.
ELSE.
*
Subsrcribe for event:
*
set handler <Event handler method>
*
FOR <ref_sender>!FOR ALL INSTANCES [ACTIVATION <var>]
SET HANDLER on_dog_is_hungry FOR ALL INSTANCES ACTIVATION 'X'.
*
Raise event
RAISE EVENT dog_is_hungry
EXPORTING ex_time_since_last_meal = im_time.
ENDIF.
ENDMETHOD.
METHOD on_dog_is_hungry.
*
Event method, called when the event dog_is_hungry is raised
SKIP 1.
WRITE: / 'You son of a bitch. I have not eaten for more than',
ex_time_since_last_meal, ' hours'.
WRITE: / 'Give me something to eat NOW!'.
ENDMETHOD.
ENDCLASS.
*---------------------------------------------------------------------*
*
R E P O R T
*---------------------------------------------------------------------*
DATA: o_dog1 TYPE REF TO lcl_dog.
START-OF-SELECTION.
CREATE OBJECT o_dog1 EXPORTING im_name = 'Beefeater'.
CALL METHOD o_dog1->set_time_since_last_meal
EXPORTING im_time = 2.
* This method call will raise the event dog_is_hungy
* because time > 3
CALL METHOD o_dog1->set_time_since_last_meal
EXPORTING im_time = 5.
Result:
I am a dog and my name is Beefeater
You fool, I am not hungry yet
You son of a bitch. I have not eaten for more than 5 hours
Give me something to eat NOW!
Simple class
Inheritance and ploymorphism
Interfaces
Events
1. Simple class
This example shows how to create a simple employee class. The constructor
method is used to initialize number and name of thje employee when the object
is created. A display_employee method can be called to show the attributes of
the employee, and CLASS-METHOD dosplay_no_of_employees can be called to
show the total number of employees (Number of instances of the employee
class).
REPORT zbc404_hf_events_1.
*********************************************************************
* L C L _ E M P L O Y E E
*********************************************************************
*---- LCL Employee - Definition
CLASS lcl_employee DEFINITION.
PUBLIC SECTION.
*-------------------------------------------------------------------* The public section is accesible from outside
*-------------------------------------------------------------------TYPES:
BEGIN OF t_employee,
no TYPE i,
name TYPE string,
END OF t_employee.
METHODS:
constructor
IMPORTING im_employee_no TYPE i
im_employee_name TYPE string,
display_employee.
*
Class methods are global for all instances
CLASS-METHODS: display_no_of_employees.
PROTECTED SECTION.
*-------------------------------------------------------------------* The protecetd section is accesible from the class and its subclasses
*-------------------------------------------------------------------*
Class data are global for all instances
CLASS-DATA: g_no_of_employees TYPE i.
PRIVATE SECTION.
*-------------------------------------------------------------------* The private section is only accesible from within the classs
*-------------------------------------------------------------------DATA: g_employee TYPE t_employee.
ENDCLASS.
*--- LCL Employee - Implementation
CLASS lcl_employee IMPLEMENTATION.
METHOD constructor.
g_employee-no = im_employee_no.
g_employee-name = im_employee_name.
g_no_of_employees = g_no_of_employees + 1.
ENDMETHOD.
METHOD display_employee.
WRITE:/ 'Employee', g_employee-no, g_employee-name.
ENDMETHOD.
METHOD display_no_of_employees.
WRITE: / 'Number of employees is:', g_no_of_employees.
ENDMETHOD.
ENDCLASS.
************************************************************************
* R E P O R T
*********************************************************************
DATA: g_employee1 TYPE REF TO lcl_employee,
g_employee2 TYPE REF TO lcl_employee.
START-OF-SELECTION.
CREATE OBJECT g_employee1
EXPORTING im_employee_no = 1
im_employee_name = 'John Jones'.
CREATE OBJECT g_employee2
EXPORTING im_employee_no = 2
im_employee_name = 'Sally Summer'.
CALL METHOD g_employee1->display_employee.
CALL METHOD g_employee2->display_employee.
CALL METHOD g_employee2->display_no_of_employees.
Constructor
Add_Employee - Adds a new employee to the list of employees
Display_Employee_List - Displays all employees and there wage
Display_no_of_employees - Displays total number of employees
Note the use of CLASS-DATA to keep the list of employees and number of
employees the same from instance to instance.
Create subclasses lcl_bluecollar_employee and lcl_whitecollar_employee. The
calsses are identical, except for the redifinition of the add_employee method,
where the caclculation of wage is different.
Methodes:
The program
REPORT zbc404_hf_events_2 .
*******************************************************
* Super class LCL_CompanyEmployees
*******************************************************
CLASS lcl_company_employees DEFINITION.
PUBLIC SECTION.
TYPES:
BEGIN OF t_employee,
no TYPE i,
name TYPE string,
wage TYPE i,
END OF t_employee.
METHODS:
constructor,
add_employee
IMPORTING im_no
TYPE i
im_name TYPE string
im_wage TYPE i,
display_employee_list,
display_no_of_employees.
PRIVATE SECTION.
CLASS-DATA: i_employee_list TYPE TABLE OF t_employee,
no_of_employees TYPE i.
ENDCLASS.
*-- CLASS LCL_CompanyEmployees IMPLEMENTATION
CLASS lcl_company_employees IMPLEMENTATION.
METHOD constructor.
no_of_employees = no_of_employees + 1.
ENDMETHOD.
METHOD add_employee.
*
Adds a new employee to the list of employees
DATA: l_employee TYPE t_employee.
l_employee-no = im_no.
l_employee-name = im_name.
l_employee-wage = im_wage.
APPEND l_employee TO i_employee_list.
ENDMETHOD.
METHOD display_employee_list.
*
Displays all employees and there wage
DATA: l_employee TYPE t_employee.
WRITE: / 'List of Employees'.
LOOP AT i_employee_list INTO l_employee.
WRITE: / l_employee-no, l_employee-name, l_employee-wage.
ENDLOOP.
ENDMETHOD.
METHOD display_no_of_employees.
*
Displays total number of employees
SKIP 3.
WRITE: / 'Total number of employees:', no_of_employees.
ENDMETHOD.
ENDCLASS.
*******************************************************
* Sub class LCL_BlueCollar_Employee
*******************************************************
CLASS lcl_bluecollar_employee DEFINITION
INHERITING FROM lcl_company_employees.
PUBLIC SECTION.
METHODS:
constructor
IMPORTING im_no
TYPE i
im_name
TYPE string
im_hours
TYPE i
im_hourly_payment TYPE i,
add_employee REDEFINITION.
PRIVATE SECTION.
DATA:no
name
hours
hourly_payment
TYPE
TYPE
TYPE
TYPE
i,
string,
i,
i.
ENDCLASS.
*---- CLASS LCL_BlueCollar_Employee IMPLEMENTATION
CLASS lcl_bluecollar_employee IMPLEMENTATION.
METHOD constructor.
*
The superclass constructor method must be called from the subclass
*
constructor method
CALL METHOD super->constructor.
no = im_no.
name = im_name.
hours = im_hours.
hourly_payment = im_hourly_payment.
ENDMETHOD.
METHOD add_employee.
*
Calculate wage an call the superclass method add_employee to add
*
the employee to the employee list
DATA: l_wage TYPE i.
l_wage = hours * hourly_payment.
CALL METHOD super->add_employee
EXPORTING im_no = no
im_name = name
im_wage = l_wage.
ENDMETHOD.
ENDCLASS.
*******************************************************
* Sub class LCL_WhiteCollar_Employee
*******************************************************
CLASS lcl_whitecollar_employee DEFINITION
INHERITING FROM lcl_company_employees.
PUBLIC SECTION.
METHODS:
constructor
IMPORTING im_no
TYPE i
im_name
TYPE string
im_monthly_salary
TYPE i
im_monthly_deductions TYPE i,
add_employee REDEFINITION.
PRIVATE SECTION.
DATA:
no
TYPE i,
name
TYPE string,
monthly_salary
TYPE i,
monthly_deductions
TYPE i.
ENDCLASS.
*---- CLASS LCL_WhiteCollar_Employee IMPLEMENTATION
CLASS lcl_whitecollar_employee IMPLEMENTATION.
METHOD constructor.
*
The superclass constructor method must be called from the subclass
*
constructor method
CALL METHOD super->constructor.
no = im_no.
name = im_name.
monthly_salary = im_monthly_salary.
monthly_deductions = im_monthly_deductions.
ENDMETHOD.
METHOD add_employee.
*
Calculate wage an call the superclass method add_employee to add
*
the employee to the employee list
DATA: l_wage TYPE i.
l_wage = monthly_salary - monthly_deductions.
CALL METHOD super->add_employee
EXPORTING im_no = no
im_name = name
im_wage = l_wage.
ENDMETHOD.
ENDCLASS.
*******************************************************
* R E P O R T
*******************************************************
DATA:
* Object references
o_bluecollar_employee1 TYPE REF TO lcl_bluecollar_employee,
o_whitecollar_employee1 TYPE REF TO lcl_whitecollar_employee.
START-OF-SELECTION.
* Create bluecollar employee obeject
CREATE OBJECT o_bluecollar_employee1
EXPORTING im_no = 1
im_name = 'Gylle Karen'
im_hours = 38
im_hourly_payment = 75.
* Add bluecollar employee to employee list
CALL METHOD o_bluecollar_employee1->add_employee
EXPORTING im_no = 1
im_name = 'Gylle Karen'
im_wage = 0.
* Create whitecollar employee obeject
CREATE OBJECT o_whitecollar_employee1
EXPORTING im_no = 2
im_name = 'John Dickens'
im_monthly_salary = 10000
im_monthly_deductions = 2500.
* Add bluecollar employee to employee list
CALL METHOD o_whitecollar_employee1->add_employee
EXPORTING im_no = 1
im_name = 'Karen Johnson'
im_wage = 0.
* Display employee list and number of employees. Note that the result
* will be the same when called from o_whitecollar_employee1 or
* o_bluecolarcollar_employee1, because the methods are defined
* as static (CLASS-METHODS)
CALL METHOD o_whitecollar_employee1->display_employee_list.
CALL METHOD o_whitecollar_employee1->display_no_of_employees.
ENDCLASS.
*-- CLASS LCL_CompanyEmployees IMPLEMENTATION
CLASS lcl_company_employees IMPLEMENTATION.
METHOD constructor.
no_of_employees = no_of_employees + 1.
ENDMETHOD.
METHOD lif_employee~add_employee.
*
Adds a new employee to the list of employees
DATA: l_employee TYPE t_employee.
l_employee-no = im_no.
l_employee-name = im_name.
l_employee-wage = im_wage.
APPEND l_employee TO i_employee_list.
ENDMETHOD.
METHOD display_employee_list.
*
Displays all employees and there wage
DATA: l_employee TYPE t_employee.
WRITE: / 'List of Employees'.
LOOP AT i_employee_list INTO l_employee.
WRITE: / l_employee-no, l_employee-name, l_employee-wage.
ENDLOOP.
ENDMETHOD.
METHOD display_no_of_employees.
*
Displays total number of employees
SKIP 3.
WRITE: / 'Total number of employees:', no_of_employees.
ENDMETHOD.
ENDCLASS.
*******************************************************
* Sub class LCL_BlueCollar_Employee
*******************************************************
CLASS lcl_bluecollar_employee DEFINITION
INHERITING FROM lcl_company_employees.
PUBLIC SECTION.
METHODS:
constructor
IMPORTING im_no
TYPE i
im_name
TYPE string
im_hours
TYPE i
im_hourly_payment TYPE i,
lif_employee~add_employee REDEFINITION..
PRIVATE SECTION.
DATA:no
TYPE i,
name
TYPE string,
hours
TYPE i,
hourly_payment TYPE i.
ENDCLASS.
*---- CLASS LCL_BlueCollar_Employee IMPLEMENTATION
CLASS lcl_bluecollar_employee IMPLEMENTATION.
METHOD constructor.
*
The superclass constructor method must be called from the subclass
*
constructor method
CALL METHOD super->constructor.
no = im_no.
name = im_name.
hours = im_hours.
hourly_payment = im_hourly_payment.
ENDMETHOD.
METHOD lif_employee~add_employee.
*
Calculate wage an call the superclass method add_employee to add
*
the employee to the employee list
DATA: l_wage TYPE i.
l_wage = hours * hourly_payment.
CALL METHOD super->lif_employee~add_employee
EXPORTING im_no = no
im_name = name
im_wage = l_wage.
ENDMETHOD.
ENDCLASS.
*******************************************************
* Sub class LCL_WhiteCollar_Employee
*******************************************************
CLASS lcl_whitecollar_employee DEFINITION
INHERITING FROM lcl_company_employees.
PUBLIC SECTION.
METHODS:
constructor
IMPORTING im_no
TYPE i
im_name
TYPE string
im_monthly_salary
TYPE i
im_monthly_deductions TYPE i,
lif_employee~add_employee REDEFINITION.
PRIVATE SECTION.
DATA:
no
TYPE i,
name
TYPE string,
monthly_salary
TYPE i,
monthly_deductions
TYPE i.
ENDCLASS.
*---- CLASS LCL_WhiteCollar_Employee IMPLEMENTATION
CLASS lcl_whitecollar_employee IMPLEMENTATION.
METHOD constructor.
*
The superclass constructor method must be called from the subclass
*
constructor method
CALL METHOD super->constructor.
no = im_no.
name = im_name.
monthly_salary = im_monthly_salary.
monthly_deductions = im_monthly_deductions.
ENDMETHOD.
METHOD lif_employee~add_employee.
*
Calculate wage an call the superclass method add_employee to add
*
the employee to the employee list
DATA: l_wage TYPE i.
l_wage = monthly_salary - monthly_deductions.
CALL METHOD super->lif_employee~add_employee
EXPORTING im_no = no
im_name = name
im_wage = l_wage.
ENDMETHOD.
ENDCLASS.
*******************************************************
* R E P O R T
*******************************************************
DATA:
* Object references
o_bluecollar_employee1 TYPE REF TO lcl_bluecollar_employee,
o_whitecollar_employee1 TYPE REF TO lcl_whitecollar_employee.
START-OF-SELECTION.
* Create bluecollar employee obeject
CREATE OBJECT o_bluecollar_employee1
EXPORTING im_no = 1
im_name = 'Gylle Karen'
im_hours = 38
im_hourly_payment = 75.
* Add bluecollar employee to employee list
CALL METHOD o_bluecollar_employee1->lif_employee~add_employee
EXPORTING im_no = 1
im_name = 'Karen Johnson'
im_wage = 0.
* Create whitecollar employee obeject
CREATE OBJECT o_whitecollar_employee1
EXPORTING im_no = 2
im_name = 'John Dickens'
im_monthly_salary = 10000
im_monthly_deductions = 2500.
* Add bluecollar employee to employee list
CALL METHOD o_whitecollar_employee1->lif_employee~add_employee
EXPORTING im_no = 1
im_name = 'Gylle Karen'
im_wage = 0.
* Display employee list and number of employees. Note that the result
* will be the same when called from o_whitecollar_employee1 or
* o_bluecolarcollar_employee1, because the methods are defined
* as static (CLASS-METHODS)
CALL METHOD o_whitecollar_employee1->display_employee_list.
CALL METHOD o_whitecollar_employee1->display_no_of_employees.
4. Events
This is the same example as example 4. All changes are marked with red. There
have been no canges to the subclasses, only to the superclass and the report, sp
the code for th esubclasses is not shown.
For a simple example refer to Events in Examples.
REPORT zbc404_hf_events_4 .
*---------------------------------------------------------------------*
*
INTERFACE lif_employee
*---------------------------------------------------------------------*
INTERFACE lif_employee.
METHODS:
add_employee
IMPORTING im_no
TYPE i
METHOD display_no_of_employees.
Displays total number of employees
SKIP 3.
WRITE: / 'Total number of employees:', no_of_employees.
ENDMETHOD.
METHOD on_employee_added_to_list.
*
Event method
WRITE: / 'Employee added to list', ex_employee_name.
ENDMETHOD.
ENDCLASS.
*******************************************************
* Sub class LCL_BlueCollar_Employee
*******************************************************
CLASS lcl_bluecollar_employee DEFINITION
INHERITING FROM lcl_company_employees.
*
ENDCLASS.
CLASS lcl_bluecollar_employee IMPLEMENTATION.
ENDCLASS.
*******************************************************
* Sub class LCL_WhiteCollar_Employee
*******************************************************
CLASS lcl_whitecollar_employee DEFINITION
im_monthly_salary = 10000
im_monthly_deductions = 2500.
* Register event for o_whitecollar_employee1
SET HANDLER o_whitecollar_employee1->on_employee_added_to_list
FOR o_whitecollar_employee1.
* Add bluecollar employee to employee list
CALL METHOD o_whitecollar_employee1->lif_employee~add_employee
EXPORTING im_no = 1
im_name = 'Gylle Karen'
im_wage = 0.
* Display employee list and number of employees. Note that the result
* will be the same when called from o_whitecollar_employee1 or
* o_bluecolarcollar_employee1, because the methods are defined
* as static (CLASS-METHODS)
CALL METHOD o_whitecollar_employee1->display_employee_list.
CALL METHOD o_whitecollar_employee1->display_no_of_employees.
Result:
Employee added to list Karen Johnson
Employee added to list John Dickens
List of Employees
1 Karen Johnson 2.850
2 John Dickens 7.500
Total number of employees: 2
Syntax:
CALL METHOD cl_gui_cfw=>FLUSH
Create a report
In the start of selection event add: SET SCREEN '100'.
Create screen 100
Place a custom control on the screen by choosing the custom control icon
which can be recognized by the letter 'C', and give it the name
MYCONTAINER1.
5. To be able to exit the program, add a pushbutton with the function code
EXIT.
6. In the elements list enter the name OK_CODE for the element of type OK.
The code
REPORT sapmz_hf_controls1 .
CONSTANTS:
line_length TYPE i VALUE 254.
DATA: ok_code LIKE sy-ucomm.
DATA:
* Create reference to the custom container
custom_container TYPE REF TO cl_gui_custom_container,
* Create reference to the TextEdit control
ENDIF.
ENDMODULE.
" STATUS_0100
OUTPUT
The result
1. Create an input/output field on screen 100, where the event type can be
output. Name it EVENT_TYPE
The code:
REPORT sapmz_hf_controls1 .
CONSTANTS:
line_length TYPE i VALUE 254.
DATA: ok_code LIKE sy-ucomm.
DATA:
* Create reference to the custom container
custom_container TYPE REF TO cl_gui_custom_container,
* Create reference to the TextEdit control
editor TYPE REF TO cl_gui_textedit,
repid LIKE sy-repid.
**********************************************************************
* Impmenting events
**********************************************************************
DATA:
event_type(20) TYPE c,
* Internal table for events that should be registred
i_events TYPE cntl_simple_events,
* Structure for oneline of the table
wa_events TYPE cntl_simple_event.
*---------------------------------------------------------------------*
*
CLASS lcl_event_handler DEFINITION
*---------------------------------------------------------------------*
CLASS lcl_event_handler DEFINITION.
PUBLIC SECTION.
CLASS-METHODS:
catch_dblclick FOR EVENT dblclick
OF cl_gui_textedit IMPORTING sender.
ENDCLASS.
CLASS lcl_event_handler IMPLEMENTATION.
METHOD catch_dblclick.
event_type = 'Event DBLCLICK raised'.
ENDMETHOD.
ENDCLASS.
START-OF-SELECTION.
CLEAR wa_events. refresh i_events.
SET SCREEN '100'.
*---------------------------------------------------------------------*
*
MODULE USER_COMMAND_0100 INPUT
*
*---------------------------------------------------------------------*
MODULE user_command_0100 INPUT.
CASE ok_code.
WHEN 'EXIT'.
LEAVE TO SCREEN 0.
WHEN OTHERS.
*
Call the Dispacth method to initiate application event handling
call method cl_gui_cfw=>Dispatch.
ENDCASE.
ENDMODULE.
" USER_COMMAND_0100 INPUT
*&---------------------------------------------------------------------*
*&
Module STATUS_0100 OUTPUT
*&---------------------------------------------------------------------*
MODULE status_0100 OUTPUT.
* The TextEdit control shoul only be initialized the first time the
* PBO module executes
IF editor IS INITIAL.
repid = sy-repid.
*
Create obejct for custom container
CREATE OBJECT custom_container
EXPORTING
container_name
= 'MYCONTAINER1'
EXCEPTIONS
cntl_error
= 1
cntl_system_error
= 2
create_error
= 3
lifetime_error
= 4
lifetime_dynpro_dynpro_link = 5
others
= 6
.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE 'I' NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
*
Create obejct for the TextEditor control
CREATE OBJECT editor
EXPORTING
wordwrap_mode
=
cl_gui_textedit=>wordwrap_at_fixed_position
wordwrap_position
= line_length
wordwrap_to_linebreak_mode = cl_gui_textedit=>true
parent
= custom_container
EXCEPTIONS
error_cntl_create
= 1
error_cntl_init
= 2
error_cntl_link
= 3
error_dp_create
= 4
gui_type_not_supported = 5
others
= 6
.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE 'I' NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
*
Link the event handler method to the event and the
*
TextEdit control
SET HANDLER lcl_event_handler=>catch_dblclick FOR editor.
*
Register the event in the internal table i_events
wa_events-eventid = cl_gui_textedit=>event_double_click.
wa_events-appl_event = 'X'. "This is an application event
append wa_events to i_events.
*
Pass the table to the TextEdit control using method
*
set_registred_events
call method editor->set_registered_events
OUTPUT
Result:
When you double click on the TextEdit control, the input/ouput field should show
the text: Event DBLCLICK
Example 3: Event handling - System event
System events are passed irrespective of the flow-logic of the screen. To
implement a system event change the code from example 2 as follows:
Code:
CLASS lcl_event_handler IMPLEMENTATION.
METHOD catch_dblclick.
*--- event_type = 'Event DBLCLICK raised'.
* Reacting to the system event
call method cl_gui_cfw=>set_new_ok_code
exporting new_code = 'SHOW'.
INPUT
Result:
When you double clicks on the TextEdit control nothing happens, since the flowlogic of the screen an dthe fielde transport is ignore.
Example 4: Calling methods of the control
In this exercise a function that loads the texts of an internal table into the text
window, is implemented.
Steps:
Define anoterh pushbutton on the screen, that activates the method that fills the
TextEdit control. Give itname PUSHBUTTON_IMPORT and function code IMP.
Define a form CREATE_TEXTS that carries out the text import.
Only changes to the code in example 2 is show.
Code:
MODULE user_command_0100 INPUT.
CASE ok_code.
code.........
WHEN 'IMP'.
perform load_texts.
ENDCASE.
ENDMODULE.
" USER_COMMAND_0100 INPUT
*&---------------------------------------------------------------------*
*&
Form load_texts
*&---------------------------------------------------------------------*
* This form creates an internal table with texts. The the contents of
* the table is instered into the TextEdit control using method
* set_text_as_r3table
*----------------------------------------------------------------------*
FORM load_texts.
TYPES:
BEGIN OF t_texttable,
line(line_length) TYPE c,
END OF t_texttable.
DATA
i_texttable TYPE TABLE OF t_texttable.
* Create internal table with texts
APPEND 'This a method that fills the TextEdit control' TO i_texttable.
APPEND 'with a text.' TO i_texttable.
DO 10 TIMES.
APPEND 'hallo world !' TO i_texttable.
ENDDO.
* Load TextEdit control with texts
CALL METHOD editor->set_text_as_r3table
EXPORTING table = i_texttable.
IF sy-subrc > 0.
*
Display an error message
EXIT.
ENDIF.
* All methods that operates on controls are transferred to the frontend
* by a RFC calls. the method FLUSH is used to determine when this is
done.
CALL METHOD cl_gui_cfw=>flush.
IF sy-subrc > 0.
Display an error message
ENDIF.
ENDFORM.
" create_texts
*
*
*
*
*
*
*
*
*
ENDIF.
ENDMODULE.
" STATUS_0100 OUTPUT
*&---------------------------------------------------------------------*
*&
Form Load_texts
*&---------------------------------------------------------------------*
* This form loads the lines of the internal table i_texttable into
* the TextEdit control
*----------------------------------------------------------------------*
FORM Load_texts.
* Load TextEdit control with texts
CALL METHOD editor->set_text_as_r3table
EXPORTING table = i_texttable.
IF sy-subrc > 0.
*
Display an error message
EXIT.
ENDIF.
* All methods that operates on controls are transferred to the frontend
* by a RFC calls. the method FLUSH is used to determine when this is
* done.
CALL METHOD cl_gui_cfw=>flush.
IF sy-subrc > 0.
*
Display an error message
ENDIF.
g_loaded = 'X'.
ENDFORM.
" create_texts
This is very important when working e.g. with export parameters from a method,
as the parmeters will not be correct before the FLUSH method has been called.
The example below portects selected lines in the TextEdit and uses FLUSH to
ensure that the correct parameters are returned from method
GET_SELECTION_POS.
Note: Instead of using method PROTECT_LINES, the method
PROTECT_SELECTION could be used. This method does not need line
numbers or a FLUSH statement
Steps
Add a new pushbutton to the screen with the function code PROTECT.
Code
Add the following code to the example:
* Global variables
DATA:
from_idx TYPE i,
to_idx TYPE i,
index TYPE i.
MODULE user_command_0100 INPUT.
CASE ok_code.
code.......................
WHEN 'PROTECT'.
PERFORM protect.
.
.......................
ENDCASE.
*&---------------------------------------------------------------------*
*&
Form protect
*&---------------------------------------------------------------------*
* Protects marked lines in a TextEdit control
*----------------------------------------------------------------------*
FORM protect.
* Determine the area selected by the user
CALL METHOD editor->get_selection_pos
IMPORTING
from_line = from_idx
to_line
= to_idx
EXCEPTIONS
error_cntl_call_method = 1.
* Synchronize execution in the control with the ABAP program.
* Without this synchronization the variables from_idx and
* to_idx will have obsolutete values (The initial value for
* both, are 0)
CALL METHOD cl_gui_cfw=>flush.
IF sy-subrc > 0.
* Errormessage: Error in flush
ENDIF.
* Protect the selected lines
IF to_idx > from_idx.
to_idx = to_idx - 1.
ENDIF.
CALL METHOD editor->protect_lines
EXPORTING
from_line = from_idx
to_line
= to_idx.
* The PROTECT_SELECTION method could be used instead, eliminating the
* need of line numbers and the last FLUSH
* call method editor->protect_selection.
* Flush again to protect immidiately
CALL METHOD cl_gui_cfw=>flush.
IF sy-subrc > 0.
* Errormessage: Error in flush
ENDIF.
ENDFORM.
" protect
Code:
Insert global datadeclaration:
**********************************************************************
* Implementing a second Scratch TextEdit control
**********************************************************************
DATA:
scratch
TYPE REF TO cl_gui_textedit,
custom_container2 TYPE REF TO cl_gui_custom_container.
Result:
Examples
Simple example of how to implement an ALV grid
Complete code for the ALV grid example
Howto
Allow the user to save and reuse the layout
Integrate user defined functions in the grid toolbar
Set focus to the grid
Set the title of the grid
Customize the appearence of the grid
Setting and getting selected rows (Columns) and read line contents
Make an Exception field ( = Traffic lights)
Color a line<
Refresh grid display
Preface
Note that practical eaxmples of using the ALV grid can be found in development
class SLIS.
Example of the fdisplay of an ALV grid:
REPORT sapmz_hf_alv_grid .
TABLES: zsflight.
*-------------------------------------------------------------------* G L O B A L
I N T E R N A L
T A B L E S
*-------------------------------------------------------------------DATA: gi_sflight TYPE STANDARD TABLE OF sflight.
*-------------------------------------------------------------------* G L O B A L
D A T A
OUTPUT
*&--------------------------------------------------------------------*
*&
Form load_data_into_grid
*&--------------------------------------------------------------------*
*
text
*---------------------------------------------------------------------*
* --> p1
text
* <-- p2
text
*---------------------------------------------------------------------*
FORM load_data_into_grid.
* Read data from table SFLIGHT
SELECT *
FROM zsflight
INTO TABLE gi_sflight.
* Load data into the grid and display them
CALL METHOD go_grid->set_table_for_first_display
EXPORTING i_structure_name = 'SFLIGHT'
CHANGING it_outtab
= gi_sflight.
ENDFORM.
" load_data_into_grid
Code..........
* Load data into the grid and display them
l_layout-report = sy-repid.
CALL METHOD go_grid->set_table_for_first_display
EXPORTING i_structure_name = 'SFLIGHT'
is_variant
= l_layout
i_save
= 'A'
CHANGING it_outtab
= gi_
Replace existing functions in the toolbar or context men with user defined
functions
Add new functions to the toolbar or context menu
METHODS:
handle_toolbar FOR EVENT toolbar OF cl_gui_alv_grid
IMPORTING
e_object e_interactive,
handle_user_command FOR EVENT user_command OF
cl_gui_alv_grid
IMPORTING e_ucomm.
ENDCLASS.
*---------------------------------------------------------------------*
*
CLASS lcl_event_receiver IMPLEMENTATION
*---------------------------------------------------------------------*
CLASS lcl_event_receiver IMPLEMENTATION.
METHOD handle_toolbar.
* Event handler method for event toolbar.
CONSTANTS:
* Constants for button type
c_button_normal
TYPE i VALUE 0,
c_menu_and_default_button TYPE i VALUE 1,
c_menu
TYPE i VALUE 2,
c_separator
TYPE i VALUE 3,
c_radio_button
TYPE i VALUE 4,
c_checkbox
TYPE i VALUE 5,
c_menu_entry
TYPE i VALUE 6.
DATA:
ls_toolbar TYPE stb_button.
* Append seperator to the normal toolbar
CLEAR ls_toolbar.
MOVE c_separator TO ls_toolbar-butn_type..
APPEND ls_toolbar TO e_object->mt_toolbar.
* Append a new button that to the toolbar. Use E_OBJECT of
* event toolbar. E_OBJECT is of type
CL_ALV_EVENT_TOOLBAR_SET.
* This class has one attribute MT_TOOLBAR which is of table type
* TTB_BUTTON. The structure is STB_BUTTON
CLEAR ls_toolbar.
MOVE 'CHANGE'
TO ls_toolbar-function.
MOVE icon_change TO ls_toolbar-icon.
MOVE 'Change flight' TO ls_toolbar-quickinfo.
MOVE 'Change'
TO ls_toolbar-text.
MOVE ' '
TO ls_toolbar-disabled.
APPEND ls_toolbar TO e_object->mt_toolbar.
ENDMETHOD.
METHOD handle_user_command.
* Handle own functions defined in the toolbar
CASE e_ucomm.
WHEN 'CHANGE'.
LEAVE TO SCREEN 0.
ENDCASE.
ENDMETHOD.
ENDCLASS.
5) In the PBO module, crate object for event handler and set handler
CREATE OBJECT o_event_receiver.
SET HANDLER o_event_receiver->handle_user_command FOR
go_grid.
SET HANDLER o_event_receiver->handle_toolbar FOR go_grid.
6) In the PBO module after the CALL METHOD go_grid>set_table_for_first_display, raise event toolbar to
show the modified toolbar
CALL METHOD go_grid->set_toolbar_interactive.
Set focus to the grid
After CALL METHOD go_grid->set_table_for_first_display insert the following
stament:
CALL METHOD cl_gui_control=>set_focus EXPORTING control = go_grid.
Set the title of the grid
Fill the grid_title field of structure lvc_s_layo.
Note that the structure lvc_s_layo can be used for to customize the grid
appearance in many ways.
DATA:
* ALV control: Layout structure
gs_layout TYPE lvc_s_layo.
Setting and getting selected rows (Columns) and read line contents
You can read which rows of the grid that has been selected, and dynamic select
rows of the grid using methods get_selected_rows and set_selected_rows. There
are similiar methods for columns.
Note that the grid table always has the rows in the same sequence as displayed
in the grid, thus you can use the index of the selected row(s) to read the
information in the rows fronm the table. In the examples below the grid table is
named gi_sflight.
Data declaratrion:
DATA:
* Internal table for indexes of selected rows
gi_index_rows TYPE lvc_t_row,
* Information about 1 row
g_selected_row LIKE lvc_s_row.
Example 1: Reading index of selected row(s) and using it to read the grid table
1 Red
2 Yellow
3 Green
The name of the traffic light field is supplied inh the gs_layout-excp_fname used
by method set_table_for_first_display.
Example
* To color a line the structure of the table must include a Char 4 field
for color properties
Steps:
Create screen 100 with the ALV grid. Remeber to include an exit button
Add a change button to the ALV grid toolbar
Create screen 200 the Change screen
The screens:
The code:
REPORT sapmz_hf_alv_grid .
* Type pool for icons - used in the toolbar
TYPE-POOLS: icon.
TABLES: zsflight.
* To allow the declaration of o_event_receiver before the
* lcl_event_receiver class is defined, decale it as deferred in the
* start of the program
CLASS lcl_event_receiver DEFINITION DEFERRED.
*-------------------------------------------------------------------* G L O B A L
I N T E R N A L
T A B L E S
*-------------------------------------------------------------------*DATA: gi_sflight TYPE STANDARD TABLE OF sflight.
* To include a traffic light and/or color a line the structure of
the
* table must include fields for the traffic light and/or the color
TYPES: BEGIN OF st_sflight.
INCLUDE STRUCTURE zsflight.
*
Field for traffic light
TYPES: traffic_light TYPE c.
*
Field for line color
types: line_color(4) type c.
TYPES: END OF st_sflight.
TYPES: tt_sflight TYPE STANDARD TABLE OF st_sflight.
DATA: gi_sflight TYPE tt_sflight.
*-------------------------------------------------------------------* G L O B A L
D A T A
*-------------------------------------------------------------------DATA: ok_code
LIKE sy-ucomm,
*
Work area for internal table
g_wa_sflight
TYPE st_sflight,
*
ALV control: Layout structure
gs_layout
TYPE lvc_s_layo.
* Declare reference variables to the ALV grid and the container
DATA:
go_grid
TYPE REF TO cl_gui_alv_grid,
go_custom_container TYPE REF TO cl_gui_custom_container,
o_event_receiver
TYPE REF TO lcl_event_receiver.
DATA:
* Work area for screen 200
g_screen200 LIKE zsflight.
* Data for storing information about selected rows in the grid
DATA:
* Internal table
gi_index_rows TYPE lvc_t_row,
* Information about 1 row
g_selected_row LIKE lvc_s_row.
*-------------------------------------------------------------------* C L A S S E S
*-------------------------------------------------------------------CLASS lcl_event_receiver DEFINITION.
PUBLIC SECTION.
METHODS:
handle_toolbar FOR EVENT toolbar OF cl_gui_alv_grid
IMPORTING
e_object e_interactive,
handle_user_command FOR EVENT user_command OF cl_gui_alv_grid
IMPORTING e_ucomm.
ENDCLASS.
*---------------------------------------------------------------------*
*
CLASS lcl_event_receiver IMPLEMENTATION
*---------------------------------------------------------------------*
CLASS lcl_event_receiver IMPLEMENTATION.
*
*
METHOD handle_toolbar.
Event handler method for event toolbar.
CONSTANTS:
Constants for button type
c_button_normal
c_menu_and_default_button
c_menu
c_separator
c_radio_button
c_checkbox
c_menu_entry
DATA:
ls_toolbar
TYPE
TYPE
TYPE
TYPE
TYPE
TYPE
TYPE
i
i
i
i
i
i
i
VALUE
VALUE
VALUE
VALUE
VALUE
VALUE
VALUE
0,
1,
2,
3,
4,
5,
6.
TYPE stb_button.
*
*
*
*
METHOD handle_user_command.
Handle own functions defined in the toolbar
CASE e_ucomm.
WHEN 'CHANGE'.
PERFORM change_flight.
*
LEAVE TO SCREEN 0.
ENDCASE.
*
ENDMETHOD.
ENDCLASS.
*-------------------------------------------------------------------* S T A R T - O F - S E L E C T I O N.
*-------------------------------------------------------------------START-OF-SELECTION.
SET SCREEN '100'.
*&--------------------------------------------------------------------*
*&
Module USER_COMMAND_0100 INPUT
*&--------------------------------------------------------------------*
MODULE user_command_0100 INPUT.
CASE ok_code.
WHEN 'EXIT'.
LEAVE TO SCREEN 0.
ENDCASE.
ENDMODULE.
" USER_COMMAND_0100 INPUT
*&--------------------------------------------------------------------*
*&
Module STATUS_0100 OUTPUT
*&--------------------------------------------------------------------*
MODULE status_0100 OUTPUT.
DATA:
*
For parameter IS_VARIANT that is sued to set up options for
storing
*
the grid layout as a variant in method
set_table_for_first_display
l_layout TYPE disvariant,
*
Utillity field
l_lines TYPE i.
* After returning from screen 200 the line that was selected before
* going to screen 200, should be selected again. The table
gi_index_rows
* was the output table from the GET_SELECTED_ROWS method in form
* CHANGE_FLIGHT
DESCRIBE TABLE gi_index_rows LINES l_lines.
IF l_lines > 0.
CALL METHOD go_grid->set_selected_rows
EXPORTING
it_index_rows = gi_index_rows.
CALL METHOD cl_gui_cfw=>flush.
REFRESH gi_index_rows.
ENDIF.
*
*
*
*
*
*
Name of the exception field (Traffic light field) and the color
field + set the exception and color field of the table
gs_layout-excp_fname = 'TRAFFIC_LIGHT'.
gs_layout-info_fname = 'LINE_COLOR'.
*
*
*
*
*
" STATUS_0100
OUTPUT
*&--------------------------------------------------------------------*
*&
Module USER_COMMAND_0200 INPUT
*&--------------------------------------------------------------------*
*
text
*---------------------------------------------------------------------*
MODULE user_command_0200 INPUT.
CASE ok_code.
WHEN 'EXIT200'.
LEAVE TO SCREEN 100.
WHEN'SAVE'.
PERFORM save_changes.
ENDCASE.
ENDMODULE.
" USER_COMMAND_0200
INPUT
*&--------------------------------------------------------------------*
*&
Form get_data
*&--------------------------------------------------------------------*
*
text
*---------------------------------------------------------------------*
FORM get_data.
* Read data from table SFLIGHT
SELECT *
FROM zsflight
INTO TABLE gi_sflight.
ENDFORM.
" load_data_into_grid
*&--------------------------------------------------------------------*
*&
Form change_flight
*&--------------------------------------------------------------------*
* Reads the contents of the selected row in the grid, ans transfers
* the data to screen 200, where it can be changed and saved.
*---------------------------------------------------------------------*
FORM change_flight.
DATA:l_lines TYPE i.
REFRESH gi_index_rows.
CLEAR
g_selected_row.
* Read index of selected rows
CALL METHOD go_grid->get_selected_rows
IMPORTING
et_index_rows = gi_index_rows.
* Check if any row are selected at all. If not
* table gi_index_rows will be empty
DESCRIBE TABLE gi_index_rows LINES l_lines.
IF l_lines = 0.
CALL FUNCTION 'POPUP_TO_DISPLAY_TEXT'
EXPORTING
textline1 = 'You must choose a line'.
EXIT.
ENDIF.
*
*
*
*
" change_flight
*&--------------------------------------------------------------------*
*&
Form save_changes
*&--------------------------------------------------------------------*
* Changes made in screen 200 are written to the datbase table
* zsflight, and to the grid table gi_sflight, and the grid is
* updated with method refresh_table_display to display the changes
*---------------------------------------------------------------------*
FORM save_changes.
DATA: l_traffic_light TYPE c.
* Update traffic light field
* Update database table
MODIFY zsflight FROM g_screen200.
*
*
*
*
" save_changes
Create a screen
Place a custom container for the picture on the screen. Name the
container GO_PICTURE_CONTAINER.
General
See also Set up event handling for controls for a general example of event
handling
Note: To get a list of all icons, use program SHOWICON.
Add method
Meaning
cntb_btype_button
Button (normal)
cntb_btype_menu
Menu
cntb_btype_sep
Seperator
cntb_btype_group
Pushbutton group
cntb_btype_check
Checkbox
Menu entry
Add_button_group method
This method is used to add a list of buttons to the toolbar. The buttons are
defined in a table of type TTB_BUTTON, and it can be filled witha button
definitions using method fill_buttons_data_table of the cl_gui_toolbar class. The
button group is added to the toolbar using method add_button_group of the
toolbar object.
*
*
ENABLED
= 'X'
CHECKED
=''
fcode
=
that should be changed
* EXCEPTIONS
* CNTL_ERROR
=1
* CNTB_ERROR_FCODE = 2
* others
=3
.
Simple example
This example shows how to create a toolbar with a single Exit button, used to exit
the program.
Steps:
Code:
REPORT sapmz_hf_toolbar .
TYPE-POOLS: icon.
CLASS cls_event_handler DEFINITION DEFERRED.
* G L O B A L
D A T A
DATA:
ok_code
* Reference for conatiner
go_toolbar_container
* Reference for SAP Toolbar
go_toolbar
* Event handler
go_event_handler
LIKE sy-ucomm,
TYPE REF TO cl_gui_custom_container,
TYPE REF TO cl_gui_toolbar,
TYPE REF TO cls_event_handler.
* G L O B A L
T A B L E S
DATA:
* Table for registration of events. Note that a TYPE REF
* to cls_event_handler must be created before you can
* reference types cntl_simple_events and cntl_simple_event.
gi_events
TYPE cntl_simple_events,
* Workspace for table gi_events
g_event
TYPE cntl_simple_event.
*---------------------------------------------------------------------*
*---------------------------------------------------------------------*
*
........
*
*---------------------------------------------------------------------*
CLASS cls_event_handler DEFINITION.
PUBLIC SECTION.
METHODS:
on_function_selected
FOR EVENT function_selected OF cl_gui_toolbar
IMPORTING fcode,
on_dropdown_clicked
FOR EVENT dropdown_clicked OF cl_gui_toolbar
IMPORTING fcode posx posy.
ENDCLASS.
*---------------------------------------------------------------------*
*
CLASS cls_event_handler IMPLEMENTATION
*---------------------------------------------------------------------*
*
........
*
*---------------------------------------------------------------------*
CLASS cls_event_handler IMPLEMENTATION.
METHOD on_function_selected.
CASE fcode.
WHEN 'EXIT'.
LEAVE TO SCREEN 0.
ENDCASE.
ENDMETHOD.
*
METHOD on_dropdown_clicked.
Not implented yet
ENDMETHOD.
ENDCLASS.
START-OF-SELECTION.
SET SCREEN '100'.
*&--------------------------------------------------------------------*
*&
Module STATUS_0100 OUTPUT
*&--------------------------------------------------------------------*
*
text
*---------------------------------------------------------------------*
MODULE status_0100 OUTPUT.
IF go_toolbar_container IS INITIAL.
* Create container
CREATE OBJECT go_toolbar_container
EXPORTING
container_name = 'TOOLBAR_CONTAINER'.
* Create toolbar
CREATE OBJECT go_toolbar
EXPORTING
parent = go_toolbar_container.
* Add a button
CALL METHOD go_toolbar->add_button
EXPORTING fcode
= 'EXIT'
icon
= icon_system_end
is_disabled = ' '
butn_type
= cntb_btype_button
text
= 'Exit'
quickinfo
= 'Exit program'
is_checked = ' '.
"Function Code
"ICON name
"Disabled = X
"Type of button
"Text on button
"Quick info
"Button selected
ENDIF.
ENDMODULE.
Advanced example
" STATUS_0100
OUTPUT
The toolbar in this example contains an Exit button, two buttons that enables/and
disables a Print button, and a Menu button with a context menu.
The Disable/Enable buttons are of type Pushbutton group which makes them act
together, so when one of the buttons are selected (Down) the other is deselected
(Up).
Note that the context menu for the Menu button, must be created as a GUI
status. You can create an empty GUI sttaus of type context, and then manually
add menus. The context menu instance is created with type reference to class
cl_ctmenu.
Steps:
The screen:
In this screen shot the Disable button is activated which makes the Print button
disabled:
The code:
REPORT sapmz_hf_toolbar .
TYPE-POOLS: icon.
sy-ucomm,
context menu
i,
i,
REF TO cl_gui_custom_container,
REF TO cl_gui_toolbar,
REF TO cls_event_handler,
REF TO cl_ctmenu.
*--- G L O B A L
T A B L E S
DATA:
* Table for registration of events. Note that a TYPE REF
* to cls_event_handler must be created before you can
* reference types cntl_simple_events and cntl_simple_event
gi_events
TYPE cntl_simple_events,
* Workspace for table gi_events
g_event
TYPE cntl_simple_event,
* Table for button group
gi_button_group
TYPE ttb_button.
*---------------------------------------------------------------------*
*
CLASS
CLS_EVENT_HANDLER
*---------------------------------------------------------------------*
* This class handles the function_selected and dropdow_clicked
events
* from the toolbar
*---------------------------------------------------------------------*
CLASS cls_event_handler DEFINITION.
PUBLIC SECTION.
METHODS:
on_function_selected
FOR EVENT function_selected OF cl_gui_toolbar
IMPORTING fcode,
on_dropdown_clicked
FOR EVENT dropdown_clicked OF cl_gui_toolbar
IMPORTING fcode posx posy.
ENDCLASS.
CLASS cls_event_handler IMPLEMENTATION.
METHOD on_function_selected.
*-- Actions for buttons and context menus
CASE fcode.
WHEN 'EXIT'.
LEAVE TO SCREEN 0.
WHEN 'ENABLE'.
Enable the PRINT button
CALL METHOD go_toolbar->set_button_state
EXPORTING
enabled = 'X'
fcode
= 'PRINT'.
WHEN 'DISABLE'.
Disable the PRINT button
CALL METHOD go_toolbar->set_button_state
EXPORTING
enabled = ' '
fcode
= 'PRINT'.
Other menus and context menus
WHEN 'PRINT'.
CALL FUNCTION 'POPUP_TO_DISPLAY_TEXT'
EXPORTING
textline1 = 'Printing'.
WHEN 'CONTEXT1'.
CALL FUNCTION 'POPUP_TO_DISPLAY_TEXT'
EXPORTING
textline1 = 'Menu: Do something funny'.
WHEN 'CONTEXT2'.
CALL FUNCTION 'POPUP_TO_DISPLAY_TEXT'
EXPORTING
textline1 = 'Menu: Do something crazy'.
WHEN 'SUB1'.
CALL FUNCTION 'POPUP_TO_DISPLAY_TEXT'
EXPORTING
textline1 = 'Submenu: Do something boring'.
WHEN 'SUB2'.
CALL FUNCTION 'POPUP_TO_DISPLAY_TEXT'
EXPORTING
textline1 = 'Submenu: Do something good'.
ENDCASE.
ENDMETHOD.
METHOD on_dropdown_clicked.
*-- Fires when a dropdown menu is clicked. After it has been
*-- clicked a context menu is shown beside the button.
*
Save x
CLEAR:
g_posx
g_posy
*&--------------------------------------------------------------------*
*&
Module STATUS_0100 OUTPUT
*&--------------------------------------------------------------------*
*
text
*---------------------------------------------------------------------*
MODULE status_0100 OUTPUT.
IF go_toolbar_container IS INITIAL.
* Create container
CREATE OBJECT go_toolbar_container
EXPORTING
container_name = 'TOOLBAR_CONTAINER'.
* Create toolbar
CREATE OBJECT go_toolbar
EXPORTING
parent = go_toolbar_container.
* Add a button to the toolbar
PERFORM add_button.
* Add a button group to the toolbar
PERFORM add_button_group.
* Create event table. Note that the event ID must be found in the
* documentation of the specific control
CLEAR g_event. REFRESH gi_events.
g_event-eventid
= go_toolbar->m_id_function_selected.
g_event-appl_event = 'X'.
"This is an application event
APPEND g_event TO gi_events.
CLEAR g_event.
g_event-eventid
= go_toolbar->m_id_dropdown_clicked.
g_event-appl_event = 'X'.
APPEND g_event TO gi_events.
*
ENDIF.
ENDMODULE.
" STATUS_0100
OUTPUT
*&--------------------------------------------------------------------*
*&
Form add_button
*&--------------------------------------------------------------------*
* Adds one pushbutton to the toolbar
*---------------------------------------------------------------------*
FORM add_button.
CALL METHOD go_toolbar->add_button
EXPORTING fcode
= 'EXIT'
"Function Code
icon
= icon_system_end
"ICON name
is_disabled = ' '
"Disabled = X
butn_type
= cntb_btype_button "Type of button
text
= 'Exit'
"Text on button
quickinfo
= 'Exit program'
"Quick info
is_checked = ' '.
"Button selected
ENDFORM.
" add_button
*&--------------------------------------------------------------------*
*&
Form add_button_group
*&--------------------------------------------------------------------*
* Adds a button group to the toolbar.
* The buttons are added to table gi_button_group, and the table is
used
* as input to the Add_button_group method. Note that method
Fill_buttons
* is used to fill the table.
*---------------------------------------------------------------------*
FORM add_button_group.
* Add a seperator
CALL METHOD cl_gui_toolbar=>fill_buttons_data_table
EXPORTING
fcode
= 'SEP1'
icon
= ' '
butn_type
= cntb_btype_sep
CHANGING
data_table
= gi_button_group.
.
* Add an Enable button
CALL METHOD cl_gui_toolbar=>fill_buttons_data_table
EXPORTING
fcode
= 'ENABLE'
icon
butn_type
text
quickinfo
checked
CHANGING
data_table
= ' '
= cntb_btype_group
= 'Enable'
= 'Enable a print button'
= 'X'
= gi_button_group.
ENDFORM.
" add_button_group
*&--------------------------------------------------------------------*
*&
Form create_context_menu
*&--------------------------------------------------------------------*
* This form creates a context menu and a submenu for the menu
button.
*---------------------------------------------------------------------*
FORM create_context_menu.
DATA: lo_submenu TYPE REF TO cl_ctmenu.
IF go_context_menu IS INITIAL.
*-- Create context menu
CREATE OBJECT go_context_menu.
CALL METHOD go_context_menu->add_function
EXPORTING
fcode = 'CONTEXT1'
text = 'Do something funny'.
CALL METHOD go_context_menu->add_function
EXPORTING
fcode = 'CONTEXT2'
text = 'Do something crazy'.
CALL METHOD go_context_menu->add_separator.
*
" create_context_menu
The screen:
The code
SAPMZ_HF_HTML_CONTROL
REPORT sapmz_hf_html_control .
TYPE-POOLS: icon.
CLASS cls_event_handler DEFINITION DEFERRED.
*------------------------------------------------------------------* G L O B A L V A R I A B L E S
*------------------------------------------------------------------DATA:
ok_code
LIKE sy-ucomm,
* Container for html vieaer
go_html_container
TYPE REF TO cl_gui_custom_container,
* HTML viewer
go_htmlviewer
TYPE REF TO cl_gui_html_viewer,
* Container for toolbar
go_toolbar_container
TYPE REF TO cl_gui_custom_container,
* SAP Toolbar
go_toolbar
TYPE REF TO cl_gui_toolbar,
* Event handler for toolbar
go_event_handler
TYPE REF TO cls_event_handler,
* Variable for URL text field on screen 100
g_screen100_url_text(255) TYPE c,
g_screen100_display_url(255) TYPE c.
*------------------------------------------------------------------* I N T E R N A L
T A B L E S
*------------------------------------------------------------------DATA:
* Table for button group
gi_button_group
TYPE ttb_button,
* Table for registration of events. Note that a TYPE REF
* to cls_event_handler must be created before you can
* reference types cntl_simple_events and cntl_simple_event.
gi_events
TYPE cntl_simple_events,
* Workspace for table gi_events
g_event
TYPE cntl_simple_event.
START-OF-SELECTION.
SET SCREEN '100'.
*---------------------------------------------------------------------*
*
CLASS cls_event_handler DEFINITION
*--------------------------------------------------------------------* Handles events for the toolbar an the HTML viewer
*---------------------------------------------------------------------*
CLASS cls_event_handler DEFINITION.
PUBLIC SECTION.
METHODS:
* Handles method function_selected for the toolbar control
on_function_selected
FOR EVENT function_selected OF cl_gui_toolbar
IMPORTING fcode,
* Handles method navigate_complete for the HTML viewer control
on_navigate_complete
FOR EVENT navigate_complete OF cl_gui_html_viewer
IMPORTING url.
ENDCLASS.
CLASS cls_event_handler IMPLEMENTATION.
*&--------------------------------------------------------------------*
*&
Module STATUS_0100 OUTPUT
*&--------------------------------------------------------------------*
MODULE status_0100 OUTPUT.
IF go_html_container IS INITIAL.
* Create container for HTML viewer
CREATE OBJECT go_html_container
EXPORTING
container_name = 'HTML_CONTAINER'.
* Create HTML viewer
CREATE OBJECT go_htmlviewer
EXPORTING parent = go_html_container.
* Create container for toolbar
" STATUS_0100
OUTPUT
*&--------------------------------------------------------------------*
*&
Module USER_COMMAND_0100 INPUT
*&--------------------------------------------------------------------*
MODULE user_command_0100 INPUT.
* Handles the pushbutton for goto url
CASE ok_code.
WHEN 'GOTOURL'.
PERFORM goto_url.
ENDCASE.
ENDMODULE.
" USER_COMMAND_0100
INPUT
*&--------------------------------------------------------------------*
*&
Form add_button_group
*&--------------------------------------------------------------------*
* Adds a button group to the toolbar
*---------------------------------------------------------------------FORM add_button_group.
* BACK botton
CALL METHOD cl_gui_toolbar=>fill_buttons_data_table
EXPORTING
fcode
= 'BACK'
icon
= icon_arrow_left
butn_type
= cntb_btype_button
text
= ''
quickinfo
= 'Go back'
CHANGING
data_table
= gi_button_group.
* FORWARD botton
CALL METHOD cl_gui_toolbar=>fill_buttons_data_table
EXPORTING
fcode
= 'FORWARD'
icon
= icon_arrow_right
butn_type
= cntb_btype_button
text
= ''
quickinfo
= 'Go forward'
CHANGING
data_table
= gi_button_group.
* STOP button
CALL METHOD cl_gui_toolbar=>fill_buttons_data_table
EXPORTING
fcode
= 'STOP'
icon
= icon_breakpoint
butn_type
= cntb_btype_button
text
= ''
quickinfo
= 'Stop'
CHANGING
data_table
= gi_button_group.
* REFRESH button
CALL METHOD cl_gui_toolbar=>fill_buttons_data_table
EXPORTING
fcode
= 'REFRESH'
icon
= icon_refresh
butn_type
= cntb_btype_button
text
= ''
quickinfo
= 'Refresh'
CHANGING
data_table
= gi_button_group.
* Home button
CALL METHOD cl_gui_toolbar=>fill_buttons_data_table
EXPORTING
fcode
= 'HOME'
icon
= ''
butn_type
= cntb_btype_button
text
= 'Home'
quickinfo
= 'Home'
CHANGING
data_table
= gi_button_group.
* Separator
CALL METHOD cl_gui_toolbar=>fill_buttons_data_table
EXPORTING
fcode
= 'SEP1'
icon
= ' '
butn_type
= cntb_btype_sep
CHANGING
data_table
= gi_button_group.
* EXIT button
CALL METHOD cl_gui_toolbar=>fill_buttons_data_table
EXPORTING
fcode
= 'EXIT'
icon
= icon_close
butn_type
= cntb_btype_button
text
= ''
quickinfo
= 'Close porgram'
CHANGING
data_table
= gi_button_group.
* Add button group to toolbar
CALL METHOD go_toolbar->add_button_group
EXPORTING data_table = gi_button_group.
ENDFORM.
" add_button_group
*&--------------------------------------------------------------------*
*&
Form goto_url
*&--------------------------------------------------------------------*
* Calls method SHOW_URL to navigate to an URL
*---------------------------------------------------------------------FORM goto_url.
CALL METHOD go_htmlviewer->show_url
EXPORTING url = g_screen100_url_text.
ENDFORM.
" goto_url
Create a screen
Place dynpro button on the screen that opens the dialogbox. Name:
DIALOG_BUTTON. Caption: Show dialog box. Function code: DIALOG
Place another dynpro on the screen to exit the program. Name:
EXIT_BUTTON. Caption: Exit. Function code: EXIT.
Place a custom control on the screen for the dialog box. Name:
DIALOG_CONTAINER
Place a custom control on the screen for the toolbar control. Name:
TOOLBAR_CONTAINER
The screen:
The code:
REPORT sapmz_hf_dialogbox_cont.
* Icons for the toolbar
TYPE-POOLS:icon.
* Predefinition of the event handler class. Necessary if
* you want to make references to the class before it is defined
CLASS lcl_event_handler DEFINITION DEFERRED.
*---------------------------------------------------------------------* G L O B A L
D A T A
*---------------------------------------------------------------------DATA:
ok_code LIKE sy-ucomm,
* Dialog container
go_dialog_container
TYPE REF TO cl_gui_dialogbox_container,
* Splitter container
go_splitter_container
TYPE REF TO cl_gui_splitter_container,
* Event handler class
go_event_handler
TYPE REF TO lcl_event_handler,
* SAP Toolbar
go_toolbar
TYPE REF TO cl_gui_toolbar.
*----------------------------------------------------------------------
REF
*&--------------------------------------------------------------------*
*&
Module USER_COMMAND_0100 INPUT
*&--------------------------------------------------------------------*
* Handles the 2 dynpro pushbuttons on screen
*---------------------------------------------------------------------MODULE user_command_0100 INPUT.
CASE ok_code.
WHEN 'EXIT'.
LEAVE TO SCREEN 0.
WHEN 'DIALOG'.
PERFORM show_dialog_box.
ENDCASE.
ENDMODULE.
" USER_COMMAND_0100 INPUT
*&--------------------------------------------------------------------*
*&
Form show_dialog_box
*&--------------------------------------------------------------------*
* Performed when the Show dialog box button is pushed.
*---------------------------------------------------------------------*
FORM show_dialog_box.
IF go_dialog_container IS INITIAL.
*---------------------------------------------------------------------*
Create Dialogbox
*---------------------------------------------------------------------CREATE OBJECT go_dialog_container
EXPORTING
*
PARENT
=
width
= 400
height
= 150
style
= cl_gui_control=>ws_sysmenu
*
REPID
=
*
dynnr
= '100'
*
LIFETIME
= lifetime_default
top
= 100
left
= 350
caption
= 'My dialog box'
*
NO_AUTODEF_PROGID_DYNNR
=
*
METRIC
= 0
*
NAME
=
EXCEPTIONS
CNTL_ERROR
= 1
CNTL_SYSTEM_ERROR
= 2
CREATE_ERROR
= 3
LIFETIME_ERROR
= 4
LIFETIME_DYNPRO_DYNPRO_LINK = 5
EVENT_ALREADY_REGISTERED
= 6
ERROR_REGIST_EVENT
= 7
others
= 8.
IF sy-subrc <> 0.
*
Do some error handling..............
ENDIF.
id
height
= 1
= 90.
*
*
"Function Code
"ICON name
"Disabled = X
"Type of button
"Text on button
"Button selected
OTHERS = 1.
IF sy-subrc <> 0.
Do some error handling..............
ENDIF.
Set handler
SET HANDLER go_event_handler->on_function_selected
FOR go_toolbar.
* Synchronization
CALL METHOD cl_gui_cfw=>flush.
ENDIF.
ENDFORM.
" show_dialog_box