## 4.2.15.8.1.4  Example Implementation Using Interface IF\_APJ\_RT\_RUN
This example demonstrates the implementation of the concept of application jobs based on a class with interface IF\_APJ\_RT\_RUN .
To implement the business logic, the ABAP class will contain the following attributes that will also be visible on the selection screen when the application job is scheduled:
- The attribute NUMBERS which may contain value ranges
- The attribute NAMES which may contain multiple single values
- The attribute TEXT which may contain a single value only
- The boolean attributes NUMBERS\_AVAILABLE and NAMES\_AVAILABLE . The attribute NUMBERS will only be used if NUMBERS\_AVAILABLE is set, while the attribute NAMES will only be used if NAMES\_AVAILABLE is set.
- In addition, the class will contain the attribute ANOTHER\_PUBLIC\_ATTRIBUTE which will not be visible on the selection screen and is not filled by the application job framework
To implement these requirements, the ABAP class is created with the following definition part:
##  Sample Code
```
CLASS zcl_apj_demo_class DEFINITION PUBLIC FINAL CREATE PUBLIC . PUBLIC SECTION. INTERFACES if_apj_rt_run. INTERFACES if_apj_dt_defaults. TYPES: BEGIN OF ty_name_range, sign   TYPE c LENGTH 1, option TYPE c LENGTH 2, low    TYPE c LENGTH 50, high   TYPE c LENGTH 50, END OF ty_name_range. TYPES: ty_name_ranges TYPE STANDARD TABLE OF ty_name_range WITH EMPTY KEY. "! <p class="shorttext synchronized" lang="en">Numbers available</p> DATA numbers_available TYPE abap_bool VALUE abap_true. "! <p class="shorttext synchronized" lang="en">Numbers</p> DATA numbers TYPE RANGE OF i. "! <p class="shorttext synchronized" lang="en">Names available</p> DATA names_available TYPE abap_bool VALUE abap_true. "! <p class="shorttext synchronized" lang="en">Names</p> DATA names TYPE ty_name_ranges. "! <p class="shorttext synchronized" lang="en">Some text</p> DATA text TYPE c LENGTH 255. "! <p class="shorttext synchronized" lang="en">Public attribute which is not used on the selection screen</p> DATA another_public_attribute TYPE c LENGTH 10. ENDCLASS.
```
The class definition contains the following parts:
- The class implements the interface IF\_APJ\_RT\_RUN . This is necessary so the class can be used in an application job. In addition, it implements the interface IF\_APJ\_DT\_DEFAULTS to set default values of new templates, which is optional
- It contains the following public attributes:
- NUMBERS and NAMES are defined as ranges tables, because they may contain more than one value on the selection screen. The example implementation shows two possible ways how the ranges tables can be defined in the class
- Because field TEXT should only contain a single value on the selection screen, it's defined with an elementary datatype in the class
- The attributes NUMBERS\_AVAILABLE and NAMES\_AVAILABLE are defined as boolean type
- Finally, there is attribute ANOTHER\_PUBLIC\_ATTRIBUTE which may have any data type because it will not be visible on the selection screen
- All attributes have description texts which are defined via ABAP Doc comments
In the implementation part of the class, the method IF\_APJ\_RT\_RUN~EXECUTE must be implemented. This method is called by the application job framework when the application job is started. The method should contain the business logic that should be run by the application job.
## 
```
Sample Code METHOD if_apj_rt_run~execute. TRY.
```
```
DATA(l_log) = cl_bali_log=>create_with_header( header = cl_bali_header_setter=>create( object = 'ZOBJECT' subobject = 'ZSUBOBJECT' ) ). IF numbers_available = abap_true AND '42' IN numbers. l_log->add_item( item = cl_bali_free_text_setter=>create( severity = if_bali_constants=>c_severity_information text = '42 is in the number ranges' ) ). ENDIF. IF names_available = abap_true AND names IS NOT INITIAL. l_log->add_item( item = cl_bali_free_text_setter=>create( severity = if_bali_constants=>c_severity_status text = 'Some names are available' ) ). ENDIF. l_log->add_item( item = cl_bali_free_text_setter=>create( severity = if_bali_constants=>c_severity_status text = CONV #( text ) ) ). cl_bali_log_db=>get_instance( )->save_log_2nd_db_connection( log = l_log assign_to_current_appl_job = abap_true ). CATCH cx_bali_runtime INTO DATA(l_runtime_exception). " some error handling ENDTRY. ENDMETHOD.
```
In this example, the EXECUTE method creates an application log and assigns it to the current application job when the job is run. If the number 42 is in the ranges of field NUMBERS , a message is written into the log. Another message is written if field NAMES contains any entry. Finally, the content of field TEXT is put into the log. Attributes like NUMBERS , NAMES and TEXT can be used without any preparation, because they are automatically filled by the application job framework before the EXECUTE method is started.
After the class was implemented, a new catalog entry should be created for this class so that it can be used in an application job. Besides other settings, the catalog entry defines which parameters will be visible on the selection screen (which is visible when you schedule the job) and where and how these parameters are displayed.
A new catalog entry can be created in the ABAP development tools for Eclipse. It can be found under Other ABAP Repository Object → Application Jobs → Application Job Catalog Entry .
<!-- image -->
On the first screen, you select the name and a description text of the new application job catalog entry and the name of the class which is run within the job. It's the class which you just defined.
After you have created the application job catalog entry, you can start editing it:
<!-- image -->
In this demo implementation, the table with the parameters was automatically prefilled with all public attributes of the ABAP class which fulfil the requirements to be used in a catalog entry. The titles of the parameters were automatically filled with the description texts of the class attributes (which were defined via the ABAP Doc comments in the definition part of the class).
As a next step, you can change the properties of each parameter and define what the selection screen should look like. In this example, we will meet the following requirements:
- The parameters NUMBERS\_AVAILABLE and NUMBERS will be grouped. The group will get a header text. NUMBERS\_AVAILABLE will be a checkbox, and it will only be possible to enter values into NUMBERS if NUMBERS\_AVAILABLE is set.
- The parameters NAMES\_AVAILABLE and NAMES will be grouped. The group will get a header text. NAMES\_AVAILABLE will be a checkbox, and it will only be possible to enter values into NAMES if NAMES\_AVAILABLE is set.
- Both groups will be displayed side by side in the same section of the screen ( NUMBERS on the left side and NAMES on the right side). This section will get a header text, too.
- The parameter TEXT will get its own group (with group header) which is part of its own section (with section header).
- The parameter ANOTHER\_PUBLIC\_ATTRIBUTE is not relevant here and will not be displayed.
To implement these settings, you first define the sections of the selection screen:
<!-- image -->
There are two sections carrying the section header texts Section with Checkboxes and Section with Text Field . Because section SECTION\_1 is above section SECTION\_2 in this table, section SECTION\_1 is displayed above section SECTION\_2 on the selection screen.
Next, you define the groups:
<!-- image -->
Three groups were defined: The groups with title texts Group with Numbers and Group with Names were assigned to the first section, while the group with title text Group with Text Field was assigned to the second section. Because group GROUP\_1 is above group GROUP\_2 in this table, group GROUP\_1 is on the left side of the selection screen, while group GROUP\_2 is on the right side.
Finally, you can adapt the properties of the parameters according to the requirements:
<!-- image -->
The following parameter properties were changed in this example:
- The parameters NUMBERS\_AVAILABLE and NUMBERS were put into the first group of the first section ( Group = GROUP\_1 ). Because parameter NUMBERS\_AVAILABLE is above parameter NUMBERS in this table, it's displayed above parameter NUMBERS on the selection screen. Parameter NUMBERS is outputindented on the selection screen ( Indented = Yes ). In addition, it's only active on the screen if the parameter NUMBERS\_AVAILABLE is set ( Enabled By Parameter = NUMBERS\_AVAILABLE ). Parameter NUMBERS\_AVAILABLE is displayed as checkbox on the selection screen ( Screen Element = Checkbox ).
- The parameters NAMES\_AVAILABLE and NAMES were put into another group ( Group = GROUP\_2 ). The parameter NAMES is also output-indented ( Indented = yes ). In addition, it's only active on the selection screen if the parameter NAMES\_AVAILABLE is set ( Enabled By Parameter = NAMES\_AVAILABLE ). Parameter NAMES\_AVAILABLE is displayed as checkbox on the selection screen ( Screen Element = Checkbox ). Parameter NAMES only allows to enter multiple single values, but no value ranges ( Only Single Values = Yes ).
- The parameter TEXT is displayed in its own group ( Group = GROUP\_3 ). It's displayed as text editor with four lines ( Text Lines in Editor = 4 ).
- The parameter ANOTHER\_PUBLIC\_ATTRIBUTE is not relevant for the selection screen. Therefore, it was removed from the parameter list.
After you finished working on the catalog entry, don't forget to activate it.
After the application job catalog entry has been defined, you need to create an application job template. The template contains the parameter values that are displayed as default values on the selection screen. You can change these values before you schedule an application job. If you create a new template for your ABAP class, you may want that the parameters of the new template are already prefilled with default values. To determine these default values, the application job framework instantiates your class and calls the method IF\_APJ\_DT\_DEFAULTS~FILL\_ATTRIBUTE\_DEFAULTS . It then reads the values of the class attributes and uses them as default values of the template parameters. These default values can either
be set via the default values of the class attributes, via the CONSTRUCTOR of the class, or, if a more complex coding is required to determine these default values, you can also set them via the method IF\_APJ\_DT\_DEFAULTS~FILL\_ATTRIBUTE\_DEFAULTS :
```
 Sample Code METHOD if_apj_dt_defaults~fill_attribute_defaults. numbers = VALUE #( ( sign = 'I' option = 'BT' low = '1' high = '10' ) ( sign = 'I' option = 'BT' low = '91' high = '100' ) ). text = 'Some text'. ENDMETHOD.
```
Here, the default values of the attributes NUMBERS (which is a ranges table) and TEXT are set.
To create the new application job template, you can use the ABAP development tools for Eclipse. The template can be found under Other ABAP Repository Object → Application Jobs → Application Job Template .
<!-- image -->
On the first screen, you select the name and a description text of the new template and the name of the catalog entry on which the template is based. It's the catalog entry which you just created.
<!-- image -->
After you've created the application job template, the parameters of the template are prefilled with the values which you set in the ABAP class. In this example, the following parameters got a default value:
- NUMBERS\_AVAILABLE and NAMES\_AVAILABLE are both set to X because these default values are set in the definition part of the class.
- NUMBERS is set to the ranges 1 - 10 and 91 - 100 and TEXT is set to the text Some text because of the implementation of method FILL\_ATTRIBUTE\_DEFAULTS .
Now, you can change the parameter values if you want. After you've finished this, don't forget to activate the template. With the new template, you can start to schedule an application job. If you do this, you get the following selection screen which meets the requirements set before:
<!-- image -->