COBOL READ and END-READ represent comprehensive record retrieval mechanisms and sophisticated file input operations within advanced data processing environments, providing intelligent record access capabilities for optimal data retrieval, enhanced file navigation features for complex input workflows, and systematic record reading patterns that enable precise data acquisition, efficient file processing operations, and strategic input control while maintaining data integrity, ensuring predictable read behavior, and enabling flexible input architectures across enterprise applications requiring exact record retrieval, comprehensive file access capabilities, and reliable data input throughout sophisticated business processing scenarios and high-performance file management environments.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349*> Basic READ operations and syntax patterns IDENTIFICATION DIVISION. PROGRAM-ID. READ-DEMONSTRATION. ENVIRONMENT DIVISION. INPUT-OUTPUT SECTION. FILE-CONTROL. *> Sequential file for basic read operations SELECT CUSTOMER-FILE ASSIGN TO "customers.seq" ORGANIZATION IS SEQUENTIAL ACCESS MODE IS SEQUENTIAL FILE STATUS IS WS-CUST-STATUS. *> Indexed file for key-based reads SELECT PRODUCT-FILE ASSIGN TO "products.idx" ORGANIZATION IS INDEXED ACCESS MODE IS RANDOM RECORD KEY IS PROD-KEY ALTERNATE RECORD KEY IS PROD-NAME WITH DUPLICATES FILE STATUS IS WS-PROD-STATUS. *> Relative file for record number access SELECT INVENTORY-FILE ASSIGN TO "inventory.rel" ORGANIZATION IS RELATIVE ACCESS MODE IS DYNAMIC RELATIVE KEY IS WS-REL-KEY FILE STATUS IS WS-INV-STATUS. DATA DIVISION. FILE SECTION. FD CUSTOMER-FILE. 01 CUSTOMER-RECORD. 05 CUST-ID PIC X(8). 05 CUST-NAME PIC X(30). 05 CUST-ADDRESS PIC X(50). 05 CUST-PHONE PIC X(15). 05 CUST-BALANCE PIC S9(7)V99 COMP-3. FD PRODUCT-FILE. 01 PRODUCT-RECORD. 05 PROD-KEY PIC X(10). 05 PROD-NAME PIC X(25). 05 PROD-CATEGORY PIC X(15). 05 PROD-PRICE PIC S9(5)V99 COMP-3. 05 PROD-QUANTITY PIC S9(5) COMP-3. FD INVENTORY-FILE. 01 INVENTORY-RECORD. 05 INV-ITEM-CODE PIC X(12). 05 INV-DESCRIPTION PIC X(40). 05 INV-QTY-ON-HAND PIC S9(7) COMP-3. 05 INV-REORDER-POINT PIC S9(5) COMP-3. 05 INV-UNIT-COST PIC S9(5)V99 COMP-3. WORKING-STORAGE SECTION. 01 WS-FILE-STATUS. 05 WS-CUST-STATUS PIC XX. 05 WS-PROD-STATUS PIC XX. 05 WS-INV-STATUS PIC XX. 01 WS-CONTROL-VARIABLES. 05 WS-REL-KEY PIC 9(6) COMP. 05 WS-EOF-FLAG PIC X VALUE 'N'. 05 WS-RECORD-FOUND PIC X VALUE 'N'. 05 WS-RECORD-COUNT PIC 9(6) VALUE 0. 01 WS-READ-TARGETS. 05 WS-CUSTOMER-COPY PIC X(110). 05 WS-PRODUCT-COPY PIC X(60). 05 WS-INVENTORY-COPY PIC X(100). PROCEDURE DIVISION. MAIN-READ-DEMONSTRATION. DISPLAY "=== COBOL READ AND END-READ DEMONSTRATION ===" PERFORM OPEN-FILES PERFORM DEMONSTRATE-SEQUENTIAL-READ PERFORM DEMONSTRATE-RANDOM-READ PERFORM DEMONSTRATE-DYNAMIC-READ PERFORM DEMONSTRATE-READ-INTO PERFORM DEMONSTRATE-READ-NEXT PERFORM CLOSE-FILES DISPLAY "=== READ DEMONSTRATION COMPLETE ===" STOP RUN. OPEN-FILES. DISPLAY " " DISPLAY "π OPENING FILES FOR READ OPERATIONS" DISPLAY "====================================" OPEN INPUT CUSTOMER-FILE IF WS-CUST-STATUS NOT = "00" DISPLAY "β Error opening customer file: " WS-CUST-STATUS STOP RUN ELSE DISPLAY "β Customer file opened for input" END-IF OPEN I-O PRODUCT-FILE IF WS-PROD-STATUS NOT = "00" DISPLAY "β Error opening product file: " WS-PROD-STATUS STOP RUN ELSE DISPLAY "β Product file opened for I-O" END-IF OPEN I-O INVENTORY-FILE IF WS-INV-STATUS NOT = "00" DISPLAY "β Error opening inventory file: " WS-INV-STATUS STOP RUN ELSE DISPLAY "β Inventory file opened for I-O" END-IF. DEMONSTRATE-SEQUENTIAL-READ. DISPLAY " " DISPLAY "π SEQUENTIAL READ OPERATIONS" DISPLAY "=============================" *> Basic sequential read with AT END MOVE 'N' TO WS-EOF-FLAG MOVE 0 TO WS-RECORD-COUNT PERFORM UNTIL WS-EOF-FLAG = 'Y' READ CUSTOMER-FILE AT END MOVE 'Y' TO WS-EOF-FLAG DISPLAY "β End of customer file reached" NOT AT END ADD 1 TO WS-RECORD-COUNT DISPLAY "Customer " WS-RECORD-COUNT ": " CUST-NAME *> Demonstrate processing logic IF CUST-BALANCE > 1000 DISPLAY " π° High-value customer: $" CUST-BALANCE END-IF END-READ *> Limit display for demonstration IF WS-RECORD-COUNT >= 5 MOVE 'Y' TO WS-EOF-FLAG END-IF END-PERFORM DISPLAY "Total customers read: " WS-RECORD-COUNT. DEMONSTRATE-RANDOM-READ. DISPLAY " " DISPLAY "π― RANDOM READ OPERATIONS" DISPLAY "=========================" *> Direct read by primary key MOVE "PROD001" TO PROD-KEY PERFORM READ-PRODUCT-BY-KEY IF WS-RECORD-FOUND = 'Y' DISPLAY "Product found: " PROD-NAME DISPLAY "Category: " PROD-CATEGORY DISPLAY "Price: $" PROD-PRICE ELSE DISPLAY "Product PROD001 not found" END-IF *> Read by alternate key MOVE "Digital Camera" TO PROD-NAME PERFORM READ-PRODUCT-BY-NAME IF WS-RECORD-FOUND = 'Y' DISPLAY "Found by name: " PROD-KEY DISPLAY "Quantity: " PROD-QUANTITY ELSE DISPLAY "Product 'Digital Camera' not found" END-IF *> Attempt to read non-existent record MOVE "PROD999" TO PROD-KEY PERFORM READ-PRODUCT-BY-KEY IF WS-RECORD-FOUND = 'N' DISPLAY "Product PROD999 not found (expected)" END-IF. READ-PRODUCT-BY-KEY. MOVE 'N' TO WS-RECORD-FOUND READ PRODUCT-FILE INVALID KEY DISPLAY "Invalid key: " PROD-KEY NOT INVALID KEY MOVE 'Y' TO WS-RECORD-FOUND DISPLAY "β Product record read successfully" END-READ. READ-PRODUCT-BY-NAME. MOVE 'N' TO WS-RECORD-FOUND READ PRODUCT-FILE KEY IS PROD-NAME INVALID KEY DISPLAY "Product name not found: " PROD-NAME NOT INVALID KEY MOVE 'Y' TO WS-RECORD-FOUND DISPLAY "β Product found by name" END-READ. DEMONSTRATE-DYNAMIC-READ. DISPLAY " " DISPLAY "π DYNAMIC READ OPERATIONS" DISPLAY "==========================" *> Sequential read in dynamic mode DISPLAY "Reading inventory sequentially..." MOVE 0 TO WS-RECORD-COUNT READ INVENTORY-FILE NEXT RECORD AT END DISPLAY "No inventory records available" NOT AT END ADD 1 TO WS-RECORD-COUNT DISPLAY "First inventory item: " INV-DESCRIPTION DISPLAY "Quantity on hand: " INV-QTY-ON-HAND END-READ *> Random read by relative key MOVE 25 TO WS-REL-KEY PERFORM READ-INVENTORY-BY-RELATIVE-KEY IF WS-RECORD-FOUND = 'Y' DISPLAY "Inventory item 25: " INV-DESCRIPTION DISPLAY "Unit cost: $" INV-UNIT-COST END-IF *> Read next record after random access READ INVENTORY-FILE NEXT RECORD AT END DISPLAY "End of inventory file" NOT AT END DISPLAY "Next inventory item: " INV-DESCRIPTION END-READ. READ-INVENTORY-BY-RELATIVE-KEY. MOVE 'N' TO WS-RECORD-FOUND READ INVENTORY-FILE INVALID KEY DISPLAY "Invalid relative key: " WS-REL-KEY NOT INVALID KEY MOVE 'Y' TO WS-RECORD-FOUND DISPLAY "β Inventory record " WS-REL-KEY " read" END-READ. DEMONSTRATE-READ-INTO. DISPLAY " " DISPLAY "π₯ READ INTO OPERATIONS" DISPLAY "======================" *> Read directly into working storage MOVE "PROD002" TO PROD-KEY READ PRODUCT-FILE INTO WS-PRODUCT-COPY INVALID KEY DISPLAY "Product not found for READ INTO" NOT INVALID KEY DISPLAY "β Product read into working storage" DISPLAY "Copied data length: " FUNCTION LENGTH(WS-PRODUCT-COPY) *> Original record buffer unchanged DISPLAY "Original record key: " PROD-KEY *> Working storage copy can be manipulated MOVE SPACES TO WS-PRODUCT-COPY DISPLAY "Working storage cleared" END-READ *> Sequential read into working storage READ CUSTOMER-FILE INTO WS-CUSTOMER-COPY AT END DISPLAY "No more customers for READ INTO" NOT AT END DISPLAY "β Customer read into working storage" DISPLAY "Customer copy contains: " WS-CUSTOMER-COPY(1:30) END-READ. DEMONSTRATE-READ-NEXT. DISPLAY " " DISPLAY "βοΈ READ NEXT OPERATIONS" DISPLAY "=======================" *> Position at specific key then read next MOVE "PROD001" TO PROD-KEY READ PRODUCT-FILE KEY IS PROD-KEY INVALID KEY DISPLAY "Starting position not found" NOT INVALID KEY DISPLAY "β Positioned at: " PROD-NAME *> Read next records sequentially PERFORM 3 TIMES READ PRODUCT-FILE NEXT RECORD AT END DISPLAY "End of products reached" EXIT PERFORM NOT AT END DISPLAY "Next product: " PROD-NAME DISPLAY " Key: " PROD-KEY DISPLAY " Price: $" PROD-PRICE END-READ END-PERFORM END-READ *> Start from beginning and read next MOVE LOW-VALUES TO PROD-KEY READ PRODUCT-FILE KEY IS GREATER THAN PROD-KEY INVALID KEY DISPLAY "No products in file" NOT INVALID KEY DISPLAY "β First product: " PROD-NAME END-READ. CLOSE-FILES. DISPLAY " " DISPLAY "π CLOSING FILES" DISPLAY "===============" CLOSE CUSTOMER-FILE IF WS-CUST-STATUS NOT = "00" DISPLAY "β Error closing customer file" ELSE DISPLAY "β Customer file closed" END-IF CLOSE PRODUCT-FILE IF WS-PROD-STATUS NOT = "00" DISPLAY "β Error closing product file" ELSE DISPLAY "β Product file closed" END-IF CLOSE INVENTORY-FILE IF WS-INV-STATUS NOT = "00" DISPLAY "β Error closing inventory file" ELSE DISPLAY "β Inventory file closed" END-IF.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511*> Advanced READ techniques with comprehensive error handling IDENTIFICATION DIVISION. PROGRAM-ID. ADVANCED-READ-OPERATIONS. ENVIRONMENT DIVISION. INPUT-OUTPUT SECTION. FILE-CONTROL. SELECT TRANSACTION-FILE ASSIGN TO "transactions.dat" ORGANIZATION IS INDEXED ACCESS MODE IS DYNAMIC RECORD KEY IS TRANS-PRIMARY-KEY ALTERNATE RECORD KEY IS TRANS-DATE-KEY WITH DUPLICATES ALTERNATE RECORD KEY IS TRANS-CUSTOMER-KEY WITH DUPLICATES FILE STATUS IS WS-TRANS-STATUS. SELECT LOG-FILE ASSIGN TO "process.log" ORGANIZATION IS SEQUENTIAL ACCESS MODE IS SEQUENTIAL FILE STATUS IS WS-LOG-STATUS. DATA DIVISION. FILE SECTION. FD TRANSACTION-FILE. 01 TRANSACTION-RECORD. 05 TRANS-PRIMARY-KEY PIC X(15). 05 TRANS-DATE-KEY PIC 9(8). 05 TRANS-CUSTOMER-KEY PIC X(8). 05 TRANS-TYPE PIC X(3). 05 TRANS-AMOUNT PIC S9(9)V99 COMP-3. 05 TRANS-DESCRIPTION PIC X(50). 05 TRANS-STATUS PIC X. 05 TRANS-PROCESSED-BY PIC X(8). 05 TRANS-TIMESTAMP PIC X(14). FD LOG-FILE. 01 LOG-RECORD PIC X(200). WORKING-STORAGE SECTION. 01 WS-FILE-STATUS. 05 WS-TRANS-STATUS PIC XX. 05 WS-LOG-STATUS PIC XX. 01 WS-READ-CONTROL. 05 WS-READ-SUCCESSFUL PIC X VALUE 'N'. 05 WS-RETRY-COUNT PIC 9(2) VALUE 0. 05 WS-MAX-RETRIES PIC 9(2) VALUE 3. 05 WS-TIMEOUT-SECONDS PIC 9(3) VALUE 30. 01 WS-BATCH-PROCESSING. 05 WS-BATCH-KEYS OCCURS 50 TIMES. 10 WS-BATCH-KEY PIC X(15). 10 WS-BATCH-RESULT PIC X. 05 WS-BATCH-SIZE PIC 9(2) VALUE 0. 05 WS-CURRENT-BATCH PIC 9(2) VALUE 0. 01 WS-PERFORMANCE-METRICS. 05 WS-TOTAL-READS PIC 9(7) VALUE 0. 05 WS-SUCCESSFUL-READS PIC 9(7) VALUE 0. 05 WS-FAILED-READS PIC 9(7) VALUE 0. 05 WS-RETRY-ATTEMPTS PIC 9(7) VALUE 0. 05 WS-START-TIME PIC 9(8). 05 WS-END-TIME PIC 9(8). 01 WS-SEARCH-CRITERIA. 05 WS-DATE-FROM PIC 9(8). 05 WS-DATE-TO PIC 9(8). 05 WS-CUSTOMER-LIST OCCURS 10 TIMES. 10 WS-CUSTOMER-ID PIC X(8). 05 WS-AMOUNT-THRESHOLD PIC S9(9)V99 COMP-3. 01 WS-BUFFER-MANAGEMENT. 05 WS-READ-BUFFER PIC X(200). 05 WS-BACKUP-RECORD PIC X(200). 05 WS-BUFFER-VALID PIC X VALUE 'N'. PROCEDURE DIVISION. MAIN-ADVANCED-READ-PROCESSING. DISPLAY "=== ADVANCED READ OPERATIONS ===" PERFORM INITIALIZE-ADVANCED-PROCESSING PERFORM DEMONSTRATE-ERROR-HANDLING-READS PERFORM DEMONSTRATE-BATCH-READING PERFORM DEMONSTRATE-CONDITIONAL-READING PERFORM DEMONSTRATE-BUFFERED-READING PERFORM DEMONSTRATE-PERFORMANCE-READING PERFORM DISPLAY-READ-METRICS PERFORM CLEANUP-ADVANCED-PROCESSING DISPLAY "=== ADVANCED READ PROCESSING COMPLETE ===" STOP RUN. INITIALIZE-ADVANCED-PROCESSING. DISPLAY " " DISPLAY "π INITIALIZING ADVANCED READ PROCESSING" DISPLAY "========================================" OPEN I-O TRANSACTION-FILE IF WS-TRANS-STATUS NOT = "00" DISPLAY "β Error opening transaction file: " WS-TRANS-STATUS STOP RUN ELSE DISPLAY "β Transaction file opened successfully" END-IF OPEN OUTPUT LOG-FILE IF WS-LOG-STATUS NOT = "00" DISPLAY "β Error opening log file: " WS-LOG-STATUS ELSE DISPLAY "β Log file opened successfully" END-IF MOVE FUNCTION CURRENT-DATE(9:6) TO WS-START-TIME MOVE 0 TO WS-TOTAL-READS MOVE 0 TO WS-SUCCESSFUL-READS MOVE 0 TO WS-FAILED-READS MOVE 0 TO WS-RETRY-ATTEMPTS. DEMONSTRATE-ERROR-HANDLING-READS. DISPLAY " " DISPLAY "π‘οΈ ERROR HANDLING READ OPERATIONS" DISPLAY "==================================" *> Read with comprehensive error handling MOVE "TRANS123456789A" TO TRANS-PRIMARY-KEY PERFORM READ-WITH-ERROR-HANDLING *> Read non-existent record with retry MOVE "NONEXISTENT001" TO TRANS-PRIMARY-KEY PERFORM READ-WITH-RETRY-LOGIC *> Read with timeout simulation MOVE "TRANS999999999Z" TO TRANS-PRIMARY-KEY PERFORM READ-WITH-TIMEOUT-HANDLING. READ-WITH-ERROR-HANDLING. MOVE 'N' TO WS-READ-SUCCESSFUL ADD 1 TO WS-TOTAL-READS READ TRANSACTION-FILE INVALID KEY ADD 1 TO WS-FAILED-READS PERFORM LOG-READ-ERROR DISPLAY "β Transaction not found: " TRANS-PRIMARY-KEY NOT INVALID KEY ADD 1 TO WS-SUCCESSFUL-READS MOVE 'Y' TO WS-READ-SUCCESSFUL DISPLAY "β Transaction read: " TRANS-DESCRIPTION PERFORM LOG-READ-SUCCESS END-READ *> Additional file status checking EVALUATE WS-TRANS-STATUS WHEN "00" CONTINUE WHEN "23" DISPLAY "β οΈ Record not found" WHEN "10" DISPLAY "β οΈ End of file" WHEN "30" DISPLAY "β Permanent error" WHEN OTHER DISPLAY "β Unexpected file status: " WS-TRANS-STATUS END-EVALUATE. READ-WITH-RETRY-LOGIC. MOVE 0 TO WS-RETRY-COUNT MOVE 'N' TO WS-READ-SUCCESSFUL PERFORM UNTIL WS-READ-SUCCESSFUL = 'Y' OR WS-RETRY-COUNT >= WS-MAX-RETRIES ADD 1 TO WS-RETRY-COUNT ADD 1 TO WS-RETRY-ATTEMPTS READ TRANSACTION-FILE INVALID KEY DISPLAY "β Retry " WS-RETRY-COUNT " failed for: " TRANS-PRIMARY-KEY IF WS-RETRY-COUNT < WS-MAX-RETRIES DISPLAY "β³ Waiting before retry..." *> Simulate wait (would use CALL "CBL_OC_NANOSLEEP" in real code) END-IF NOT INVALID KEY MOVE 'Y' TO WS-READ-SUCCESSFUL DISPLAY "β Retry " WS-RETRY-COUNT " successful" END-READ END-PERFORM IF WS-READ-SUCCESSFUL = 'N' DISPLAY "β All retry attempts failed" PERFORM LOG-READ-FAILURE END-IF. READ-WITH-TIMEOUT-HANDLING. DISPLAY "π Simulating read with timeout handling..." *> In real application, this would involve actual timeout logic MOVE 'N' TO WS-READ-SUCCESSFUL READ TRANSACTION-FILE INVALID KEY DISPLAY "β Read timeout for: " TRANS-PRIMARY-KEY PERFORM LOG-READ-TIMEOUT NOT INVALID KEY MOVE 'Y' TO WS-READ-SUCCESSFUL DISPLAY "β Read completed within timeout" END-READ. DEMONSTRATE-BATCH-READING. DISPLAY " " DISPLAY "π¦ BATCH READ OPERATIONS" DISPLAY "=======================" *> Setup batch of keys to read PERFORM SETUP-BATCH-KEYS *> Process batch with performance tracking PERFORM PROCESS-BATCH-READS *> Display batch results PERFORM DISPLAY-BATCH-RESULTS. SETUP-BATCH-KEYS. MOVE 5 TO WS-BATCH-SIZE MOVE "TRANS000000001A" TO WS-BATCH-KEY(1) MOVE "TRANS000000002B" TO WS-BATCH-KEY(2) MOVE "TRANS000000003C" TO WS-BATCH-KEY(3) MOVE "TRANS000000004D" TO WS-BATCH-KEY(4) MOVE "TRANS000000005E" TO WS-BATCH-KEY(5) DISPLAY "β Batch of " WS-BATCH-SIZE " keys prepared". PROCESS-BATCH-READS. MOVE 0 TO WS-CURRENT-BATCH PERFORM VARYING WS-CURRENT-BATCH FROM 1 BY 1 UNTIL WS-CURRENT-BATCH > WS-BATCH-SIZE MOVE WS-BATCH-KEY(WS-CURRENT-BATCH) TO TRANS-PRIMARY-KEY READ TRANSACTION-FILE INVALID KEY MOVE 'N' TO WS-BATCH-RESULT(WS-CURRENT-BATCH) DISPLAY "β Batch item " WS-CURRENT-BATCH " failed" NOT INVALID KEY MOVE 'Y' TO WS-BATCH-RESULT(WS-CURRENT-BATCH) DISPLAY "β Batch item " WS-CURRENT-BATCH " success" *> Process the record PERFORM PROCESS-BATCH-RECORD END-READ END-PERFORM. PROCESS-BATCH-RECORD. *> Example batch processing IF TRANS-AMOUNT > 1000 DISPLAY " π° High-value transaction: $" TRANS-AMOUNT END-IF IF TRANS-STATUS = 'P' DISPLAY " β³ Pending transaction" END-IF. DISPLAY-BATCH-RESULTS. MOVE 0 TO WS-CURRENT-BATCH DISPLAY "π Batch Processing Summary:" PERFORM VARYING WS-CURRENT-BATCH FROM 1 BY 1 UNTIL WS-CURRENT-BATCH > WS-BATCH-SIZE IF WS-BATCH-RESULT(WS-CURRENT-BATCH) = 'Y' ADD 1 TO WS-SUCCESSFUL-READS ELSE ADD 1 TO WS-FAILED-READS END-IF END-PERFORM. DEMONSTRATE-CONDITIONAL-READING. DISPLAY " " DISPLAY "π CONDITIONAL READ OPERATIONS" DISPLAY "==============================" *> Read by date range MOVE 20231001 TO WS-DATE-FROM MOVE 20231031 TO WS-DATE-TO PERFORM READ-BY-DATE-RANGE *> Read by customer criteria MOVE "CUST0001" TO WS-CUSTOMER-ID(1) MOVE "CUST0002" TO WS-CUSTOMER-ID(2) PERFORM READ-BY-CUSTOMER-LIST *> Read by amount threshold MOVE 5000.00 TO WS-AMOUNT-THRESHOLD PERFORM READ-BY-AMOUNT-THRESHOLD. READ-BY-DATE-RANGE. DISPLAY "π Reading transactions by date range..." MOVE WS-DATE-FROM TO TRANS-DATE-KEY READ TRANSACTION-FILE KEY IS GREATER THAN OR EQUAL TO TRANS-DATE-KEY INVALID KEY DISPLAY "β No transactions in date range" NOT INVALID KEY DISPLAY "β First transaction in range: " TRANS-DATE-KEY DISPLAY " Description: " TRANS-DESCRIPTION *> Continue reading in range PERFORM READ-NEXT-IN-DATE-RANGE END-READ. READ-NEXT-IN-DATE-RANGE. PERFORM 3 TIMES READ TRANSACTION-FILE NEXT RECORD AT END DISPLAY "End of file reached" EXIT PERFORM NOT AT END IF TRANS-DATE-KEY <= WS-DATE-TO DISPLAY " Transaction: " TRANS-DATE-KEY " Amount: $" TRANS-AMOUNT ELSE DISPLAY " Beyond date range, stopping" EXIT PERFORM END-IF END-READ END-PERFORM. READ-BY-CUSTOMER-LIST. DISPLAY "π₯ Reading transactions by customer list..." PERFORM VARYING WS-CURRENT-BATCH FROM 1 BY 1 UNTIL WS-CURRENT-BATCH > 2 MOVE WS-CUSTOMER-ID(WS-CURRENT-BATCH) TO TRANS-CUSTOMER-KEY READ TRANSACTION-FILE KEY IS TRANS-CUSTOMER-KEY INVALID KEY DISPLAY "β No transactions for customer: " TRANS-CUSTOMER-KEY NOT INVALID KEY DISPLAY "β Found transaction for: " TRANS-CUSTOMER-KEY DISPLAY " Amount: $" TRANS-AMOUNT DISPLAY " Type: " TRANS-TYPE END-READ END-PERFORM. READ-BY-AMOUNT-THRESHOLD. DISPLAY "π° Reading high-value transactions..." *> Start from beginning and scan for high-value transactions MOVE LOW-VALUES TO TRANS-PRIMARY-KEY READ TRANSACTION-FILE KEY IS GREATER THAN TRANS-PRIMARY-KEY INVALID KEY DISPLAY "β No transactions in file" NOT INVALID KEY PERFORM CHECK-AMOUNT-THRESHOLD *> Read additional records PERFORM 5 TIMES READ TRANSACTION-FILE NEXT RECORD AT END EXIT PERFORM NOT AT END PERFORM CHECK-AMOUNT-THRESHOLD END-READ END-PERFORM END-READ. CHECK-AMOUNT-THRESHOLD. IF TRANS-AMOUNT >= WS-AMOUNT-THRESHOLD DISPLAY "β High-value transaction: " TRANS-PRIMARY-KEY DISPLAY " Amount: $" TRANS-AMOUNT DISPLAY " Customer: " TRANS-CUSTOMER-KEY END-IF. DEMONSTRATE-BUFFERED-READING. DISPLAY " " DISPLAY "πΎ BUFFERED READ OPERATIONS" DISPLAY "==========================" *> Read with buffer management MOVE "TRANS111111111A" TO TRANS-PRIMARY-KEY PERFORM READ-WITH-BUFFER *> Access buffered data PERFORM ACCESS-BUFFERED-DATA *> Refresh buffer if needed PERFORM REFRESH-BUFFER. READ-WITH-BUFFER. MOVE 'N' TO WS-BUFFER-VALID READ TRANSACTION-FILE INTO WS-READ-BUFFER INVALID KEY DISPLAY "β Buffer read failed" NOT INVALID KEY MOVE WS-READ-BUFFER TO WS-BACKUP-RECORD MOVE 'Y' TO WS-BUFFER-VALID DISPLAY "β Record buffered successfully" END-READ. ACCESS-BUFFERED-DATA. IF WS-BUFFER-VALID = 'Y' DISPLAY "π Accessing buffered data..." DISPLAY " Buffer contains: " WS-READ-BUFFER(1:50) DISPLAY " Backup available: " WS-BACKUP-RECORD(1:50) ELSE DISPLAY "β No valid buffer data" END-IF. REFRESH-BUFFER. IF WS-BUFFER-VALID = 'Y' DISPLAY "π Refreshing buffer..." MOVE WS-BACKUP-RECORD TO WS-READ-BUFFER DISPLAY "β Buffer refreshed from backup" END-IF. DEMONSTRATE-PERFORMANCE-READING. DISPLAY " " DISPLAY "β‘ PERFORMANCE READ OPERATIONS" DISPLAY "=============================" *> Time-based performance measurement MOVE FUNCTION CURRENT-DATE(9:6) TO WS-START-TIME *> Perform bulk read operations PERFORM BULK-READ-OPERATIONS MOVE FUNCTION CURRENT-DATE(9:6) TO WS-END-TIME PERFORM CALCULATE-READ-PERFORMANCE. BULK-READ-OPERATIONS. DISPLAY "π Performing bulk read operations..." *> Read multiple records for performance testing PERFORM VARYING WS-CURRENT-BATCH FROM 1 BY 1 UNTIL WS-CURRENT-BATCH > 10 MOVE WS-CURRENT-BATCH TO TRANS-PRIMARY-KEY(11:5) READ TRANSACTION-FILE INVALID KEY CONTINUE NOT INVALID KEY ADD 1 TO WS-SUCCESSFUL-READS END-READ ADD 1 TO WS-TOTAL-READS END-PERFORM. CALCULATE-READ-PERFORMANCE. COMPUTE WS-CURRENT-BATCH = WS-END-TIME - WS-START-TIME DISPLAY "π Performance Results:" DISPLAY " Elapsed time: " WS-CURRENT-BATCH " seconds" DISPLAY " Total reads: " WS-TOTAL-READS DISPLAY " Reads per second: " WS-TOTAL-READS / WS-CURRENT-BATCH. LOG-READ-SUCCESS. STRING "SUCCESS: Read " TRANS-PRIMARY-KEY " at " FUNCTION CURRENT-DATE(9:14) DELIMITED BY SIZE INTO LOG-RECORD WRITE LOG-RECORD. LOG-READ-ERROR. STRING "ERROR: Failed to read " TRANS-PRIMARY-KEY " at " FUNCTION CURRENT-DATE(9:14) " Status: " WS-TRANS-STATUS DELIMITED BY SIZE INTO LOG-RECORD WRITE LOG-RECORD. LOG-READ-FAILURE. STRING "FAILURE: All retries exhausted for " TRANS-PRIMARY-KEY " at " FUNCTION CURRENT-DATE(9:14) DELIMITED BY SIZE INTO LOG-RECORD WRITE LOG-RECORD. LOG-READ-TIMEOUT. STRING "TIMEOUT: Read timeout for " TRANS-PRIMARY-KEY " at " FUNCTION CURRENT-DATE(9:14) DELIMITED BY SIZE INTO LOG-RECORD WRITE LOG-RECORD. DISPLAY-READ-METRICS. DISPLAY " " DISPLAY "π READ OPERATION METRICS" DISPLAY "========================" DISPLAY "Total read attempts: " WS-TOTAL-READS DISPLAY "Successful reads: " WS-SUCCESSFUL-READS DISPLAY "Failed reads: " WS-FAILED-READS DISPLAY "Retry attempts: " WS-RETRY-ATTEMPTS IF WS-TOTAL-READS > 0 COMPUTE WS-CURRENT-BATCH = (WS-SUCCESSFUL-READS / WS-TOTAL-READS) * 100 DISPLAY "Success rate: " WS-CURRENT-BATCH "%" END-IF. CLEANUP-ADVANCED-PROCESSING. DISPLAY " " DISPLAY "π§Ή CLEANUP PROCESSING" DISPLAY "====================" CLOSE TRANSACTION-FILE CLOSE LOG-FILE DISPLAY "β All files closed successfully".