The DESCENDING clause in COBOL specifies that data should be arranged in descending order, from highest to lowest values, enabling efficient data organization and search operations.
DESCENDING is used with OCCURS clauses to define table key ordering and with SORT statements to specify sort order.
1234567891011121314151617*> DESCENDING with OCCURS clause level-number table-name OCCURS number TIMES [ASCENDING/DESCENDING KEY key-field-name] [INDEXED BY index-name] *> DESCENDING with SORT statement SORT sort-file-name ON DESCENDING KEY key-field-name [ON ASCENDING/DESCENDING KEY additional-key] USING input-file-name GIVING output-file-name *> Multiple keys with mixed ordering 05 EMPLOYEE-TABLE OCCURS 100 TIMES ASCENDING KEY EMP-DEPT DESCENDING KEY EMP-SALARY INDEXED BY EMP-INDEX
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778DATA DIVISION. WORKING-STORAGE SECTION. 01 WS-SALES-DATA. 05 WS-SALES-COUNT PIC 9(3) VALUE 0. 05 WS-SALES-RECORD OCCURS 50 TIMES DESCENDING KEY WS-SALES-AMOUNT INDEXED BY SALES-INDEX. 10 WS-SALES-ID PIC X(6). 10 WS-SALESPERSON PIC X(25). 10 WS-SALES-AMOUNT PIC 9(8)V99. 10 WS-SALES-DATE PIC X(8). 01 WS-PROCESSING-VARIABLES. 05 WS-SEARCH-AMOUNT PIC 9(8)V99. 05 WS-TEMP-RECORD. 10 WS-TEMP-ID PIC X(6). 10 WS-TEMP-PERSON PIC X(25). 10 WS-TEMP-AMOUNT PIC 9(8)V99. 10 WS-TEMP-DATE PIC X(8). PROCEDURE DIVISION. DESCENDING-KEY-DEMO. DISPLAY "=== DESCENDING Key Table Demo ===" PERFORM LOAD-SALES-DATA PERFORM DISPLAY-SALES-TABLE PERFORM DEMONSTRATE-SEARCH. LOAD-SALES-DATA. *> Load sample sales data (will be automatically sorted by amount descending) PERFORM ADD-SALES-RECORD("SAL001", "John Smith", 15000.00, "20240115") PERFORM ADD-SALES-RECORD("SAL002", "Jane Doe", 22000.00, "20240116") PERFORM ADD-SALES-RECORD("SAL003", "Bob Johnson", 18000.00, "20240117") PERFORM ADD-SALES-RECORD("SAL004", "Alice Brown", 25000.00, "20240118") PERFORM ADD-SALES-RECORD("SAL005", "Charlie Wilson", 12000.00, "20240119") DISPLAY "Loaded " WS-SALES-COUNT " sales records" DISPLAY "Table automatically sorted by sales amount (descending)". ADD-SALES-RECORD. *> This represents adding a record and maintaining descending order ADD 1 TO WS-SALES-COUNT *> In a real implementation, you would insert in the correct position *> For demo, we'll add and then sort CONTINUE. DISPLAY-SALES-TABLE. DISPLAY " " DISPLAY "Sales Records (Sorted by Amount - Descending):" DISPLAY "ID Salesperson Amount Date" DISPLAY "------ ------------------------ ----------- --------" PERFORM VARYING SALES-INDEX FROM 1 BY 1 UNTIL SALES-INDEX > WS-SALES-COUNT DISPLAY WS-SALES-ID(SALES-INDEX) " " WS-SALESPERSON(SALES-INDEX) " " WS-SALES-AMOUNT(SALES-INDEX) " " WS-SALES-DATE(SALES-INDEX) END-PERFORM. DEMONSTRATE-SEARCH. DISPLAY " " DISPLAY "=== Binary Search on DESCENDING Table ===" *> Search for specific amount MOVE 18000.00 TO WS-SEARCH-AMOUNT SEARCH ALL WS-SALES-RECORD AT END DISPLAY "Sales amount " WS-SEARCH-AMOUNT " not found" WHEN WS-SALES-AMOUNT(SALES-INDEX) = WS-SEARCH-AMOUNT DISPLAY "Found sales record:" DISPLAY " ID: " WS-SALES-ID(SALES-INDEX) DISPLAY " Salesperson: " WS-SALESPERSON(SALES-INDEX) DISPLAY " Amount: " WS-SALES-AMOUNT(SALES-INDEX) DISPLAY " Date: " WS-SALES-DATE(SALES-INDEX) END-SEARCH.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120DATA DIVISION. WORKING-STORAGE SECTION. 01 WS-EMPLOYEE-DATA. 05 WS-EMP-COUNT PIC 9(3) VALUE 0. 05 WS-EMPLOYEE-RECORD OCCURS 100 TIMES ASCENDING KEY WS-EMP-DEPT DESCENDING KEY WS-EMP-SALARY INDEXED BY EMP-INDEX. 10 WS-EMP-ID PIC X(6). 10 WS-EMP-NAME PIC X(25). 10 WS-EMP-DEPT PIC X(3). 10 WS-EMP-SALARY PIC 9(6)V99. 10 WS-EMP-HIRE-DATE PIC X(8). 01 WS-SEARCH-CRITERIA. 05 WS-SEARCH-DEPT PIC X(3). 05 WS-SEARCH-SALARY PIC 9(6)V99. PROCEDURE DIVISION. MIXED-ORDERING-DEMO. DISPLAY "=== Mixed Ordering Keys Demo ===" PERFORM LOAD-EMPLOYEE-DATA PERFORM DISPLAY-BY-DEPARTMENT PERFORM DEMONSTRATE-MULTI-KEY-SEARCH. LOAD-EMPLOYEE-DATA. *> Load employees from different departments with various salaries PERFORM ADD-EMPLOYEE("EMP001", "John Smith", "IT", 75000.00, "20220115") PERFORM ADD-EMPLOYEE("EMP002", "Jane Doe", "HR", 65000.00, "20220201") PERFORM ADD-EMPLOYEE("EMP003", "Bob Johnson", "IT", 85000.00, "20220110") PERFORM ADD-EMPLOYEE("EMP004", "Alice Brown", "FIN", 90000.00, "20220305") PERFORM ADD-EMPLOYEE("EMP005", "Charlie Wilson", "IT", 70000.00, "20220120") PERFORM ADD-EMPLOYEE("EMP006", "Diana Davis", "HR", 70000.00, "20220215") PERFORM ADD-EMPLOYEE("EMP007", "Eve Miller", "FIN", 95000.00, "20220301") PERFORM ADD-EMPLOYEE("EMP008", "Frank Garcia", "HR", 60000.00, "20220220") DISPLAY "Loaded " WS-EMP-COUNT " employee records" DISPLAY "Sorted by: Department (Ascending), then Salary (Descending)". ADD-EMPLOYEE. *> Simplified add - in real code would maintain sort order ADD 1 TO WS-EMP-COUNT CONTINUE. DISPLAY-BY-DEPARTMENT. DISPLAY " " DISPLAY "Employee Records (Dept ASC, Salary DESC):" DISPLAY "ID Name Dept Salary Hire Date" DISPLAY "------ ------------------------ ---- --------- --------" PERFORM VARYING EMP-INDEX FROM 1 BY 1 UNTIL EMP-INDEX > WS-EMP-COUNT DISPLAY WS-EMP-ID(EMP-INDEX) " " WS-EMP-NAME(EMP-INDEX) " " WS-EMP-DEPT(EMP-INDEX) " " WS-EMP-SALARY(EMP-INDEX) " " WS-EMP-HIRE-DATE(EMP-INDEX) END-PERFORM PERFORM ANALYZE-DEPARTMENT-GROUPING. ANALYZE-DEPARTMENT-GROUPING. DISPLAY " " DISPLAY "Department Analysis:" MOVE SPACES TO WS-SEARCH-DEPT PERFORM VARYING EMP-INDEX FROM 1 BY 1 UNTIL EMP-INDEX > WS-EMP-COUNT IF WS-EMP-DEPT(EMP-INDEX) NOT = WS-SEARCH-DEPT MOVE WS-EMP-DEPT(EMP-INDEX) TO WS-SEARCH-DEPT DISPLAY "Department: " WS-SEARCH-DEPT PERFORM COUNT-DEPT-EMPLOYEES END-IF END-PERFORM. COUNT-DEPT-EMPLOYEES. MOVE 0 TO WS-DEPT-COUNT MOVE 0 TO WS-TOTAL-SALARY MOVE 0 TO WS-MAX-SALARY PERFORM VARYING WS-INDEX FROM 1 BY 1 UNTIL WS-INDEX > WS-EMP-COUNT IF WS-EMP-DEPT(WS-INDEX) = WS-SEARCH-DEPT ADD 1 TO WS-DEPT-COUNT ADD WS-EMP-SALARY(WS-INDEX) TO WS-TOTAL-SALARY IF WS-EMP-SALARY(WS-INDEX) > WS-MAX-SALARY MOVE WS-EMP-SALARY(WS-INDEX) TO WS-MAX-SALARY END-IF END-IF END-PERFORM COMPUTE WS-AVG-SALARY = WS-TOTAL-SALARY / WS-DEPT-COUNT DISPLAY " Employees: " WS-DEPT-COUNT DISPLAY " Highest Salary: " WS-MAX-SALARY DISPLAY " Average Salary: " WS-AVG-SALARY. DEMONSTRATE-MULTI-KEY-SEARCH. DISPLAY " " DISPLAY "=== Multi-Key Search Demo ===" *> Search for employee in IT department with specific salary MOVE "IT" TO WS-SEARCH-DEPT MOVE 75000.00 TO WS-SEARCH-SALARY SEARCH ALL WS-EMPLOYEE-RECORD AT END DISPLAY "No employee found in " WS-SEARCH-DEPT " with salary " WS-SEARCH-SALARY WHEN WS-EMP-DEPT(EMP-INDEX) = WS-SEARCH-DEPT AND WS-EMP-SALARY(EMP-INDEX) = WS-SEARCH-SALARY DISPLAY "Found employee:" DISPLAY " ID: " WS-EMP-ID(EMP-INDEX) DISPLAY " Name: " WS-EMP-NAME(EMP-INDEX) DISPLAY " Department: " WS-EMP-DEPT(EMP-INDEX) DISPLAY " Salary: " WS-EMP-SALARY(EMP-INDEX) DISPLAY " Hire Date: " WS-EMP-HIRE-DATE(EMP-INDEX) END-SEARCH.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081ENVIRONMENT DIVISION. INPUT-OUTPUT SECTION. FILE-CONTROL. SELECT INPUT-FILE ASSIGN TO "UNSORTED.DAT" ORGANIZATION IS SEQUENTIAL FILE STATUS IS INPUT-STATUS. SELECT OUTPUT-FILE ASSIGN TO "SORTED.DAT" ORGANIZATION IS SEQUENTIAL FILE STATUS IS OUTPUT-STATUS. SELECT SORT-FILE ASSIGN TO "SORTWORK" ORGANIZATION IS SEQUENTIAL. DATA DIVISION. FILE SECTION. FD INPUT-FILE. 01 INPUT-RECORD. 05 INPUT-ID PIC X(6). 05 INPUT-NAME PIC X(25). 05 INPUT-SCORE PIC 9(3). 05 INPUT-DATE PIC X(8). FD OUTPUT-FILE. 01 OUTPUT-RECORD. 05 OUTPUT-ID PIC X(6). 05 OUTPUT-NAME PIC X(25). 05 OUTPUT-SCORE PIC 9(3). 05 OUTPUT-DATE PIC X(8). SD SORT-FILE. 01 SORT-RECORD. 05 SORT-ID PIC X(6). 05 SORT-NAME PIC X(25). 05 SORT-SCORE PIC 9(3). 05 SORT-DATE PIC X(8). WORKING-STORAGE SECTION. 01 INPUT-STATUS PIC X(2). 01 OUTPUT-STATUS PIC X(2). 01 WS-RECORD-COUNT PIC 9(5) VALUE 0. PROCEDURE DIVISION. SORT-DESCENDING-DEMO. DISPLAY "=== SORT with DESCENDING Key Demo ===" *> Sort by score in descending order (highest scores first) SORT SORT-FILE ON DESCENDING KEY SORT-SCORE USING INPUT-FILE GIVING OUTPUT-FILE DISPLAY "Sort completed - records sorted by score (descending)" PERFORM DISPLAY-SORTED-RESULTS. DISPLAY-SORTED-RESULTS. OPEN INPUT OUTPUT-FILE DISPLAY " " DISPLAY "Sorted Results (Score Descending):" DISPLAY "ID Name Score Date" DISPLAY "------ ------------------------ ----- --------" PERFORM READ-AND-DISPLAY UNTIL INPUT-STATUS = "10" CLOSE OUTPUT-FILE DISPLAY "Total records processed: " WS-RECORD-COUNT. READ-AND-DISPLAY. READ OUTPUT-FILE AT END MOVE "10" TO INPUT-STATUS NOT AT END ADD 1 TO WS-RECORD-COUNT DISPLAY OUTPUT-ID " " OUTPUT-NAME " " OUTPUT-SCORE " " OUTPUT-DATE END-READ.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124ENVIRONMENT DIVISION. INPUT-OUTPUT SECTION. FILE-CONTROL. SELECT SALES-INPUT ASSIGN TO "SALESIN.DAT" ORGANIZATION IS SEQUENTIAL. SELECT SALES-OUTPUT ASSIGN TO "SALESOUT.DAT" ORGANIZATION IS SEQUENTIAL. SELECT SALES-SORT ASSIGN TO "SORTWORK". DATA DIVISION. FILE SECTION. SD SALES-SORT. 01 SORT-SALES-RECORD. 05 SORT-REGION PIC X(2). 05 SORT-SALESPERSON PIC X(25). 05 SORT-SALES-AMOUNT PIC 9(8)V99. 05 SORT-COMMISSION PIC 9(6)V99. 05 SORT-QUARTER PIC 9(1). FD SALES-INPUT. 01 INPUT-SALES-RECORD. 05 INPUT-REGION PIC X(2). 05 INPUT-SALESPERSON PIC X(25). 05 INPUT-SALES-AMOUNT PIC 9(8)V99. 05 INPUT-COMMISSION PIC 9(6)V99. 05 INPUT-QUARTER PIC 9(1). FD SALES-OUTPUT. 01 OUTPUT-SALES-RECORD. 05 OUTPUT-REGION PIC X(2). 05 OUTPUT-SALESPERSON PIC X(25). 05 OUTPUT-SALES-AMOUNT PIC 9(8)V99. 05 OUTPUT-COMMISSION PIC 9(6)V99. 05 OUTPUT-QUARTER PIC 9(1). WORKING-STORAGE SECTION. 01 WS-SORT-STATISTICS. 05 WS-RECORDS-SORTED PIC 9(5) VALUE 0. 05 WS-CURRENT-REGION PIC X(2) VALUE SPACES. 05 WS-REGION-TOTAL PIC 9(10)V99 VALUE 0. 05 WS-GRAND-TOTAL PIC 9(12)V99 VALUE 0. PROCEDURE DIVISION. MULTI-KEY-SORT-DEMO. DISPLAY "=== Multi-Key SORT with Mixed Ordering ===" *> Sort by: *> 1. Region (Ascending) - to group regions together *> 2. Sales Amount (Descending) - highest sales first within region *> 3. Quarter (Ascending) - chronological order for same amounts SORT SALES-SORT ON ASCENDING KEY SORT-REGION ON DESCENDING KEY SORT-SALES-AMOUNT ON ASCENDING KEY SORT-QUARTER INPUT PROCEDURE IS SORT-INPUT-PROC OUTPUT PROCEDURE IS SORT-OUTPUT-PROC PERFORM DISPLAY-SORT-SUMMARY. SORT-INPUT-PROC. OPEN INPUT SALES-INPUT PERFORM READ-INPUT-RECORD UNTIL INPUT-SALES-RECORD = HIGH-VALUES CLOSE SALES-INPUT. READ-INPUT-RECORD. READ SALES-INPUT AT END MOVE HIGH-VALUES TO INPUT-SALES-RECORD NOT AT END MOVE INPUT-SALES-RECORD TO SORT-SALES-RECORD RELEASE SORT-SALES-RECORD ADD 1 TO WS-RECORDS-SORTED END-READ. SORT-OUTPUT-PROC. OPEN OUTPUT SALES-OUTPUT PERFORM RETURN-SORTED-RECORD UNTIL SORT-SALES-RECORD = HIGH-VALUES CLOSE SALES-OUTPUT. RETURN-SORTED-RECORD. RETURN SALES-SORT AT END MOVE HIGH-VALUES TO SORT-SALES-RECORD NOT AT END MOVE SORT-SALES-RECORD TO OUTPUT-SALES-RECORD WRITE OUTPUT-SALES-RECORD PERFORM ACCUMULATE-TOTALS PERFORM DISPLAY-SORTED-RECORD END-RETURN. ACCUMULATE-TOTALS. *> Check for region break IF SORT-REGION NOT = WS-CURRENT-REGION IF WS-CURRENT-REGION NOT = SPACES DISPLAY " Region " WS-CURRENT-REGION " Total: $" WS-REGION-TOTAL DISPLAY " " END-IF MOVE SORT-REGION TO WS-CURRENT-REGION MOVE 0 TO WS-REGION-TOTAL DISPLAY "Region: " WS-CURRENT-REGION END-IF ADD SORT-SALES-AMOUNT TO WS-REGION-TOTAL ADD SORT-SALES-AMOUNT TO WS-GRAND-TOTAL. DISPLAY-SORTED-RECORD. DISPLAY " " SORT-SALESPERSON " Q" SORT-QUARTER " $" SORT-SALES-AMOUNT " (Comm: $" SORT-COMMISSION ")". DISPLAY-SORT-SUMMARY. DISPLAY " " DISPLAY "Final Region Total: $" WS-REGION-TOTAL DISPLAY " " DISPLAY "=== Sort Summary ===" DISPLAY "Records sorted: " WS-RECORDS-SORTED DISPLAY "Grand total sales: $" WS-GRAND-TOTAL DISPLAY "Sort order: Region ASC, Sales Amount DESC, Quarter ASC".
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150DATA DIVISION. WORKING-STORAGE SECTION. 01 WS-PRODUCT-TABLE. 05 WS-PRODUCT-COUNT PIC 9(3) VALUE 0. 05 WS-PRODUCT-ITEM OCCURS 100 TIMES INDEXED BY PROD-INDEX. 10 WS-PROD-ID PIC X(8). 10 WS-PROD-NAME PIC X(30). 10 WS-PROD-PRICE PIC 9(6)V99. 10 WS-PROD-STOCK PIC 9(5). 10 WS-PROD-CATEGORY PIC X(15). 01 WS-SORT-CONTROLS. 05 WS-SORT-CHOICE PIC X(1). 05 WS-SORT-DIRECTION PIC X(1). 05 WS-TEMP-PRODUCT. 10 WS-TEMP-ID PIC X(8). 10 WS-TEMP-NAME PIC X(30). 10 WS-TEMP-PRICE PIC 9(6)V99. 10 WS-TEMP-STOCK PIC 9(5). 10 WS-TEMP-CATEGORY PIC X(15). PROCEDURE DIVISION. DYNAMIC-SORT-DEMO. DISPLAY "=== Dynamic Sort Order Demo ===" PERFORM LOAD-SAMPLE-PRODUCTS PERFORM SORT-MENU. LOAD-SAMPLE-PRODUCTS. *> Load sample products PERFORM ADD-PRODUCT("PROD001", "Laptop", 1299.99, 25, "Electronics") PERFORM ADD-PRODUCT("PROD002", "Mouse", 29.99, 150, "Electronics") PERFORM ADD-PRODUCT("PROD003", "Chair", 249.50, 30, "Furniture") PERFORM ADD-PRODUCT("PROD004", "Desk", 399.00, 15, "Furniture") PERFORM ADD-PRODUCT("PROD005", "Monitor", 299.99, 40, "Electronics") DISPLAY "Loaded " WS-PRODUCT-COUNT " products". ADD-PRODUCT. *> Simplified add for demo ADD 1 TO WS-PRODUCT-COUNT CONTINUE. SORT-MENU. PERFORM DISPLAY-CURRENT-TABLE DISPLAY " " DISPLAY "Sort Options:" DISPLAY "(1) Price, (2) Stock, (3) Name, (4) Category" DISPLAY "Choose sort field (1-4): " ACCEPT WS-SORT-CHOICE DISPLAY "Sort direction - (A)scending or (D)escending: " ACCEPT WS-SORT-DIRECTION PERFORM EXECUTE-SORT DISPLAY "Continue? (Y/N): " ACCEPT WS-CONTINUE-FLAG IF WS-CONTINUE-FLAG = 'Y' OR WS-CONTINUE-FLAG = 'y' PERFORM SORT-MENU END-IF. DISPLAY-CURRENT-TABLE. DISPLAY " " DISPLAY "Current Product Table:" DISPLAY "ID Name Price Stock Category" DISPLAY "-------- ------------------------------ -------- ----- ---------------" PERFORM VARYING PROD-INDEX FROM 1 BY 1 UNTIL PROD-INDEX > WS-PRODUCT-COUNT DISPLAY WS-PROD-ID(PROD-INDEX) " " WS-PROD-NAME(PROD-INDEX) " " WS-PROD-PRICE(PROD-INDEX) " " WS-PROD-STOCK(PROD-INDEX) " " WS-PROD-CATEGORY(PROD-INDEX) END-PERFORM. EXECUTE-SORT. EVALUATE WS-SORT-CHOICE WHEN "1" PERFORM SORT-BY-PRICE WHEN "2" PERFORM SORT-BY-STOCK WHEN "3" PERFORM SORT-BY-NAME WHEN "4" PERFORM SORT-BY-CATEGORY WHEN OTHER DISPLAY "Invalid choice" END-EVALUATE. SORT-BY-PRICE. DISPLAY "Sorting by price..." PERFORM BUBBLE-SORT-PRICE IF WS-SORT-DIRECTION = 'D' OR WS-SORT-DIRECTION = 'd' DISPLAY "Applied descending order" ELSE DISPLAY "Applied ascending order" END-IF. BUBBLE-SORT-PRICE. PERFORM VARYING WS-I FROM 1 BY 1 UNTIL WS-I >= WS-PRODUCT-COUNT PERFORM VARYING WS-J FROM WS-I BY 1 UNTIL WS-J > WS-PRODUCT-COUNT EVALUATE WS-SORT-DIRECTION WHEN 'A' OR 'a' IF WS-PROD-PRICE(WS-I) > WS-PROD-PRICE(WS-J) PERFORM SWAP-PRODUCTS END-IF WHEN 'D' OR 'd' IF WS-PROD-PRICE(WS-I) < WS-PROD-PRICE(WS-J) PERFORM SWAP-PRODUCTS END-IF END-EVALUATE END-PERFORM END-PERFORM. SORT-BY-STOCK. DISPLAY "Sorting by stock quantity..." PERFORM BUBBLE-SORT-STOCK. BUBBLE-SORT-STOCK. PERFORM VARYING WS-I FROM 1 BY 1 UNTIL WS-I >= WS-PRODUCT-COUNT PERFORM VARYING WS-J FROM WS-I BY 1 UNTIL WS-J > WS-PRODUCT-COUNT EVALUATE WS-SORT-DIRECTION WHEN 'A' OR 'a' IF WS-PROD-STOCK(WS-I) > WS-PROD-STOCK(WS-J) PERFORM SWAP-PRODUCTS END-IF WHEN 'D' OR 'd' IF WS-PROD-STOCK(WS-I) < WS-PROD-STOCK(WS-J) PERFORM SWAP-PRODUCTS END-IF END-EVALUATE END-PERFORM END-PERFORM. SWAP-PRODUCTS. MOVE WS-PRODUCT-ITEM(WS-I) TO WS-TEMP-PRODUCT MOVE WS-PRODUCT-ITEM(WS-J) TO WS-PRODUCT-ITEM(WS-I) MOVE WS-TEMP-PRODUCT TO WS-PRODUCT-ITEM(WS-J).
12345678910111213141516171819202122232425*> Single descending key pattern 05 sales-table OCCURS 100 TIMES DESCENDING KEY sales-amount INDEXED BY sales-index *> Mixed ordering pattern 05 employee-table OCCURS 200 TIMES ASCENDING KEY emp-department DESCENDING KEY emp-salary INDEXED BY emp-index *> Sort statement pattern SORT sort-file ON DESCENDING KEY sort-amount ON ASCENDING KEY sort-date USING input-file GIVING output-file *> Search on descending table SEARCH ALL table-name AT END PERFORM not-found-routine WHEN key-field(index) = search-value PERFORM found-routine END-SEARCH