%* 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.