INDEX represents the sophisticated table navigation and array access mechanism within COBOL programming environments, providing optimized data structure traversal capabilities that enable efficient table processing, high-performance array manipulation, and streamlined data access patterns. This concept embodies advanced memory management principles by supporting automatic displacement calculations, optimized address arithmetic, and enhanced performance characteristics while facilitating complex table operations, multi-dimensional array processing, and comprehensive data structure navigation across enterprise applications requiring efficient bulk data processing and optimal system resource utilization.
123456789101112131415161718192021222324252627282930313233343536*> INDEX definition with INDEXED BY 01 EMPLOYEE-TABLE. 05 EMPLOYEE-ENTRY OCCURS 100 TIMES INDEXED BY EMP-IDX. 10 EMP-ID PIC 9(6). 10 EMP-NAME PIC X(30). 10 EMP-SALARY PIC 9(7)V99. *> Multiple indexes for the same table 01 SALES-TABLE. 05 SALES-ENTRY OCCURS 500 TIMES INDEXED BY SALES-IDX, BACKUP-IDX. 10 SALE-DATE PIC 9(8). 10 SALE-AMOUNT PIC 9(8)V99. 10 CUSTOMER-ID PIC X(10). *> INDEX operations using SET SET EMP-IDX TO 1 *> Set to first occurrence SET EMP-IDX UP BY 1 *> Increment by 1 SET EMP-IDX DOWN BY 5 *> Decrement by 5 SET EMP-IDX TO EMP-IDX + 10 *> Add 10 to current value *> Accessing table elements with INDEX MOVE "JOHN SMITH" TO EMP-NAME(EMP-IDX) MOVE 75000.00 TO EMP-SALARY(EMP-IDX) COMPUTE TOTAL-SALARY = TOTAL-SALARY + EMP-SALARY(EMP-IDX) *> INDEX in conditional statements IF EMP-IDX > 50 DISPLAY "Processing second half of table" END-IF *> INDEX in loops PERFORM VARYING EMP-IDX FROM 1 BY 1 UNTIL EMP-IDX > 100 PERFORM PROCESS-EMPLOYEE END-PERFORM.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334IDENTIFICATION DIVISION. PROGRAM-ID. INDEX-DEMONSTRATION. DATA DIVISION. WORKING-STORAGE SECTION. 01 CUSTOMER-MASTER-TABLE. 05 CUSTOMER-ENTRY OCCURS 1000 TIMES INDEXED BY CUST-IDX, SEARCH-IDX, TEMP-IDX. 10 CUST-ID PIC X(10). 10 CUST-NAME PIC X(30). 10 CUST-TYPE PIC X(10). 10 BALANCE PIC S9(8)V99. 10 LAST-ACTIVITY PIC 9(8). 01 PRODUCT-INVENTORY. 05 PRODUCT-ENTRY OCCURS 500 TIMES INDEXED BY PROD-IDX. 10 PRODUCT-CODE PIC X(15). 10 PRODUCT-NAME PIC X(40). 10 UNIT-PRICE PIC 9(6)V99. 10 QUANTITY-OH PIC 9(6). 10 REORDER-POINT PIC 9(5). 01 MONTHLY-SALES. 05 MONTH-DATA OCCURS 12 TIMES INDEXED BY MONTH-IDX. 10 MONTH-NAME PIC X(10). 10 SALES-AMOUNT PIC 9(10)V99. 10 SALES-COUNT PIC 9(6). 10 DAILY-SALES OCCURS 31 TIMES INDEXED BY DAY-IDX. 15 DAY-AMOUNT PIC 9(8)V99. 15 DAY-COUNT PIC 9(4). 01 WS-WORK-FIELDS. 05 WS-TOTAL-CUSTOMERS PIC 9(4) VALUE 0. 05 WS-FOUND-FLAG PIC X VALUE 'N'. 88 CUSTOMER-FOUND VALUE 'Y'. 88 CUSTOMER-NOT-FOUND VALUE 'N'. 05 WS-SEARCH-KEY PIC X(10). 05 WS-HIGH-BALANCE PIC S9(8)V99 VALUE 0. 05 WS-TEMP-BALANCE PIC S9(8)V99. PROCEDURE DIVISION. MAIN-PROCESSING. PERFORM INITIALIZE-TABLES PERFORM DEMONSTRATE-BASIC-INDEX-OPS PERFORM DEMONSTRATE-TABLE-SEARCH PERFORM DEMONSTRATE-TABLE-SORTING PERFORM DEMONSTRATE-MULTI-DIM-ACCESS PERFORM DEMONSTRATE-INDEX-ARITHMETIC STOP RUN. INITIALIZE-TABLES. DISPLAY "=== INITIALIZING TABLES WITH INDEX ===" *> Initialize customer table using index PERFORM VARYING CUST-IDX FROM 1 BY 1 UNTIL CUST-IDX > 1000 STRING "CUST" CUST-IDX DELIMITED BY SIZE INTO CUST-ID(CUST-IDX) STRING "CUSTOMER-" CUST-IDX DELIMITED BY SIZE INTO CUST-NAME(CUST-IDX) *> Alternate customer types IF FUNCTION MOD(CUST-IDX, 3) = 0 MOVE "PREMIUM" TO CUST-TYPE(CUST-IDX) ELSE IF FUNCTION MOD(CUST-IDX, 2) = 0 MOVE "STANDARD" TO CUST-TYPE(CUST-IDX) ELSE MOVE "BASIC" TO CUST-TYPE(CUST-IDX) END-IF END-IF *> Generate random-like balances COMPUTE BALANCE(CUST-IDX) = (FUNCTION MOD(CUST-IDX * 137, 50000)) + 100 COMPUTE LAST-ACTIVITY(CUST-IDX) = 20240101 + FUNCTION MOD(CUST-IDX, 365) END-PERFORM DISPLAY "Initialized " CUST-IDX " customer records" *> Initialize product table PERFORM VARYING PROD-IDX FROM 1 BY 1 UNTIL PROD-IDX > 500 STRING "PROD-" PROD-IDX DELIMITED BY SIZE INTO PRODUCT-CODE(PROD-IDX) STRING "PRODUCT NAME " PROD-IDX DELIMITED BY SIZE INTO PRODUCT-NAME(PROD-IDX) COMPUTE UNIT-PRICE(PROD-IDX) = (FUNCTION MOD(PROD-IDX * 73, 1000)) + 1 COMPUTE QUANTITY-OH(PROD-IDX) = FUNCTION MOD(PROD-IDX * 91, 1000) COMPUTE REORDER-POINT(PROD-IDX) = QUANTITY-OH(PROD-IDX) / 4 END-PERFORM DISPLAY "Initialized " PROD-IDX " product records" DISPLAY SPACES. DEMONSTRATE-BASIC-INDEX-OPS. DISPLAY "=== BASIC INDEX OPERATIONS ===" *> Set index to specific position SET CUST-IDX TO 1 DISPLAY "First customer: " CUST-NAME(CUST-IDX) DISPLAY "Balance: $" BALANCE(CUST-IDX) *> Move to specific position and display SET CUST-IDX TO 500 DISPLAY "Middle customer: " CUST-NAME(CUST-IDX) DISPLAY "Balance: $" BALANCE(CUST-IDX) *> Index arithmetic SET CUST-IDX UP BY 100 DISPLAY "Customer +100: " CUST-NAME(CUST-IDX) SET CUST-IDX DOWN BY 50 DISPLAY "Customer -50: " CUST-NAME(CUST-IDX) *> Find highest balance customer SET CUST-IDX TO 1 MOVE BALANCE(CUST-IDX) TO WS-HIGH-BALANCE SET TEMP-IDX TO CUST-IDX PERFORM VARYING CUST-IDX FROM 2 BY 1 UNTIL CUST-IDX > 1000 IF BALANCE(CUST-IDX) > WS-HIGH-BALANCE MOVE BALANCE(CUST-IDX) TO WS-HIGH-BALANCE SET TEMP-IDX TO CUST-IDX END-IF END-PERFORM DISPLAY "Highest balance customer: " CUST-NAME(TEMP-IDX) DISPLAY "Balance: $" WS-HIGH-BALANCE DISPLAY SPACES. DEMONSTRATE-TABLE-SEARCH. DISPLAY "=== TABLE SEARCH USING INDEX ===" *> Linear search for specific customer MOVE "CUST250" TO WS-SEARCH-KEY SET CUSTOMER-NOT-FOUND TO TRUE PERFORM VARYING CUST-IDX FROM 1 BY 1 UNTIL CUST-IDX > 1000 OR CUSTOMER-FOUND IF CUST-ID(CUST-IDX) = WS-SEARCH-KEY SET CUSTOMER-FOUND TO TRUE END-IF END-PERFORM IF CUSTOMER-FOUND DISPLAY "Found customer: " CUST-NAME(CUST-IDX) DISPLAY "Type: " CUST-TYPE(CUST-IDX) DISPLAY "Balance: $" BALANCE(CUST-IDX) ELSE DISPLAY "Customer " WS-SEARCH-KEY " not found" END-IF *> Search for premium customers MOVE 0 TO WS-TOTAL-CUSTOMERS PERFORM VARYING CUST-IDX FROM 1 BY 1 UNTIL CUST-IDX > 1000 IF CUST-TYPE(CUST-IDX) = "PREMIUM" ADD 1 TO WS-TOTAL-CUSTOMERS END-IF END-PERFORM DISPLAY "Total premium customers: " WS-TOTAL-CUSTOMERS DISPLAY SPACES. DEMONSTRATE-TABLE-SORTING. DISPLAY "=== TABLE SORTING WITH INDEX ===" *> Simple bubble sort using indexes (first 20 customers) PERFORM VARYING CUST-IDX FROM 1 BY 1 UNTIL CUST-IDX > 19 PERFORM VARYING SEARCH-IDX FROM 1 BY 1 UNTIL SEARCH-IDX > (20 - CUST-IDX) SET TEMP-IDX TO SEARCH-IDX SET TEMP-IDX UP BY 1 IF BALANCE(SEARCH-IDX) > BALANCE(TEMP-IDX) PERFORM SWAP-CUSTOMER-RECORDS END-IF END-PERFORM END-PERFORM DISPLAY "First 20 customers sorted by balance (ascending):" PERFORM VARYING CUST-IDX FROM 1 BY 1 UNTIL CUST-IDX > 20 DISPLAY CUST-IDX ": " CUST-NAME(CUST-IDX) " - $" BALANCE(CUST-IDX) END-PERFORM DISPLAY SPACES. SWAP-CUSTOMER-RECORDS. *> Swap records at SEARCH-IDX and TEMP-IDX positions MOVE CUST-ID(SEARCH-IDX) TO WS-SEARCH-KEY MOVE CUST-ID(TEMP-IDX) TO CUST-ID(SEARCH-IDX) MOVE WS-SEARCH-KEY TO CUST-ID(TEMP-IDX) MOVE CUST-NAME(SEARCH-IDX) TO WS-SEARCH-KEY MOVE CUST-NAME(TEMP-IDX) TO CUST-NAME(SEARCH-IDX) MOVE WS-SEARCH-KEY TO CUST-NAME(TEMP-IDX) MOVE BALANCE(SEARCH-IDX) TO WS-TEMP-BALANCE MOVE BALANCE(TEMP-IDX) TO BALANCE(SEARCH-IDX) MOVE WS-TEMP-BALANCE TO BALANCE(TEMP-IDX). DEMONSTRATE-MULTI-DIM-ACCESS. DISPLAY "=== MULTI-DIMENSIONAL INDEX ACCESS ===" *> Initialize monthly sales data PERFORM VARYING MONTH-IDX FROM 1 BY 1 UNTIL MONTH-IDX > 12 EVALUATE MONTH-IDX WHEN 1 MOVE "JANUARY" TO MONTH-NAME(MONTH-IDX) WHEN 2 MOVE "FEBRUARY" TO MONTH-NAME(MONTH-IDX) WHEN 3 MOVE "MARCH" TO MONTH-NAME(MONTH-IDX) WHEN 4 MOVE "APRIL" TO MONTH-NAME(MONTH-IDX) WHEN 5 MOVE "MAY" TO MONTH-NAME(MONTH-IDX) WHEN 6 MOVE "JUNE" TO MONTH-NAME(MONTH-IDX) WHEN 7 MOVE "JULY" TO MONTH-NAME(MONTH-IDX) WHEN 8 MOVE "AUGUST" TO MONTH-NAME(MONTH-IDX) WHEN 9 MOVE "SEPTEMBER" TO MONTH-NAME(MONTH-IDX) WHEN 10 MOVE "OCTOBER" TO MONTH-NAME(MONTH-IDX) WHEN 11 MOVE "NOVEMBER" TO MONTH-NAME(MONTH-IDX) WHEN 12 MOVE "DECEMBER" TO MONTH-NAME(MONTH-IDX) END-EVALUATE *> Initialize daily sales for each month PERFORM VARYING DAY-IDX FROM 1 BY 1 UNTIL DAY-IDX > 31 COMPUTE DAY-AMOUNT(MONTH-IDX, DAY-IDX) = (FUNCTION MOD((MONTH-IDX * DAY-IDX * 123), 10000)) + 500 COMPUTE DAY-COUNT(MONTH-IDX, DAY-IDX) = FUNCTION MOD((MONTH-IDX * DAY-IDX * 7), 50) + 1 END-PERFORM *> Calculate monthly totals MOVE 0 TO SALES-AMOUNT(MONTH-IDX) MOVE 0 TO SALES-COUNT(MONTH-IDX) PERFORM VARYING DAY-IDX FROM 1 BY 1 UNTIL DAY-IDX > 31 ADD DAY-AMOUNT(MONTH-IDX, DAY-IDX) TO SALES-AMOUNT(MONTH-IDX) ADD DAY-COUNT(MONTH-IDX, DAY-IDX) TO SALES-COUNT(MONTH-IDX) END-PERFORM END-PERFORM *> Display quarterly summaries DISPLAY "Q1 Sales Summary:" PERFORM VARYING MONTH-IDX FROM 1 BY 1 UNTIL MONTH-IDX > 3 DISPLAY " " MONTH-NAME(MONTH-IDX) ": $" SALES-AMOUNT(MONTH-IDX) END-PERFORM DISPLAY "Best day in March:" SET MONTH-IDX TO 3 MOVE 0 TO WS-HIGH-BALANCE PERFORM VARYING DAY-IDX FROM 1 BY 1 UNTIL DAY-IDX > 31 IF DAY-AMOUNT(MONTH-IDX, DAY-IDX) > WS-HIGH-BALANCE MOVE DAY-AMOUNT(MONTH-IDX, DAY-IDX) TO WS-HIGH-BALANCE MOVE DAY-IDX TO WS-TOTAL-CUSTOMERS END-IF END-PERFORM DISPLAY " Day " WS-TOTAL-CUSTOMERS ": $" WS-HIGH-BALANCE DISPLAY SPACES. DEMONSTRATE-INDEX-ARITHMETIC. DISPLAY "=== INDEX ARITHMETIC OPERATIONS ===" *> Set indexes to specific positions SET CUST-IDX TO 100 SET SEARCH-IDX TO 200 SET TEMP-IDX TO 300 DISPLAY "Initial positions:" DISPLAY " CUST-IDX: " CUST-IDX DISPLAY " SEARCH-IDX: " SEARCH-IDX DISPLAY " TEMP-IDX: " TEMP-IDX *> Index calculations and movements SET CUST-IDX UP BY 50 SET SEARCH-IDX DOWN BY 25 SET TEMP-IDX TO TEMP-IDX + 100 DISPLAY "After arithmetic:" DISPLAY " CUST-IDX: " CUST-IDX DISPLAY " SEARCH-IDX: " SEARCH-IDX DISPLAY " TEMP-IDX: " TEMP-IDX *> Index comparisons IF CUST-IDX > SEARCH-IDX DISPLAY "CUST-IDX is greater than SEARCH-IDX" END-IF IF TEMP-IDX > CUST-IDX AND TEMP-IDX > SEARCH-IDX DISPLAY "TEMP-IDX has the highest value" END-IF *> Copy index values SET SEARCH-IDX TO CUST-IDX DISPLAY "After copying CUST-IDX to SEARCH-IDX: " SEARCH-IDX DISPLAY SPACES. *> Advanced index manipulation examples ADVANCED-INDEX-OPERATIONS. *> Index-based table processing with multiple indexes SET CUST-IDX TO 1 SET SEARCH-IDX TO 1 PERFORM UNTIL CUST-IDX > 1000 *> Process current customer IF CUST-TYPE(CUST-IDX) = "PREMIUM" *> Copy premium customer to search index position MOVE CUSTOMER-ENTRY(CUST-IDX) TO CUSTOMER-ENTRY(SEARCH-IDX) SET SEARCH-IDX UP BY 1 END-IF SET CUST-IDX UP BY 1 END-PERFORM SET SEARCH-IDX DOWN BY 1 DISPLAY "Compacted " SEARCH-IDX " premium customers". PARALLEL-INDEX-PROCESSING. *> Process two tables simultaneously using different indexes SET CUST-IDX TO 1 SET PROD-IDX TO 1 PERFORM UNTIL CUST-IDX > 100 OR PROD-IDX > 100 DISPLAY "Customer " CUST-IDX ": " CUST-NAME(CUST-IDX) DISPLAY "Product " PROD-IDX ": " PRODUCT-NAME(PROD-IDX) SET CUST-IDX UP BY 1 SET PROD-IDX UP BY 1 END-PERFORM.
123456789101112131415161718192021222324*> Efficient index usage patterns *> Good: Use index in tight loops PERFORM VARYING TABLE-IDX FROM 1 BY 1 UNTIL TABLE-IDX > 1000 PROCESS TABLE-ENTRY(TABLE-IDX) END-PERFORM *> Good: Minimize index calculations SET START-IDX TO 1 SET END-IDX TO 100 PERFORM VARYING PROCESS-IDX FROM START-IDX BY 1 UNTIL PROCESS-IDX > END-IDX PROCESS-RECORD END-PERFORM *> Good: Use multiple indexes for complex operations SET READ-IDX TO 1 SET WRITE-IDX TO 1 PERFORM UNTIL READ-IDX > TABLE-SIZE IF VALID-RECORD(READ-IDX) MOVE TABLE-ENTRY(READ-IDX) TO TABLE-ENTRY(WRITE-IDX) SET WRITE-IDX UP BY 1 END-IF SET READ-IDX UP BY 1 END-PERFORM.
What is the primary advantage of using INDEX over subscripts?
Answer: INDEX provides more efficient table access because it stores displacement values internally, eliminating the need for address calculation during runtime, resulting in better performance.
How do you manipulate INDEX values in COBOL?
Answer: Use the SET statement: SET index-name TO value, SET index-name UP BY value, SET index-name DOWN BY value, or SET index-name TO another-index.