COBOL RANDOM represents sophisticated direct access methodologies and comprehensive non-sequential file processing capabilities within advanced data management environments, providing intelligent key-based retrieval mechanisms for optimal record positioning, enhanced random access features for complex file navigation workflows, and systematic direct access patterns that enable precise record location, efficient data retrieval operations, and strategic file positioning while maintaining access performance, ensuring predictable retrieval behavior, and enabling flexible access architectures across enterprise applications requiring exact record targeting, comprehensive random access capabilities, and reliable direct positioning throughout sophisticated business data processing scenarios and high-performance file management environments.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384*> RANDOM access file definitions and basic operations IDENTIFICATION DIVISION. PROGRAM-ID. RANDOM-ACCESS-DEMO. ENVIRONMENT DIVISION. INPUT-OUTPUT SECTION. FILE-CONTROL. *> Indexed file with RANDOM access SELECT CUSTOMER-FILE ASSIGN TO "customers.dat" ORGANIZATION IS INDEXED ACCESS MODE IS RANDOM RECORD KEY IS CUST-KEY FILE STATUS IS WS-CUST-STATUS. *> Relative file with RANDOM access SELECT INVENTORY-FILE ASSIGN TO "inventory.rel" ORGANIZATION IS RELATIVE ACCESS MODE IS RANDOM RELATIVE KEY IS WS-REL-KEY FILE STATUS IS WS-INV-STATUS. *> Multiple key indexed file SELECT PRODUCT-FILE ASSIGN TO "products.idx" ORGANIZATION IS INDEXED ACCESS MODE IS RANDOM RECORD KEY IS PROD-PRIMARY-KEY ALTERNATE RECORD KEY IS PROD-NAME-KEY WITH DUPLICATES ALTERNATE RECORD KEY IS PROD-CATEGORY-KEY WITH DUPLICATES FILE STATUS IS WS-PROD-STATUS. DATA DIVISION. FILE SECTION. *> Customer file record FD CUSTOMER-FILE. 01 CUSTOMER-RECORD. 05 CUST-KEY PIC X(8). 05 CUST-NAME PIC X(40). 05 CUST-ADDRESS PIC X(60). 05 CUST-PHONE PIC X(15). 05 CUST-BALANCE PIC S9(7)V99 COMP-3. 05 CUST-CREDIT-LIMIT PIC S9(7)V99 COMP-3. 05 CUST-STATUS PIC X. 05 FILLER PIC X(10). *> Inventory file record FD INVENTORY-FILE. 01 INVENTORY-RECORD. 05 INV-ITEM-CODE PIC X(10). 05 INV-DESCRIPTION PIC X(50). 05 INV-QUANTITY PIC S9(7) COMP-3. 05 INV-UNIT-COST PIC S9(5)V99 COMP-3. 05 INV-REORDER-LEVEL PIC S9(5) COMP-3. 05 INV-SUPPLIER-CODE PIC X(8). 05 FILLER PIC X(15). *> Product file record FD PRODUCT-FILE. 01 PRODUCT-RECORD. 05 PROD-PRIMARY-KEY PIC X(12). 05 PROD-NAME-KEY PIC X(30). 05 PROD-CATEGORY-KEY PIC X(15). 05 PROD-DESCRIPTION PIC X(100). 05 PROD-PRICE PIC S9(7)V99 COMP-3. 05 PROD-WEIGHT PIC S9(5)V99 COMP-3. 05 PROD-DIMENSIONS PIC X(20). 05 FILLER PIC X(20). WORKING-STORAGE SECTION. 01 WS-FILE-STATUS-CODES. 05 WS-CUST-STATUS PIC XX. 05 WS-INV-STATUS PIC XX. 05 WS-PROD-STATUS PIC XX. 01 WS-ACCESS-KEYS. 05 WS-REL-KEY PIC 9(6) COMP. 05 WS-SEARCH-KEY PIC X(30). 05 WS-CATEGORY-KEY PIC X(15). 01 WS-OPERATION-CONTROLS. 05 WS-RECORD-FOUND PIC X VALUE 'N'. 05 WS-OPERATION-SUCCESS PIC X VALUE 'N'. 05 WS-RETRY-COUNT PIC 9(2) VALUE 0. 05 WS-MAX-RETRIES PIC 9(2) VALUE 3. PROCEDURE DIVISION. MAIN-RANDOM-ACCESS-DEMO. DISPLAY "=== COBOL RANDOM ACCESS DEMONSTRATION ===" PERFORM OPEN-FILES PERFORM DEMONSTRATE-INDEXED-RANDOM-ACCESS PERFORM DEMONSTRATE-RELATIVE-RANDOM-ACCESS PERFORM DEMONSTRATE-ALTERNATE-KEY-ACCESS PERFORM DEMONSTRATE-RANDOM-UPDATE-OPERATIONS PERFORM CLOSE-FILES DISPLAY "=== RANDOM ACCESS DEMO COMPLETE ===" STOP RUN. OPEN-FILES. DISPLAY " " DISPLAY "📂 OPENING FILES FOR RANDOM ACCESS" DISPLAY "==================================" OPEN I-O CUSTOMER-FILE IF WS-CUST-STATUS NOT = "00" DISPLAY "❌ Error opening customer file: " WS-CUST-STATUS STOP RUN ELSE DISPLAY "✅ Customer file opened successfully" 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 successfully" 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 successfully" END-IF. DEMONSTRATE-INDEXED-RANDOM-ACCESS. DISPLAY " " DISPLAY "🔍 INDEXED FILE RANDOM ACCESS" DISPLAY "=============================" *> Direct access by primary key MOVE "CUST0001" TO CUST-KEY PERFORM READ-CUSTOMER-BY-KEY IF WS-RECORD-FOUND = 'Y' DISPLAY "Customer found: " CUST-NAME DISPLAY "Balance: " CUST-BALANCE DISPLAY "Status: " CUST-STATUS ELSE DISPLAY "Customer CUST0001 not found" END-IF *> Access another customer directly MOVE "CUST0025" TO CUST-KEY PERFORM READ-CUSTOMER-BY-KEY IF WS-RECORD-FOUND = 'Y' DISPLAY "Customer found: " CUST-NAME DISPLAY "Credit limit: " CUST-CREDIT-LIMIT ELSE DISPLAY "Customer CUST0025 not found" END-IF *> Access non-existent customer MOVE "CUST9999" TO CUST-KEY PERFORM READ-CUSTOMER-BY-KEY IF WS-RECORD-FOUND = 'N' DISPLAY "Customer CUST9999 not found (expected)" END-IF. READ-CUSTOMER-BY-KEY. MOVE 'N' TO WS-RECORD-FOUND READ CUSTOMER-FILE INVALID KEY DISPLAY "Invalid key for customer: " CUST-KEY NOT INVALID KEY MOVE 'Y' TO WS-RECORD-FOUND DISPLAY "✅ Customer record read successfully" END-READ. DEMONSTRATE-RELATIVE-RANDOM-ACCESS. DISPLAY " " DISPLAY "🎯 RELATIVE FILE RANDOM ACCESS" DISPLAY "==============================" *> Access record at relative position 1 MOVE 1 TO WS-REL-KEY PERFORM READ-INVENTORY-BY-RELATIVE-KEY IF WS-RECORD-FOUND = 'Y' DISPLAY "Inventory item: " INV-DESCRIPTION DISPLAY "Quantity: " INV-QUANTITY DISPLAY "Unit cost: " INV-UNIT-COST END-IF *> Access record at relative position 50 MOVE 50 TO WS-REL-KEY PERFORM READ-INVENTORY-BY-RELATIVE-KEY IF WS-RECORD-FOUND = 'Y' DISPLAY "Item 50: " INV-DESCRIPTION DISPLAY "Supplier: " INV-SUPPLIER-CODE END-IF *> Access record at relative position 100 MOVE 100 TO WS-REL-KEY PERFORM READ-INVENTORY-BY-RELATIVE-KEY IF WS-RECORD-FOUND = 'Y' DISPLAY "Item 100: " INV-DESCRIPTION DISPLAY "Reorder level: " INV-REORDER-LEVEL ELSE DISPLAY "Inventory record 100 not found" END-IF. 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 successfully" END-READ. DEMONSTRATE-ALTERNATE-KEY-ACCESS. DISPLAY " " DISPLAY "🔑 ALTERNATE KEY RANDOM ACCESS" DISPLAY "==============================" *> Access by product name (alternate key) MOVE "Digital Camera Pro" TO PROD-NAME-KEY PERFORM READ-PRODUCT-BY-NAME IF WS-RECORD-FOUND = 'Y' DISPLAY "Product: " PROD-DESCRIPTION DISPLAY "Price: " PROD-PRICE DISPLAY "Category: " PROD-CATEGORY-KEY END-IF *> Access by category (alternate key with duplicates) MOVE "ELECTRONICS" TO PROD-CATEGORY-KEY PERFORM READ-PRODUCT-BY-CATEGORY IF WS-RECORD-FOUND = 'Y' DISPLAY "Found product in ELECTRONICS:" DISPLAY "Name: " PROD-NAME-KEY DISPLAY "Price: " PROD-PRICE END-IF *> Access by primary key MOVE "PROD00000123" TO PROD-PRIMARY-KEY PERFORM READ-PRODUCT-BY-PRIMARY-KEY IF WS-RECORD-FOUND = 'Y' DISPLAY "Product by ID: " PROD-DESCRIPTION DISPLAY "Weight: " PROD-WEIGHT DISPLAY "Dimensions: " PROD-DIMENSIONS END-IF. READ-PRODUCT-BY-NAME. MOVE 'N' TO WS-RECORD-FOUND READ PRODUCT-FILE KEY IS PROD-NAME-KEY INVALID KEY DISPLAY "Product name not found: " PROD-NAME-KEY NOT INVALID KEY MOVE 'Y' TO WS-RECORD-FOUND DISPLAY "✅ Product found by name" END-READ. READ-PRODUCT-BY-CATEGORY. MOVE 'N' TO WS-RECORD-FOUND READ PRODUCT-FILE KEY IS PROD-CATEGORY-KEY INVALID KEY DISPLAY "No products in category: " PROD-CATEGORY-KEY NOT INVALID KEY MOVE 'Y' TO WS-RECORD-FOUND DISPLAY "✅ Product found in category" END-READ. READ-PRODUCT-BY-PRIMARY-KEY. MOVE 'N' TO WS-RECORD-FOUND READ PRODUCT-FILE INVALID KEY DISPLAY "Product ID not found: " PROD-PRIMARY-KEY NOT INVALID KEY MOVE 'Y' TO WS-RECORD-FOUND DISPLAY "✅ Product found by primary key" END-READ. DEMONSTRATE-RANDOM-UPDATE-OPERATIONS. DISPLAY " " DISPLAY "✏️ RANDOM UPDATE OPERATIONS" DISPLAY "============================" *> Update customer balance randomly MOVE "CUST0001" TO CUST-KEY PERFORM UPDATE-CUSTOMER-BALANCE *> Update inventory quantity randomly MOVE 25 TO WS-REL-KEY PERFORM UPDATE-INVENTORY-QUANTITY *> Update product price randomly MOVE "PROD00000456" TO PROD-PRIMARY-KEY PERFORM UPDATE-PRODUCT-PRICE. UPDATE-CUSTOMER-BALANCE. MOVE 'N' TO WS-OPERATION-SUCCESS READ CUSTOMER-FILE INVALID KEY DISPLAY "Customer not found for update: " CUST-KEY NOT INVALID KEY ADD 500.00 TO CUST-BALANCE REWRITE CUSTOMER-RECORD INVALID KEY DISPLAY "Error updating customer: " CUST-KEY NOT INVALID KEY MOVE 'Y' TO WS-OPERATION-SUCCESS DISPLAY "✅ Customer balance updated: " CUST-BALANCE END-REWRITE END-READ. UPDATE-INVENTORY-QUANTITY. MOVE 'N' TO WS-OPERATION-SUCCESS READ INVENTORY-FILE INVALID KEY DISPLAY "Inventory item not found: " WS-REL-KEY NOT INVALID KEY SUBTRACT 10 FROM INV-QUANTITY REWRITE INVENTORY-RECORD INVALID KEY DISPLAY "Error updating inventory: " WS-REL-KEY NOT INVALID KEY MOVE 'Y' TO WS-OPERATION-SUCCESS DISPLAY "✅ Inventory quantity updated: " INV-QUANTITY END-REWRITE END-READ. UPDATE-PRODUCT-PRICE. MOVE 'N' TO WS-OPERATION-SUCCESS READ PRODUCT-FILE INVALID KEY DISPLAY "Product not found for update: " PROD-PRIMARY-KEY NOT INVALID KEY MULTIPLY PROD-PRICE BY 1.10 REWRITE PRODUCT-RECORD INVALID KEY DISPLAY "Error updating product: " PROD-PRIMARY-KEY NOT INVALID KEY MOVE 'Y' TO WS-OPERATION-SUCCESS DISPLAY "✅ Product price updated: " PROD-PRICE END-REWRITE END-READ. CLOSE-FILES. DISPLAY " " DISPLAY "🔒 CLOSING FILES" DISPLAY "===============" CLOSE CUSTOMER-FILE IF WS-CUST-STATUS NOT = "00" DISPLAY "❌ Error closing customer file: " WS-CUST-STATUS ELSE DISPLAY "✅ Customer file closed successfully" END-IF CLOSE INVENTORY-FILE IF WS-INV-STATUS NOT = "00" DISPLAY "❌ Error closing inventory file: " WS-INV-STATUS ELSE DISPLAY "✅ Inventory file closed successfully" END-IF CLOSE PRODUCT-FILE IF WS-PROD-STATUS NOT = "00" DISPLAY "❌ Error closing product file: " WS-PROD-STATUS ELSE DISPLAY "✅ Product file closed successfully" END-IF.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440*> Advanced random access patterns and optimization techniques IDENTIFICATION DIVISION. PROGRAM-ID. ADVANCED-RANDOM-ACCESS. ENVIRONMENT DIVISION. INPUT-OUTPUT SECTION. FILE-CONTROL. *> High-performance indexed file with multiple keys SELECT TRANSACTION-FILE ASSIGN TO "transactions.idx" ORGANIZATION IS INDEXED ACCESS MODE IS RANDOM RECORD KEY IS TRANS-PRIMARY-KEY ALTERNATE RECORD KEY IS TRANS-DATE-KEY WITH DUPLICATES ALTERNATE RECORD KEY IS TRANS-CUSTOMER-KEY WITH DUPLICATES ALTERNATE RECORD KEY IS TRANS-AMOUNT-KEY WITH DUPLICATES FILE STATUS IS WS-TRANS-STATUS. *> Cache lookup file for performance SELECT CACHE-FILE ASSIGN TO "cache.rel" ORGANIZATION IS RELATIVE ACCESS MODE IS RANDOM RELATIVE KEY IS WS-CACHE-KEY FILE STATUS IS WS-CACHE-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-AMOUNT-KEY PIC S9(9)V99 COMP-3. 05 TRANS-TYPE PIC X(3). 05 TRANS-DESCRIPTION PIC X(50). 05 TRANS-REFERENCE PIC X(20). 05 TRANS-STATUS PIC X. 05 TRANS-CREATED-BY PIC X(8). 05 TRANS-TIMESTAMP PIC X(20). 05 FILLER PIC X(20). FD CACHE-FILE. 01 CACHE-RECORD. 05 CACHE-KEY-VALUE PIC X(20). 05 CACHE-DATA PIC X(200). 05 CACHE-TIMESTAMP PIC 9(8). 05 CACHE-EXPIRY PIC 9(8). 05 CACHE-HIT-COUNT PIC 9(7) COMP-3. 05 FILLER PIC X(15). WORKING-STORAGE SECTION. 01 WS-FILE-STATUS-CODES. 05 WS-TRANS-STATUS PIC XX. 05 WS-CACHE-STATUS PIC XX. 01 WS-RANDOM-ACCESS-KEYS. 05 WS-CACHE-KEY PIC 9(6) COMP. 05 WS-LOOKUP-KEY PIC X(20). 05 WS-SEARCH-DATE PIC 9(8). 05 WS-CUSTOMER-ID PIC X(8). 05 WS-AMOUNT-RANGE PIC S9(9)V99 COMP-3. 01 WS-PERFORMANCE-METRICS. 05 WS-RANDOM-READS PIC 9(7) VALUE 0. 05 WS-CACHE-HITS PIC 9(7) VALUE 0. 05 WS-CACHE-MISSES PIC 9(7) VALUE 0. 05 WS-UPDATE-COUNT PIC 9(7) VALUE 0. 05 WS-ERROR-COUNT PIC 9(5) VALUE 0. 01 WS-BATCH-PROCESSING. 05 WS-BATCH-KEYS OCCURS 100 TIMES. 10 WS-BATCH-KEY PIC X(15). 10 WS-BATCH-STATUS PIC X. 05 WS-BATCH-SIZE PIC 9(3) VALUE 0. 05 WS-BATCH-PROCESSED PIC 9(3) VALUE 0. 01 WS-OPTIMIZATION-FLAGS. 05 WS-USE-CACHE PIC X VALUE 'Y'. 05 WS-BATCH-MODE PIC X VALUE 'N'. 05 WS-PREFETCH-MODE PIC X VALUE 'N'. 05 WS-PERFORMANCE-LOG PIC X VALUE 'Y'. PROCEDURE DIVISION. MAIN-ADVANCED-RANDOM-ACCESS. DISPLAY "=== ADVANCED RANDOM ACCESS PATTERNS ===" PERFORM INITIALIZE-ADVANCED-PROCESSING PERFORM DEMONSTRATE-CACHED-RANDOM-ACCESS PERFORM DEMONSTRATE-BATCH-RANDOM-PROCESSING PERFORM DEMONSTRATE-MULTI-KEY-RANDOM-ACCESS PERFORM DEMONSTRATE-PERFORMANCE-OPTIMIZATION PERFORM DISPLAY-PERFORMANCE-METRICS PERFORM CLEANUP-ADVANCED-PROCESSING DISPLAY "=== ADVANCED RANDOM ACCESS COMPLETE ===" STOP RUN. INITIALIZE-ADVANCED-PROCESSING. DISPLAY " " DISPLAY "🚀 INITIALIZING ADVANCED 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 for random access" END-IF OPEN I-O CACHE-FILE IF WS-CACHE-STATUS NOT = "00" DISPLAY "❌ Error opening cache file: " WS-CACHE-STATUS STOP RUN ELSE DISPLAY "✅ Cache file opened for random access" END-IF *> Initialize performance counters MOVE 0 TO WS-RANDOM-READS MOVE 0 TO WS-CACHE-HITS MOVE 0 TO WS-CACHE-MISSES MOVE 0 TO WS-UPDATE-COUNT MOVE 0 TO WS-ERROR-COUNT DISPLAY "✅ Performance metrics initialized". DEMONSTRATE-CACHED-RANDOM-ACCESS. DISPLAY " " DISPLAY "💾 CACHED RANDOM ACCESS OPERATIONS" DISPLAY "==================================" *> Access transaction with cache lookup MOVE "TRANS0001234567" TO TRANS-PRIMARY-KEY PERFORM CACHED-TRANSACTION-LOOKUP *> Access same transaction again (should hit cache) MOVE "TRANS0001234567" TO TRANS-PRIMARY-KEY PERFORM CACHED-TRANSACTION-LOOKUP *> Access different transaction MOVE "TRANS0007654321" TO TRANS-PRIMARY-KEY PERFORM CACHED-TRANSACTION-LOOKUP *> Access by customer key with caching MOVE "CUST0123" TO TRANS-CUSTOMER-KEY PERFORM CACHED-CUSTOMER-TRANSACTION-LOOKUP. CACHED-TRANSACTION-LOOKUP. *> Check cache first IF WS-USE-CACHE = 'Y' PERFORM CHECK-TRANSACTION-CACHE IF CACHE-KEY-VALUE = TRANS-PRIMARY-KEY ADD 1 TO WS-CACHE-HITS DISPLAY "✅ Cache hit for: " TRANS-PRIMARY-KEY MOVE CACHE-DATA TO TRANSACTION-RECORD ELSE PERFORM LOAD-TRANSACTION-FROM-FILE PERFORM UPDATE-TRANSACTION-CACHE END-IF ELSE PERFORM LOAD-TRANSACTION-FROM-FILE END-IF. CHECK-TRANSACTION-CACHE. *> Simple hash function for cache key COMPUTE WS-CACHE-KEY = FUNCTION NUMVAL(TRANS-PRIMARY-KEY(6:6)) READ CACHE-FILE INVALID KEY MOVE SPACES TO CACHE-RECORD NOT INVALID KEY CONTINUE END-READ. LOAD-TRANSACTION-FROM-FILE. ADD 1 TO WS-RANDOM-READS ADD 1 TO WS-CACHE-MISSES READ TRANSACTION-FILE INVALID KEY DISPLAY "❌ Transaction not found: " TRANS-PRIMARY-KEY ADD 1 TO WS-ERROR-COUNT NOT INVALID KEY DISPLAY "✅ Transaction loaded: " TRANS-DESCRIPTION END-READ. UPDATE-TRANSACTION-CACHE. MOVE TRANS-PRIMARY-KEY TO CACHE-KEY-VALUE MOVE TRANSACTION-RECORD TO CACHE-DATA MOVE FUNCTION CURRENT-DATE(1:8) TO CACHE-TIMESTAMP ADD 1 TO CACHE-TIMESTAMP GIVING CACHE-EXPIRY ADD 1 TO CACHE-HIT-COUNT WRITE CACHE-RECORD INVALID KEY REWRITE CACHE-RECORD INVALID KEY DISPLAY "❌ Cache update failed" NOT INVALID KEY CONTINUE END-REWRITE NOT INVALID KEY CONTINUE END-WRITE. CACHED-CUSTOMER-TRANSACTION-LOOKUP. DISPLAY "🔍 Looking up customer transactions: " 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: " TRANS-PRIMARY-KEY DISPLAY " Amount: " TRANS-AMOUNT-KEY DISPLAY " Date: " TRANS-DATE-KEY END-READ. DEMONSTRATE-BATCH-RANDOM-PROCESSING. DISPLAY " " DISPLAY "📦 BATCH RANDOM PROCESSING" DISPLAY "==========================" *> Setup batch of keys for processing PERFORM SETUP-BATCH-KEYS *> Process batch with random access PERFORM PROCESS-BATCH-RANDOMLY *> Display batch results PERFORM DISPLAY-BATCH-RESULTS. SETUP-BATCH-KEYS. MOVE 5 TO WS-BATCH-SIZE MOVE "TRANS0001000001" TO WS-BATCH-KEY(1) MOVE "TRANS0001000002" TO WS-BATCH-KEY(2) MOVE "TRANS0001000003" TO WS-BATCH-KEY(3) MOVE "TRANS0001000004" TO WS-BATCH-KEY(4) MOVE "TRANS0001000005" TO WS-BATCH-KEY(5) DISPLAY "✅ Batch of " WS-BATCH-SIZE " keys prepared". PROCESS-BATCH-RANDOMLY. MOVE 0 TO WS-BATCH-PROCESSED PERFORM VARYING WS-CACHE-KEY FROM 1 BY 1 UNTIL WS-CACHE-KEY > WS-BATCH-SIZE MOVE WS-BATCH-KEY(WS-CACHE-KEY) TO TRANS-PRIMARY-KEY READ TRANSACTION-FILE INVALID KEY MOVE 'N' TO WS-BATCH-STATUS(WS-CACHE-KEY) DISPLAY "❌ Batch item " WS-CACHE-KEY " not found" NOT INVALID KEY MOVE 'Y' TO WS-BATCH-STATUS(WS-CACHE-KEY) ADD 1 TO WS-BATCH-PROCESSED *> Process the transaction PERFORM PROCESS-TRANSACTION-RECORD END-READ END-PERFORM. PROCESS-TRANSACTION-RECORD. *> Example processing: update status IF TRANS-STATUS = 'P' MOVE 'C' TO TRANS-STATUS REWRITE TRANSACTION-RECORD INVALID KEY DISPLAY "❌ Error updating transaction" NOT INVALID KEY ADD 1 TO WS-UPDATE-COUNT END-REWRITE END-IF. DISPLAY-BATCH-RESULTS. DISPLAY "📊 Batch Processing Results:" DISPLAY " Keys processed: " WS-BATCH-PROCESSED DISPLAY " Total keys: " WS-BATCH-SIZE DISPLAY " Success rate: " FUNCTION NUMVAL(WS-BATCH-PROCESSED) / WS-BATCH-SIZE * 100 "%". DEMONSTRATE-MULTI-KEY-RANDOM-ACCESS. DISPLAY " " DISPLAY "🗝️ MULTI-KEY RANDOM ACCESS" DISPLAY "==========================" *> Access by date range MOVE 20231001 TO WS-SEARCH-DATE PERFORM ACCESS-BY-DATE-KEY *> Access by amount range MOVE 1000.00 TO WS-AMOUNT-RANGE PERFORM ACCESS-BY-AMOUNT-KEY *> Access by multiple criteria PERFORM ACCESS-BY-MULTIPLE-KEYS. ACCESS-BY-DATE-KEY. MOVE WS-SEARCH-DATE TO TRANS-DATE-KEY READ TRANSACTION-FILE KEY IS TRANS-DATE-KEY INVALID KEY DISPLAY "❌ No transactions for date: " WS-SEARCH-DATE NOT INVALID KEY DISPLAY "✅ Found transaction for date: " TRANS-DATE-KEY DISPLAY " Transaction: " TRANS-PRIMARY-KEY DISPLAY " Customer: " TRANS-CUSTOMER-KEY DISPLAY " Amount: " TRANS-AMOUNT-KEY END-READ. ACCESS-BY-AMOUNT-KEY. MOVE WS-AMOUNT-RANGE TO TRANS-AMOUNT-KEY READ TRANSACTION-FILE KEY IS TRANS-AMOUNT-KEY INVALID KEY DISPLAY "❌ No transactions for amount: " WS-AMOUNT-RANGE NOT INVALID KEY DISPLAY "✅ Found transaction for amount: " TRANS-AMOUNT-KEY DISPLAY " Transaction: " TRANS-PRIMARY-KEY DISPLAY " Date: " TRANS-DATE-KEY END-READ. ACCESS-BY-MULTIPLE-KEYS. DISPLAY "🔍 Multi-criteria search example:" *> Search for customer transactions in date range MOVE "CUST0456" 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 *> Check if transaction meets additional criteria IF TRANS-DATE-KEY >= 20231001 AND TRANS-AMOUNT-KEY >= 500.00 DISPLAY "✅ Multi-criteria match found:" DISPLAY " Customer: " TRANS-CUSTOMER-KEY DISPLAY " Date: " TRANS-DATE-KEY DISPLAY " Amount: " TRANS-AMOUNT-KEY ELSE DISPLAY "❌ Transaction found but doesn't meet criteria" END-IF END-READ. DEMONSTRATE-PERFORMANCE-OPTIMIZATION. DISPLAY " " DISPLAY "⚡ PERFORMANCE OPTIMIZATION" DISPLAY "==========================" *> Demonstrate read-ahead optimization PERFORM OPTIMIZE-READ-AHEAD *> Demonstrate key clustering optimization PERFORM OPTIMIZE-KEY-CLUSTERING *> Demonstrate cache warming PERFORM OPTIMIZE-CACHE-WARMING. OPTIMIZE-READ-AHEAD. DISPLAY "🚀 Read-ahead optimization:" *> Read multiple consecutive records MOVE "TRANS0002000001" TO TRANS-PRIMARY-KEY PERFORM 5 TIMES READ TRANSACTION-FILE INVALID KEY CONTINUE NOT INVALID KEY DISPLAY " Read: " TRANS-PRIMARY-KEY END-READ *> Increment key for next read ADD 1 TO TRANS-PRIMARY-KEY(11:5) END-PERFORM. OPTIMIZE-KEY-CLUSTERING. DISPLAY "🔗 Key clustering optimization:" *> Process related records together MOVE "CUST0789" TO WS-CUSTOMER-ID MOVE WS-CUSTOMER-ID TO TRANS-CUSTOMER-KEY PERFORM 3 TIMES READ TRANSACTION-FILE KEY IS TRANS-CUSTOMER-KEY INVALID KEY CONTINUE NOT INVALID KEY DISPLAY " Clustered read: " TRANS-PRIMARY-KEY DISPLAY " Customer: " TRANS-CUSTOMER-KEY END-READ END-PERFORM. OPTIMIZE-CACHE-WARMING. DISPLAY "🔥 Cache warming optimization:" *> Pre-load frequently accessed records PERFORM VARYING WS-CACHE-KEY FROM 1 BY 1 UNTIL WS-CACHE-KEY > 3 EVALUATE WS-CACHE-KEY WHEN 1 MOVE "TRANS0003000001" TO TRANS-PRIMARY-KEY WHEN 2 MOVE "TRANS0003000002" TO TRANS-PRIMARY-KEY WHEN 3 MOVE "TRANS0003000003" TO TRANS-PRIMARY-KEY END-EVALUATE PERFORM CACHED-TRANSACTION-LOOKUP DISPLAY " Pre-loaded: " TRANS-PRIMARY-KEY END-PERFORM. DISPLAY-PERFORMANCE-METRICS. DISPLAY " " DISPLAY "📈 PERFORMANCE METRICS" DISPLAY "=====================" DISPLAY "Random reads: " WS-RANDOM-READS DISPLAY "Cache hits: " WS-CACHE-HITS DISPLAY "Cache misses: " WS-CACHE-MISSES DISPLAY "Updates: " WS-UPDATE-COUNT DISPLAY "Errors: " WS-ERROR-COUNT IF WS-CACHE-HITS + WS-CACHE-MISSES > 0 COMPUTE WS-AMOUNT-RANGE = (WS-CACHE-HITS / (WS-CACHE-HITS + WS-CACHE-MISSES)) * 100 DISPLAY "Cache hit ratio: " WS-AMOUNT-RANGE "%" END-IF. CLEANUP-ADVANCED-PROCESSING. DISPLAY " " DISPLAY "🧹 CLEANUP" DISPLAY "==========" CLOSE TRANSACTION-FILE CLOSE CACHE-FILE DISPLAY "✅ All files closed successfully".