Natural distinguishes two types of subroutines: inline subroutines which are defined directly in the program and external subroutines which are stored as separate objects outside the program (this is explained later in this tutorial).
You will now add an inline subroutine to your program which moves an
asterisk (*) to the new user-defined variable named #MARK
. This
subroutine will be invoked when an employee has 20 days of leave or more.
When you have completed the exercises below, your sample application will be structured as follows:
This document contains the following exercises:
You will now add the subroutine to your program.
To define the subroutine
Insert the following below the user-defined variable
#NAME-END
:
1 #MARK (A1)
This variable will be used by the subroutine. Therefore, it has to be defined first.
To define the subroutine, insert the following before the
END
statement:
DEFINE SUBROUTINE MARK-SPECIAL-EMPLOYEES MOVE '*' TO #MARK END-SUBROUTINE
When performed, this subroutine moves an asterisk (*) to
#MARK
.
Note:
Instead of using the statement MOVE '*' TO
#MARK
it is also possible to use the following variant of the
ASSIGN
or COMPUTE
statement: #MARK :=
'*'
.
Modify the DISPLAY
statement as follows:
DISPLAY NAME 3X DEPT 3X LEAVE-DUE 3X '>=20' #MARK
This displays a new column in your output. Its heading is ">=20". The column will contain an asterisk (*) if the corresponding employee has 20 days of leave or more.
Now that you have defined the inline subroutine, you can specify the corresponding code for performing it.
To perform the inline subroutine
Insert the following before the DISPLAY
statement:
IF LEAVE-DUE >= 20 THEN PERFORM MARK-SPECIAL-EMPLOYEES ELSE RESET #MARK END-IF
When an employee is found who has 20 days of leave or more,
the new subroutine named MARK-SPECIAL-EMPLOYEES
is performed. When
an employee has less than 20 days of leave, the content of #MARK
is reset to blank.
Your program should now look as follows:
DEFINE DATA LOCAL 1 #NAME-START (A20) 1 #NAME-END (A20) 1 #MARK (A1) 1 EMPLOYEES-VIEW VIEW OF EMPLOYEES 2 FULL-NAME 3 NAME (A20) 2 DEPT (A6) 2 LEAVE-DATA 3 LEAVE-DUE (N2) END-DEFINE * RP1. REPEAT * INPUT USING MAP 'MAP01' * IF #NAME-START = '.' THEN ESCAPE BOTTOM (RP1.) END-IF * IF #NAME-END = ' ' THEN MOVE #NAME-START TO #NAME-END END-IF * RD1. READ EMPLOYEES-VIEW BY NAME STARTING FROM #NAME-START ENDING AT #NAME-END * IF LEAVE-DUE >= 20 THEN PERFORM MARK-SPECIAL-EMPLOYEES ELSE RESET #MARK END-IF * DISPLAY NAME 3X DEPT 3X LEAVE-DUE 3X '>=20' #MARK * END-READ * IF *COUNTER (RD1.) = 0 THEN REINPUT 'No employees meet your criteria.' END-IF * END-REPEAT * DEFINE SUBROUTINE MARK-SPECIAL-EMPLOYEES MOVE '*' TO #MARK END-SUBROUTINE * END
Run the program.
In the resulting map, enter "JONES" and press ENTER.
The list of employees should now contain the additional column.
To return to the program editor, enter
EDIT
at the MORE
prompt.
Stow the program.
You can now proceed with the next exercises: Processing Rules and Helproutines.