The END-RETURN statement represents a fundamental component of sort and merge operations in COBOL, serving as an explicit scope terminator that clearly defines the boundaries of RETURN statement blocks. This statement embodies modern data processing principles by providing unambiguous termination points for sorted data retrieval operations, enabling sophisticated error handling for sort/merge scenarios, and supporting the development of robust data processing applications that require precise control over sorted data access and manipulation.
In contemporary enterprise COBOL development, END-RETURN plays a vital role in creating sophisticated data processing systems that must handle large volumes of sorted data, complex merge operations, and various data transformation scenarios. By providing explicit termination for RETURN blocks, this statement enables developers to implement comprehensive sort processing logic while maintaining code clarity and ensuring that sort operations are properly bounded and controlled within the application's data processing flow.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162IDENTIFICATION DIVISION. PROGRAM-ID. END-RETURN-DEMO. ENVIRONMENT DIVISION. INPUT-OUTPUT SECTION. FILE-CONTROL. SELECT INPUT-FILE ASSIGN TO 'UNSORTED.DAT' ORGANIZATION IS SEQUENTIAL. SELECT OUTPUT-FILE ASSIGN TO 'SORTED.DAT' ORGANIZATION IS SEQUENTIAL. SELECT SORT-WORK ASSIGN TO 'SORTWORK'. DATA DIVISION. FILE SECTION. FD INPUT-FILE. 01 INPUT-RECORD. 05 CUSTOMER-ID PIC X(10). 05 CUSTOMER-NAME PIC X(30). 05 CUSTOMER-BALANCE PIC S9(9)V99. 05 CUSTOMER-REGION PIC X(5). 05 CUSTOMER-TYPE PIC X(2). FD OUTPUT-FILE. 01 OUTPUT-RECORD. 05 CUSTOMER-ID PIC X(10). 05 CUSTOMER-NAME PIC X(30). 05 CUSTOMER-BALANCE PIC S9(9)V99. 05 CUSTOMER-REGION PIC X(5). 05 CUSTOMER-TYPE PIC X(2). SD SORT-WORK. 01 SORT-RECORD. 05 CUSTOMER-ID PIC X(10). 05 CUSTOMER-NAME PIC X(30). 05 CUSTOMER-BALANCE PIC S9(9)V99. 05 CUSTOMER-REGION PIC X(5). 05 CUSTOMER-TYPE PIC X(2). WORKING-STORAGE SECTION. 01 SORT-CONTROLS. 05 RECORDS-READ PIC 9(7) VALUE 0. 05 RECORDS-WRITTEN PIC 9(7) VALUE 0. 05 RECORDS-PROCESSED PIC 9(7) VALUE 0. 05 SORT-RETURN-CODE PIC 9(2) VALUE 0. 01 PROCESSING-FLAGS. 05 EOF-FLAG PIC X VALUE 'N'. 88 END-OF-SORT VALUE 'Y'. 88 MORE-RECORDS VALUE 'N'. 05 ERROR-FLAG PIC X VALUE 'N'. 88 SORT-ERROR VALUE 'Y'. 88 SORT-OK VALUE 'N'. 01 SUMMARY-TOTALS. 05 REGION-TOTALS. 10 NORTH-TOTAL PIC S9(11)V99 VALUE 0. 10 SOUTH-TOTAL PIC S9(11)V99 VALUE 0. 10 EAST-TOTAL PIC S9(11)V99 VALUE 0. 10 WEST-TOTAL PIC S9(11)V99 VALUE 0. 05 TYPE-TOTALS. 10 PREMIUM-TOTAL PIC S9(11)V99 VALUE 0. 10 STANDARD-TOTAL PIC S9(11)V99 VALUE 0. 10 BASIC-TOTAL PIC S9(11)V99 VALUE 0. PROCEDURE DIVISION. MAIN-PROCESSING. PERFORM SORT-CUSTOMER-DATA PERFORM DISPLAY-SORT-STATISTICS STOP RUN. SORT-CUSTOMER-DATA. DISPLAY 'Starting customer data sort operation...' SORT SORT-WORK ON ASCENDING KEY CUSTOMER-REGION ON ASCENDING KEY CUSTOMER-TYPE ON DESCENDING KEY CUSTOMER-BALANCE USING INPUT-FILE OUTPUT PROCEDURE IS PROCESS-SORTED-RECORDS DISPLAY 'Sort operation completed'. PROCESS-SORTED-RECORDS. DISPLAY 'Processing sorted records...' OPEN OUTPUT OUTPUT-FILE PERFORM RETURN-SORTED-RECORDS CLOSE OUTPUT-FILE DISPLAY 'Sorted records processing completed'. RETURN-SORTED-RECORDS. SET MORE-RECORDS TO TRUE PERFORM UNTIL END-OF-SORT RETURN SORT-WORK AT END DISPLAY 'All sorted records processed' SET END-OF-SORT TO TRUE NOT AT END ADD 1 TO RECORDS-PROCESSED PERFORM PROCESS-INDIVIDUAL-RECORD PERFORM WRITE-OUTPUT-RECORD END-RETURN END-PERFORM. PROCESS-INDIVIDUAL-RECORD. *> Accumulate regional totals EVALUATE CUSTOMER-REGION WHEN 'NORTH' ADD CUSTOMER-BALANCE TO NORTH-TOTAL WHEN 'SOUTH' ADD CUSTOMER-BALANCE TO SOUTH-TOTAL WHEN 'EAST' ADD CUSTOMER-BALANCE TO EAST-TOTAL WHEN 'WEST' ADD CUSTOMER-BALANCE TO WEST-TOTAL WHEN OTHER DISPLAY 'Unknown region: ' CUSTOMER-REGION END-EVALUATE *> Accumulate type totals EVALUATE CUSTOMER-TYPE WHEN 'PR' ADD CUSTOMER-BALANCE TO PREMIUM-TOTAL WHEN 'ST' ADD CUSTOMER-BALANCE TO STANDARD-TOTAL WHEN 'BA' ADD CUSTOMER-BALANCE TO BASIC-TOTAL WHEN OTHER DISPLAY 'Unknown customer type: ' CUSTOMER-TYPE END-EVALUATE *> Display progress every 1000 records IF FUNCTION MOD(RECORDS-PROCESSED, 1000) = 0 DISPLAY 'Processed ' RECORDS-PROCESSED ' records' END-IF. WRITE-OUTPUT-RECORD. MOVE SORT-RECORD TO OUTPUT-RECORD WRITE OUTPUT-RECORD ADD 1 TO RECORDS-WRITTEN. DISPLAY-SORT-STATISTICS. DISPLAY 'Sort Processing Statistics:' DISPLAY 'Records processed: ' RECORDS-PROCESSED DISPLAY 'Records written: ' RECORDS-WRITTEN DISPLAY '' DISPLAY 'Regional Totals:' DISPLAY 'North: ' NORTH-TOTAL DISPLAY 'South: ' SOUTH-TOTAL DISPLAY 'East: ' EAST-TOTAL DISPLAY 'West: ' WEST-TOTAL DISPLAY '' DISPLAY 'Customer Type Totals:' DISPLAY 'Premium: ' PREMIUM-TOTAL DISPLAY 'Standard: ' STANDARD-TOTAL DISPLAY 'Basic: ' BASIC-TOTAL.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362IDENTIFICATION DIVISION. PROGRAM-ID. ADVANCED-END-RETURN. ENVIRONMENT DIVISION. INPUT-OUTPUT SECTION. FILE-CONTROL. SELECT SALES-FILE ASSIGN TO 'SALES.DAT' ORGANIZATION IS SEQUENTIAL. SELECT INVENTORY-FILE ASSIGN TO 'INVENTORY.DAT' ORGANIZATION IS SEQUENTIAL. SELECT MERGED-OUTPUT ASSIGN TO 'MERGED.DAT' ORGANIZATION IS SEQUENTIAL. SELECT SALES-SORT ASSIGN TO 'SALES-SORT'. SELECT INVENTORY-SORT ASSIGN TO 'INVENTORY-SORT'. SELECT MERGE-WORK ASSIGN TO 'MERGE-WORK'. DATA DIVISION. FILE SECTION. FD SALES-FILE. 01 SALES-RECORD. 05 PRODUCT-CODE PIC X(10). 05 SALE-DATE PIC X(8). 05 QUANTITY-SOLD PIC 9(7). 05 UNIT-PRICE PIC 9(7)V99. 05 SALES-AMOUNT PIC 9(9)V99. FD INVENTORY-FILE. 01 INVENTORY-RECORD. 05 PRODUCT-CODE PIC X(10). 05 INVENTORY-DATE PIC X(8). 05 QUANTITY-RECEIVED PIC 9(7). 05 UNIT-COST PIC 9(7)V99. 05 INVENTORY-VALUE PIC 9(9)V99. FD MERGED-OUTPUT. 01 MERGED-RECORD. 05 PRODUCT-CODE PIC X(10). 05 TRANSACTION-DATE PIC X(8). 05 TRANSACTION-TYPE PIC X(1). 05 QUANTITY PIC 9(7). 05 UNIT-AMOUNT PIC 9(7)V99. 05 TOTAL-AMOUNT PIC 9(9)V99. SD SALES-SORT. 01 SALES-SORT-RECORD. 05 PRODUCT-CODE PIC X(10). 05 SALE-DATE PIC X(8). 05 QUANTITY-SOLD PIC 9(7). 05 UNIT-PRICE PIC 9(7)V99. 05 SALES-AMOUNT PIC 9(9)V99. SD INVENTORY-SORT. 01 INVENTORY-SORT-RECORD. 05 PRODUCT-CODE PIC X(10). 05 INVENTORY-DATE PIC X(8). 05 QUANTITY-RECEIVED PIC 9(7). 05 UNIT-COST PIC 9(7)V99. 05 INVENTORY-VALUE PIC 9(9)V99. SD MERGE-WORK. 01 MERGE-RECORD. 05 PRODUCT-CODE PIC X(10). 05 TRANSACTION-DATE PIC X(8). 05 TRANSACTION-TYPE PIC X(1). 05 QUANTITY PIC 9(7). 05 UNIT-AMOUNT PIC 9(7)V99. 05 TOTAL-AMOUNT PIC 9(9)V99. WORKING-STORAGE SECTION. 01 PROCESSING-CONTROLS. 05 SALES-RECORDS-COUNT PIC 9(7) VALUE 0. 05 INVENTORY-RECORDS-COUNT PIC 9(7) VALUE 0. 05 MERGED-RECORDS-COUNT PIC 9(7) VALUE 0. 05 CURRENT-PRODUCT PIC X(10) VALUE SPACES. 05 PRODUCT-BREAK-FLAG PIC X VALUE 'N'. 88 PRODUCT-BREAK VALUE 'Y'. 01 PRODUCT-SUMMARY. 05 PRODUCT-TOTALS. 10 TOTAL-SALES PIC 9(11)V99 VALUE 0. 10 TOTAL-INVENTORY PIC 9(11)V99 VALUE 0. 10 TOTAL-QUANTITY-SOLD PIC 9(9) VALUE 0. 10 TOTAL-QUANTITY-RECV PIC 9(9) VALUE 0. 05 PRODUCT-COUNTS. 10 SALES-TRANSACTIONS PIC 9(5) VALUE 0. 10 INVENTORY-TRANSACTIONS PIC 9(5) VALUE 0. 01 ADVANCED-PROCESSING. 05 BATCH-CONTROLS. 10 BATCH-SIZE PIC 9(5) VALUE 5000. 10 CURRENT-BATCH PIC 9(5) VALUE 0. 10 RECORDS-IN-BATCH PIC 9(5) VALUE 0. 05 VALIDATION-CONTROLS. 10 VALIDATION-ERRORS PIC 9(5) VALUE 0. 10 DATA-QUALITY-SCORE PIC 9(3)V99 VALUE 0. 01 COMPLEX-SORT-CONTROLS. 05 SORT-PHASE PIC 9(1) VALUE 1. 88 PHASE-1-SORT VALUE 1. 88 PHASE-2-SORT VALUE 2. 88 PHASE-3-MERGE VALUE 3. 05 SORT-STATISTICS. 10 PHASE-1-RECORDS PIC 9(7) VALUE 0. 10 PHASE-2-RECORDS PIC 9(7) VALUE 0. 10 MERGE-RECORDS PIC 9(7) VALUE 0. PROCEDURE DIVISION. MAIN-PROCESSING. PERFORM EXECUTE-MULTI-PHASE-SORT PERFORM DISPLAY-COMPREHENSIVE-STATISTICS STOP RUN. EXECUTE-MULTI-PHASE-SORT. DISPLAY 'Starting multi-phase sort and merge operation...' PERFORM PHASE-1-SALES-SORT PERFORM PHASE-2-INVENTORY-SORT PERFORM PHASE-3-MERGE-OPERATION DISPLAY 'Multi-phase sort and merge completed'. PHASE-1-SALES-SORT. DISPLAY 'Phase 1: Sorting sales data...' SET PHASE-1-SORT TO TRUE SORT SALES-SORT ON ASCENDING KEY PRODUCT-CODE ON ASCENDING KEY SALE-DATE USING SALES-FILE OUTPUT PROCEDURE IS PROCESS-SORTED-SALES DISPLAY 'Phase 1 completed. Records processed: ' PHASE-1-RECORDS. PROCESS-SORTED-SALES. PERFORM RETURN-SALES-RECORDS PERFORM GENERATE-SALES-SUMMARY. RETURN-SALES-RECORDS. PERFORM UNTIL END-OF-SORT RETURN SALES-SORT AT END DISPLAY 'All sales records processed' SET END-OF-SORT TO TRUE NOT AT END ADD 1 TO PHASE-1-RECORDS PERFORM VALIDATE-SALES-RECORD PERFORM CONVERT-SALES-TO-MERGE-FORMAT END-RETURN END-PERFORM. VALIDATE-SALES-RECORD. *> Validate product code IF PRODUCT-CODE = SPACES OR LOW-VALUES ADD 1 TO VALIDATION-ERRORS DISPLAY 'Invalid product code in sales record: ' PHASE-1-RECORDS END-IF *> Validate sale date IF SALE-DATE NOT NUMERIC ADD 1 TO VALIDATION-ERRORS DISPLAY 'Invalid sale date in record: ' PHASE-1-RECORDS END-IF *> Validate amounts IF QUANTITY-SOLD <= 0 OR UNIT-PRICE <= 0 ADD 1 TO VALIDATION-ERRORS DISPLAY 'Invalid quantity or price in record: ' PHASE-1-RECORDS END-IF. CONVERT-SALES-TO-MERGE-FORMAT. MOVE PRODUCT-CODE TO PRODUCT-CODE OF MERGE-RECORD MOVE SALE-DATE TO TRANSACTION-DATE OF MERGE-RECORD MOVE 'S' TO TRANSACTION-TYPE OF MERGE-RECORD MOVE QUANTITY-SOLD TO QUANTITY OF MERGE-RECORD MOVE UNIT-PRICE TO UNIT-AMOUNT OF MERGE-RECORD MOVE SALES-AMOUNT TO TOTAL-AMOUNT OF MERGE-RECORD *> Release to merge file RELEASE MERGE-RECORD. GENERATE-SALES-SUMMARY. DISPLAY 'Generating sales summary...' DISPLAY 'Sales records processed: ' PHASE-1-RECORDS DISPLAY 'Sales validation errors: ' VALIDATION-ERRORS. PHASE-2-INVENTORY-SORT. DISPLAY 'Phase 2: Sorting inventory data...' SET PHASE-2-SORT TO TRUE MOVE 0 TO VALIDATION-ERRORS SORT INVENTORY-SORT ON ASCENDING KEY PRODUCT-CODE ON ASCENDING KEY INVENTORY-DATE USING INVENTORY-FILE OUTPUT PROCEDURE IS PROCESS-SORTED-INVENTORY DISPLAY 'Phase 2 completed. Records processed: ' PHASE-2-RECORDS. PROCESS-SORTED-INVENTORY. PERFORM RETURN-INVENTORY-RECORDS PERFORM GENERATE-INVENTORY-SUMMARY. RETURN-INVENTORY-RECORDS. SET MORE-RECORDS TO TRUE PERFORM UNTIL END-OF-SORT RETURN INVENTORY-SORT AT END DISPLAY 'All inventory records processed' SET END-OF-SORT TO TRUE NOT AT END ADD 1 TO PHASE-2-RECORDS PERFORM VALIDATE-INVENTORY-RECORD PERFORM CONVERT-INVENTORY-TO-MERGE-FORMAT END-RETURN END-PERFORM. VALIDATE-INVENTORY-RECORD. *> Validate product code IF PRODUCT-CODE = SPACES OR LOW-VALUES ADD 1 TO VALIDATION-ERRORS DISPLAY 'Invalid product code in inventory record: ' PHASE-2-RECORDS END-IF *> Validate inventory date IF INVENTORY-DATE NOT NUMERIC ADD 1 TO VALIDATION-ERRORS DISPLAY 'Invalid inventory date in record: ' PHASE-2-RECORDS END-IF *> Validate amounts IF QUANTITY-RECEIVED <= 0 OR UNIT-COST <= 0 ADD 1 TO VALIDATION-ERRORS DISPLAY 'Invalid quantity or cost in record: ' PHASE-2-RECORDS END-IF. CONVERT-INVENTORY-TO-MERGE-FORMAT. MOVE PRODUCT-CODE TO PRODUCT-CODE OF MERGE-RECORD MOVE INVENTORY-DATE TO TRANSACTION-DATE OF MERGE-RECORD MOVE 'I' TO TRANSACTION-TYPE OF MERGE-RECORD MOVE QUANTITY-RECEIVED TO QUANTITY OF MERGE-RECORD MOVE UNIT-COST TO UNIT-AMOUNT OF MERGE-RECORD MOVE INVENTORY-VALUE TO TOTAL-AMOUNT OF MERGE-RECORD *> Release to merge file RELEASE MERGE-RECORD. GENERATE-INVENTORY-SUMMARY. DISPLAY 'Generating inventory summary...' DISPLAY 'Inventory records processed: ' PHASE-2-RECORDS DISPLAY 'Inventory validation errors: ' VALIDATION-ERRORS. PHASE-3-MERGE-OPERATION. DISPLAY 'Phase 3: Merging sales and inventory data...' SET PHASE-3-MERGE TO TRUE MERGE MERGE-WORK ON ASCENDING KEY PRODUCT-CODE ON ASCENDING KEY TRANSACTION-DATE ON ASCENDING KEY TRANSACTION-TYPE USING SALES-SORT, INVENTORY-SORT OUTPUT PROCEDURE IS PROCESS-MERGED-DATA DISPLAY 'Phase 3 completed. Records processed: ' MERGE-RECORDS. PROCESS-MERGED-DATA. OPEN OUTPUT MERGED-OUTPUT PERFORM RETURN-MERGED-RECORDS PERFORM GENERATE-FINAL-SUMMARY CLOSE MERGED-OUTPUT. RETURN-MERGED-RECORDS. MOVE SPACES TO CURRENT-PRODUCT PERFORM INITIALIZE-PRODUCT-TOTALS PERFORM UNTIL END-OF-SORT RETURN MERGE-WORK AT END DISPLAY 'All merged records processed' IF CURRENT-PRODUCT NOT = SPACES PERFORM WRITE-PRODUCT-SUMMARY END-IF SET END-OF-SORT TO TRUE NOT AT END ADD 1 TO MERGE-RECORDS PERFORM CHECK-PRODUCT-BREAK PERFORM ACCUMULATE-PRODUCT-TOTALS PERFORM WRITE-MERGED-RECORD END-RETURN END-PERFORM. CHECK-PRODUCT-BREAK. IF CURRENT-PRODUCT = SPACES MOVE PRODUCT-CODE TO CURRENT-PRODUCT ELSE IF PRODUCT-CODE NOT = CURRENT-PRODUCT PERFORM WRITE-PRODUCT-SUMMARY PERFORM INITIALIZE-PRODUCT-TOTALS MOVE PRODUCT-CODE TO CURRENT-PRODUCT END-IF END-IF. ACCUMULATE-PRODUCT-TOTALS. EVALUATE TRANSACTION-TYPE WHEN 'S' *> Sales ADD TOTAL-AMOUNT TO TOTAL-SALES ADD QUANTITY TO TOTAL-QUANTITY-SOLD ADD 1 TO SALES-TRANSACTIONS WHEN 'I' *> Inventory ADD TOTAL-AMOUNT TO TOTAL-INVENTORY ADD QUANTITY TO TOTAL-QUANTITY-RECV ADD 1 TO INVENTORY-TRANSACTIONS END-EVALUATE. WRITE-MERGED-RECORD. MOVE MERGE-RECORD TO MERGED-RECORD WRITE MERGED-RECORD ADD 1 TO MERGED-RECORDS-COUNT. WRITE-PRODUCT-SUMMARY. DISPLAY 'Product Summary for: ' CURRENT-PRODUCT DISPLAY 'Total Sales: ' TOTAL-SALES DISPLAY 'Total Inventory: ' TOTAL-INVENTORY DISPLAY 'Quantity Sold: ' TOTAL-QUANTITY-SOLD DISPLAY 'Quantity Received: ' TOTAL-QUANTITY-RECV DISPLAY 'Sales Transactions: ' SALES-TRANSACTIONS DISPLAY 'Inventory Transactions: ' INVENTORY-TRANSACTIONS DISPLAY '---'. INITIALIZE-PRODUCT-TOTALS. MOVE 0 TO TOTAL-SALES MOVE 0 TO TOTAL-INVENTORY MOVE 0 TO TOTAL-QUANTITY-SOLD MOVE 0 TO TOTAL-QUANTITY-RECV MOVE 0 TO SALES-TRANSACTIONS MOVE 0 TO INVENTORY-TRANSACTIONS. GENERATE-FINAL-SUMMARY. DISPLAY 'Generating final processing summary...' DISPLAY 'Merged records written: ' MERGED-RECORDS-COUNT. DISPLAY-COMPREHENSIVE-STATISTICS. DISPLAY 'Comprehensive Processing Statistics:' DISPLAY '==================================' DISPLAY 'Phase 1 (Sales Sort): ' PHASE-1-RECORDS ' records' DISPLAY 'Phase 2 (Inventory Sort): ' PHASE-2-RECORDS ' records' DISPLAY 'Phase 3 (Merge): ' MERGE-RECORDS ' records' DISPLAY 'Final Output: ' MERGED-RECORDS-COUNT ' records' DISPLAY '' DISPLAY 'Data Quality:' IF PHASE-1-RECORDS + PHASE-2-RECORDS > 0 COMPUTE DATA-QUALITY-SCORE = ((PHASE-1-RECORDS + PHASE-2-RECORDS - VALIDATION-ERRORS) / (PHASE-1-RECORDS + PHASE-2-RECORDS)) * 100 DISPLAY 'Data Quality Score: ' DATA-QUALITY-SCORE '%' END-IF DISPLAY 'Total Validation Errors: ' VALIDATION-ERRORS.