7.40.2 DOWHILE Examples

Executing a DOWHILE . . . ENDWHILE Routine

Executing DOWHILE . . . ENDWHILE to enter "n" records to a file

Using DEF_COND Values as DOWHILE parameters to make code easier to read and maintain

Comparing DOWHILE . . . ENDWHILE to the use of IF . . . GOTO . . . ENDIF

Executing DOWHILE . . . ENDWHILE routine with an Array Index

Executing a DOWHILE . . . ENDWHILE Routine

This is an example of the simple use of DOWHILE and ENDWHILE to count to 10 in a loop:

DEFINE     FIELD(#COUNT) REFFLD(#STD_NUM)

CHANGE     FIELD(#COUNT) TO(1)

DOWHILE    COND('#COUNT <= 10')

DISPLAY    FIELDS(#COUNT)

CHANGE     FIELD(#COUNT) TO('#COUNT + 1')

ENDWHILE

The DOWHILE command is similar in structure to the DOUNTIL command. However, there is one important difference. In the DOWHILE command, the condition is checked BEFORE doing the first iteration.

Executing DOWHILE . . . ENDWHILE to enter "n" records to a file

In this example, the details of 10 employees are inserted into a file:

GROUP_BY   NAME(#EMPDET) FIELDS(#EMPNO #SURNAME #SALARY)

DEFINE     FIELD(#COUNT) REFFLD(#STD_NUM)

DEF_LIST   NAME(#WORKER) FIELDS(#EMPNO #SURNAME #SALARY)

CHANGE     FIELD(#COUNT) TO(1)

DOWHILE    COND('#COUNT <= 10')

DISPLAY    FIELDS(#COUNT)

REQUEST    FIELDS(#EMPNO #SURNAME #SALARY)

ADD_ENTRY  TO_LIST(#WORKER)

CHANGE     FIELD(#COUNT) TO('#COUNT + 1')

ENDWHILE  

DISPLAY    BROWSELIST(#WORKER)

 

Using DEF_COND Values as DOWHILE parameters to make code easier to read and maintain

In this example, the COND parameter for the DOWHILE command is set by the DEF_COND command before DOWHILE is executed.

DEFINE     FIELD(#COUNT) REFFLD(#STD_NUM)

DEF_COND   NAME(*COUNT_TEN) COND('#COUNT <= 10')

CHANGE     FIELD(#COUNT) TO(1)

DOWHILE    COND(*COUNT_TEN)

DISPLAY    FIELDS(#COUNT)

CHANGE     FIELD(#COUNT) TO('#COUNT + 1')

ENDWHILE

The use of DEF_COND allows the programmer to give a complex condition a meaningful label  that expresses the reason behind the test of the condition. When subsequent programmers read the DOWHILE statement, the meaningful label will help them to understand the purpose of the statement. 

The use of DEF_COND also helps in situations where the same condition is referred to multiple times in the function. In this case it reduces the quantity of code and makes maintenance of the condition easier. For further details, refer to the 7.22 DEF_COND command.

Comparing DOWHILE . . . ENDWHILE to the use of IF . . . GOTO . . . ENDIF

In this example, we see the simple use of the DOWHILE .... ENDWHILE routine:

DOWHILE    COND('#A < B')

           << logic >>

           << logic >>

           << logic >>

ENDWHILE

Now compare this to the use of the IF .... GOTO .... ENDIF routine:

L01: IF         COND('#A < B')

           << logic >>

           << logic >>

           << logic >>

GOTO       LABEL(L01)

ENDIF

When compared, the use of the DOWHILE .... ENDWHILE routine is simpler and easier to read than when the IF .... GOTO .... ENDIF routine is used for a simple loop.

Executing DOWHILE . . . ENDWHILE routine with an Array Index

This example demonstrates the use of the DOWHILE .... ENDWHILE routine with an Array Index that groups 3 field values into an array, increments each one by 10%, then adds the resulting values up to display:

DEFINE     FIELD(#VAL1) REFFLD(#STD_NUM)

DEFINE     FIELD(#VAL2) REFFLD(#STD_NUM)

DEFINE     FIELD(#VAL3) REFFLD(#STD_NUM)

DEFINE     FIELD(#I1) REFFLD(#STD_NUM)

DEFINE     FIELD(#TOTAL) TYPE(*DEC) LENGTH(6) DECIMALS(2) LABEL(TOTAL) EDIT_CODE(3)

DEF_ARRAY  NAME(#ARR) INDEXES(#I1) OF_FIELDS(#VAL1 #VAL2 #VAL3)

CHANGE     FIELD(#TOTAL) TO(1)

CHANGE     FIELD(#I1) TO(1)

REQUEST    FIELDS(#VAL1 #VAL2 #VAL3)

DOWHILE    COND('#I1 <= 3')

CHANGE     FIELD(#ARR#I1) TO('#ARR#I1 * 1.1')

CHANGE     FIELD(#TOTAL) TO('#TOTAL + #ARR#I1')

CHANGE     FIELD(#I1) TO('#I1 + 1')

ENDWHILE  

DISPLAY FIELDS(#TOTAL)

Refer to the 7.20 DEF_ARRAY command for further reference to the array index.