You will now enhance your program by adding loops and labels.
When you have completed the exercises below, your sample application will still consist of the same modules as in the previous document:
This document contains the following exercises:
As it is now, the program terminates after it has displayed the map
and has shown the list. So that the user can display a new employees list
immediately, without restarting the program, you will now put the corresponding
program code into a REPEAT
loop.
To define a repeat loop
Insert the following below END-DEFINE
:
RP1. REPEAT
REPEAT
defines the start of the repeat loop.
RP1.
is a label which is used when leaving the repeat loop (this
is defined below).
Define the end of the repeat loop by inserting the following
before the END
statement:
END-REPEAT
Insert the following below INPUT USING MAP
'MAP01'
:
IF #NAME-START = '.' THEN ESCAPE BOTTOM (RP1.) END-IF
The IF
statement, which must be ended with
END-IF
, checks the content of the #NAME-START
field.
When a dot (.) is entered in this field, the ESCAPE BOTTOM
statement is used to leave the loop. Processing will continue with the first
statement following the loop (which is END
in this case).
By assigning a label to the loop (here RP1.
), you
can refer to this specific loop in the ESCAPE BOTTOM
statement.
Since loops may be nested, you should specify which loop you want to leave.
Otherwise, the program will only leave the innermost active loop.
Your program should now look as follows:
DEFINE DATA LOCAL 1 #NAME-START (A20) 1 #NAME-END (A20) 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 * READ EMPLOYEES-VIEW BY NAME STARTING FROM #NAME-START ENDING AT #NAME-END * DISPLAY NAME 3X DEPT 3X LEAVE-DUE * END-READ * END-REPEAT * END
Note:
For better readability, the content of the
REPEAT
loop has been indented.
Run the program.
In the resulting map, enter "JONES" in the field which prompts for a starting name and press ENTER.
In the resulting list, the employees with the name
"Jones" are shown. Press ENTER. Due to
the REPEAT
loop, the map is shown again. Now you can also see that
"JONES" has been entered as the ending
name.
To leave the map, enter a dot (.) in the field which prompts for a starting name and press ENTER. Do not forget to delete the remaining characters of the name which is still shown in this field.
Stow the program.
You will now define the message that is to be displayed when the user enters a starting name which cannot be found in the database.
To define the message that is to be displayed when the specified employee cannot be found
Add the label RD1.
to the line containing the
READ
statement so that it looks as follows:
RD1. READ EMPLOYEES-VIEW BY NAME
Insert the following below END-READ
:
IF *COUNTER (RD1.) = 0 THEN REINPUT 'No employees meet your criteria.' END-IF
To check the number of records found in the READ
loop, the system variable *COUNTER
is used. If its
contents equals 0 (that is: an employee with the specified name has not been
found), the message defined with the REINPUT
statement is
displayed at the bottom of your map.
To identify the READ
loop, you assign a label to
it (here RD1.
). Since a complex database access program can
contain many loops, you have to specify the loop to which you refer.
Your program should now look as follows:
DEFINE DATA LOCAL 1 #NAME-START (A20) 1 #NAME-END (A20) 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 * DISPLAY NAME 3X DEPT 3X LEAVE-DUE * END-READ * IF *COUNTER (RD1.) = 0 THEN REINPUT 'No employees meet your criteria.' END-IF * END-REPEAT * END
Run the program.
In the resulting map, enter a starting name which is not defined in the demo database (for example, "XYZ") and press ENTER.
Your message should now appear in the map.
To leave the map, enter a dot (.) in the field which prompts for a starting name and press ENTER. Do not forget to delete the remaining characters of the name which is still shown in this field.
Or:
Press ESC.
Stow the program.
You can now proceed with the next exercises: Inline Subroutines.