Until now, the subroutine MARK-SPECIAL-EMPLOYEES has been
                          defined within the program using a DEFINE SUBROUTINE statement.
                          You will now define the subroutine as a separate object external to the
                          program. 
               
When you have completed the exercises below, your sample application will consist of the following modules:

This document contains the following exercises:
Since the existing code from the program will be reused in the external subroutine, you will now save the program under a new name, change its type to subroutine and delete all lines that are not required.
The DEFINE SUBROUTINE statement of the external
                            subroutine is coded in the same way as the inline subroutine in the
                            program.
               
 To create an external subroutine
To create an external subroutine
Enter the following in the command line of the program editor.
SA SUBR01
The current program is saved with the new name
                                        SUBR01. The program is still shown in the editor.
                     
Load the newly created object into the editor by entering the following command:
E SUBR01
The object type is still program.
To change the program into an external subroutine, enter the following command:
SET TYPE S
where "S" denotes subroutine.
The object type which is shown in the screen changes to "Subroutine".
Use the line command D to delete all
                                        lines except the following:
                     
DEFINE DATA GLOBAL USING GDA01 LOCAL USING LDA01 END-DEFINE * DEFINE SUBROUTINE MARK-SPECIAL-EMPLOYEES MOVE '*' TO #MARK END-SUBROUTINE * END
It is also possible to delete a block of text. To do so, you have to proceed as follows:
At the beginning of the first line of the block, enter the
                                                  line command .X.
                           
At the beginning of the last line of the block, enter the
                                                  line command .Y.
                           
Press ENTER.
The block of lines to be deleted is now marked with
                                                  ".X" and ".Y". (If you
                                                  want to remove the marks, you can enter RESET in the
                                                  command line.)
                           
To delete the marked block, enter
                                                  DX-Y in the command line.
                           
Stow the subroutine.
The PERFORM statement invokes both internal and
                            external subroutines. When an internal subroutine is not found in the program,
                            Natural automatically tries to perform an external subroutine with the same
                            name. Note that Natural looks for the name that has been defined in the
                            subroutine code (that is: the subroutine name), not for the name that you have
                            specified when saving the subroutine (that is: the Natural object name).
               
Now that you have defined an external subroutine, you have to remove the inline subroutine (which has the same name as the external subroutine) from your program.
 To use the external subroutine in your program
To use the external subroutine in your program
Return to the program editor by entering the following in the command line of the editor in which the subroutine is currently shown.
E PGM01
Remove the following lines:
DEFINE SUBROUTINE MARK-SPECIAL-EMPLOYEES MOVE '*' TO #MARK END-SUBROUTINE
Your program should now look as follows:
DEFINE DATA
  GLOBAL USING GDA01  
  LOCAL USING LDA01
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
*
END 
                               Run the program.
Enter "JONES" as the starting name and press ENTER.
The resulting list should still show an asterisk for each employee who has 20 days of leave and more.
To return to the program editor, enter
                                        EDIT at the MORE prompt.
                     
Stow the program.
You can now proceed with the next exercises: Subprograms.