%* HERE ARE TWO RULES: $ITEM-MAKER AND $TABLE-MAKER 601.
602.
% DEFINE $ITEM-MAKER( &MM, &DATANAME, &TAIL) 603.
% &II = 1 604.
% WHILE &II <= &MM 605.
02 &DATANAME+-&II &40+PIC &TAIL. 606.
% &II = &II + 1 607.
% END 608.
609.
% DEFINE $TABLE-MAKER( &MM, &NN, &TNAME, &INAME, &TAIL) 610.
% &II = 1 611.
% WHILE &II <= &MM 612.
02 &TNAME+-&II. 613.
% &JJ = 1 614.
% UNTIL &JJ > &NN 615.
% BEGIN 616.
03 &INAME+-&II+-&JJ &40+PIC &TAIL. 617.
% &JJ = &JJ + 1 618.
% &II = &II + 1 619.
% END 620.
621.
Lines 603-608:
The rule $ITEM-MAKER has three formal arguments; the rule call on line 634 supplies the values. % WHILE starts a loop that executes repeatedly while the value of &II is <= to the value of &MM. The loop generates the 02 TEST-ITEM data elements (see line 634 under Program output).
Note the two uses of the plus symbol in line 606. Used in &DATANAME+-&II, the plus concatenates the two variables, resulting in TEST-ITEM-1 for the first data item. On the next line, &II increments by one during each loop, resulting in TEST-ITEM-2 for the second data item, etc. The second use for the plus symbol places the value of PIC &TAIL in column 40 of the output for each TEST-ITEM.
Lines 610-620:
The rule $TABLE-MAKER has five formal arguments whose values are supplied by the rule call in the program on line 635.
% WHILE starts an outer loop that repeatedly executes lines 613-619 while the &II <= &MM. The outer loop generates the 02 data elements ENTRY-1, ENTRY-2, and ENTRY-3.
& UNTIL starts a nested, inner loop. Its subordinate statement block (lines 616-618) executes repeatedly until &JJ > &NN. The inner loop generates the 03 data elements for the outer loop 02s.
% BEGIN places the 03 data items in the output shifted left four spaces in the inner loop, so that they are indented two spaces from the 02 data items. Without % BEGIN, they would have the same indentation as the 02s. The whole outer and inner loop structure shifts as a unit, thus all lines retain their relative positioning.
Line 618 increments the inner loop variable &JJ. Line 619 increments the outer loop variable &II; to be part of the outer loop, it must be indented from the outer loop but not from the inner loop. The loops generate the multiple lines; output from both loops appear in lines 634-635.
% SET BLANK 622.
IDENTIFICATION DIVISION. 623.
PROGRAM-ID. EXAMPLE6. 624.
*SPECIAL CONSIDERATIONS. 625.
* DEMONSTRATE LOOPING. 626.
627.
--------------------------------------- 628.
--------------------------------------- 629.
630.
WORKING-STORAGE SECTION. 631.
632.
01 TEST-RECORD. 633.
$ITEM-MAKER( 12,'TEST-ITEM','S9(9) COMP SYNC VALUE -1') 634.
$TABLE-MAKER( 3, 4,'ENTRY','ITEM' 'X(4) VALUE SPACES') 635.
% &STR = 'MISSISSIPPI' 637.
% &SUB = 'IS' 638.
% &II = 0 639.
% REPEAT 640.
% &JJ = &INDEX( &STR, &SUB) 641.
% UNTIL &JJ = 0 642.
% &II = &II + 1 643.
% &JJ = &JJ + &LENGTH( &SUB) 644.
% &STR = &SUBSTR( &STR, &JJ) 645.
THE NUMBER OF 'IS' IN 'MISSISSIPPI' IS &II. 646.
647.
Line 622:
% SET BLANK makes all blank lines that follow appear in the output.
Lines 637-646:
The % REPEAT and % UNTIL structures use the built-in functions &INDEX, &LENGTH, and &SUBSTR to find the number of occurrences of the substring IS in the literal string MISSISSIPPI. Lines 641-645 execute repeatedly until &JJ = 0.
062300 IDENTIFICATION DIVISION. 623. 062400 PROGRAM-ID. EXAMPLE6. 624. 062500*SPECIAL CONSIDERATIONS. 625. 062600* DEMONSTRATE LOOPING. 626. 062700 627. 062800 ----------------------------------- 628. 062900 ----------------------------------- 629. 063000 630. 063100 WORKING-STORAGE SECTION. 631. 063200 632. 063300 01 TEST-RECORD. 633. 063400 02 TEST-ITEM-1 PIC S9(9) COMP SYNC VALUE -1. 634. 063402 02 TEST-ITEM-2 PIC S9(9) COMP SYNC VALUE -1. 623. 063404 02 TEST-ITEM-3 PIC S9(9) COMP SYNC VALUE -1. 634. 063406 02 TEST-ITEM-4 PIC S9(9) COMP SYNC VALUE -1. 634. 063408 02 TEST-ITEM-5 PIC S9(9) COMP SYNC VALUE -1. 634. 063410 02 TEST-ITEM-6 PIC S9(9) COMP SYNC VALUE -1. 634. 063412 02 TEST-ITEM-7 PIC S9(9) COMP SYNC VALUE -1. 634. 063414 02 TEST-ITEM-8 PIC S9(9) COMP SYNC VALUE -1. 634. 063416 02 TEST-ITEM-9 PIC S9(9) COMP SYNC VALUE -1. 634. 063418 02 TEST-ITEM-10 PIC S9(9) COMP SYNC VALUE -1. 634. 063420 02 TEST-ITEM-11 PIC S9(9) COMP SYNC VALUE -1. 634. 063422 02 TEST-ITEM-12 PIC S9(9) COMP SYNC VALUE -1. 634. 063500 02 ENTRY-1. 635. 063502 03 ITEM-1-1 PIC X(4) VALUE SPACES. 635. 063504 03 ITEM-1-2 PIC X(4) VALUE SPACES. 635. 063506 03 ITEM-1-3 PIC X(4) VALUE SPACES. 635. 063508 03 ITEM-1-4 PIC X(4) VALUE SPACES. 635. 063510 02 ENTRY-2. 635. 063512 03 ITEM-2-1 PIC X(4) VALUE SPACES. 635. 063514 03 ITEM-2-2 PIC X(4) VALUE SPACES. 635. 063516 03 ITEM-2-3 PIC X(4) VALUE SPACES. 635. 063518 03 ITEM-2-4 PIC X(4) VALUE SPACES. 635. 063520 02 ENTRY-3. 635. 063522 03 ITEM-3-1 PIC X(4) VALUE SPACES. 635. 063524 03 ITEM-3-2 PIC X(4) VALUE SPACES. 635. 063526 03 ITEM-3-3 PIC X(4) VALUE SPACES. 635. 063528 03 ITEM-3-4 PIC X(4) VALUE SPACES. 635. 063600 636. 064600 THE NUMBER OF 'IS' IN 'MISSISSIPPI' IS 2. 646. 064700 647.