Access methods in COBOL define the techniques used to retrieve data from files, determining how records are located, read, and processed. The choice of access method significantly impacts program performance, data organization, and application functionality.
COBOL supports several access methods, each optimized for different scenarios:
Understanding these access methods is crucial for designing efficient, scalable COBOL applications that can handle large datasets effectively.
Sequential access is the most basic and commonly used access method, where records are read in the order they appear in the file. This method is ideal for batch processing and when you need to process all records in a file.
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970IDENTIFICATION DIVISION. PROGRAM-ID. SEQUENTIAL-ACCESS-DEMO. ENVIRONMENT DIVISION. INPUT-OUTPUT SECTION. FILE-CONTROL. SELECT CUSTOMER-FILE ASSIGN TO "CUSTOMER.DAT" ORGANIZATION IS SEQUENTIAL ACCESS MODE IS SEQUENTIAL FILE STATUS IS FILE-STATUS. DATA DIVISION. FILE SECTION. FD CUSTOMER-FILE. 01 CUSTOMER-RECORD. 05 CUSTOMER-ID PIC X(6). 05 CUSTOMER-NAME PIC X(30). 05 CUSTOMER-ADDRESS PIC X(50). 05 CUSTOMER-BALANCE PIC S9(7)V99. WORKING-STORAGE SECTION. 01 FILE-STATUS PIC X(2). 01 RECORD-COUNT PIC 9(6) VALUE ZERO. 01 TOTAL-BALANCE PIC S9(9)V99 VALUE ZERO. 01 END-OF-FILE PIC X(1) VALUE 'N'. 01 SUMMARY-LINE. 05 FILLER PIC X(20) VALUE "Total Records: ". 05 SUMMARY-COUNT PIC ZZZ,ZZ9. 05 FILLER PIC X(20) VALUE "Total Balance: $". 05 SUMMARY-BALANCE PIC $$$,$$$,$$9.99. PROCEDURE DIVISION. PERFORM OPEN-FILE PERFORM PROCESS-SEQUENTIAL-RECORDS PERFORM DISPLAY-SUMMARY PERFORM CLOSE-FILE STOP RUN. OPEN-FILE. OPEN INPUT CUSTOMER-FILE IF FILE-STATUS NOT = "00" DISPLAY "Error opening file: " FILE-STATUS STOP RUN END-IF DISPLAY "File opened successfully for sequential access". PROCESS-SEQUENTIAL-RECORDS. DISPLAY "Processing records sequentially..." PERFORM UNTIL END-OF-FILE = 'Y' READ CUSTOMER-FILE AT END MOVE 'Y' TO END-OF-FILE NOT AT END ADD 1 TO RECORD-COUNT ADD CUSTOMER-BALANCE TO TOTAL-BALANCE DISPLAY "Record " RECORD-COUNT ": " CUSTOMER-ID " - " CUSTOMER-NAME END-READ END-PERFORM. DISPLAY-SUMMARY. MOVE RECORD-COUNT TO SUMMARY-COUNT MOVE TOTAL-BALANCE TO SUMMARY-BALANCE DISPLAY " " DISPLAY "=== Sequential Processing Summary ===" DISPLAY SUMMARY-LINE. CLOSE-FILE. CLOSE CUSTOMER-FILE DISPLAY "File closed successfully".
Indexed access allows direct retrieval of records using key values, making it ideal for applications that need to find specific records quickly without reading through the entire file.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081IDENTIFICATION DIVISION. PROGRAM-ID. INDEXED-ACCESS-DEMO. ENVIRONMENT DIVISION. INPUT-OUTPUT SECTION. FILE-CONTROL. SELECT CUSTOMER-FILE ASSIGN TO "CUSTOMER.IDX" ORGANIZATION IS INDEXED ACCESS MODE IS RANDOM RECORD KEY IS CUSTOMER-ID ALTERNATE RECORD KEY IS CUSTOMER-NAME FILE STATUS IS FILE-STATUS. DATA DIVISION. FILE SECTION. FD CUSTOMER-FILE. 01 CUSTOMER-RECORD. 05 CUSTOMER-ID PIC X(6). 05 CUSTOMER-NAME PIC X(30). 05 CUSTOMER-ADDRESS PIC X(50). 05 CUSTOMER-BALANCE PIC S9(7)V99. WORKING-STORAGE SECTION. 01 FILE-STATUS PIC X(2). 01 SEARCH-KEY PIC X(6). 01 SEARCH-NAME PIC X(30). 01 RECORD-FOUND PIC X(1) VALUE 'N'. PROCEDURE DIVISION. PERFORM OPEN-FILE PERFORM DEMONSTRATE-INDEXED-ACCESS PERFORM CLOSE-FILE STOP RUN. OPEN-FILE. OPEN INPUT CUSTOMER-FILE IF FILE-STATUS NOT = "00" DISPLAY "Error opening indexed file: " FILE-STATUS STOP RUN END-IF DISPLAY "Indexed file opened successfully". DEMONSTRATE-INDEXED-ACCESS. DISPLAY "=== Indexed Access Demonstration ===" * Access by primary key (Customer ID) DISPLAY "Enter Customer ID to search: " WITH NO ADVANCING ACCEPT SEARCH-KEY MOVE SEARCH-KEY TO CUSTOMER-ID READ CUSTOMER-FILE INVALID KEY DISPLAY "Customer ID " SEARCH-KEY " not found" NOT INVALID KEY DISPLAY "Customer found by ID:" DISPLAY " ID: " CUSTOMER-ID DISPLAY " Name: " CUSTOMER-NAME DISPLAY " Address: " CUSTOMER-ADDRESS DISPLAY " Balance: $" CUSTOMER-BALANCE END-READ DISPLAY " " * Access by alternate key (Customer Name) DISPLAY "Enter Customer Name to search: " WITH NO ADVANCING ACCEPT SEARCH-NAME MOVE SEARCH-NAME TO CUSTOMER-NAME READ CUSTOMER-FILE INVALID KEY DISPLAY "Customer Name " SEARCH-NAME " not found" NOT INVALID KEY DISPLAY "Customer found by Name:" DISPLAY " ID: " CUSTOMER-ID DISPLAY " Name: " CUSTOMER-NAME DISPLAY " Address: " CUSTOMER-ADDRESS DISPLAY " Balance: $" CUSTOMER-BALANCE END-READ. CLOSE-FILE. CLOSE CUSTOMER-FILE DISPLAY "Indexed file closed successfully".
Relative access allows reading records by their relative position in the file, providing direct access to specific record numbers. This method is useful when you know the position of records you want to access.
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677IDENTIFICATION DIVISION. PROGRAM-ID. RELATIVE-ACCESS-DEMO. ENVIRONMENT DIVISION. INPUT-OUTPUT SECTION. FILE-CONTROL. SELECT EMPLOYEE-FILE ASSIGN TO "EMPLOYEE.REL" ORGANIZATION IS RELATIVE ACCESS MODE IS RANDOM RELATIVE KEY IS RECORD-NUMBER FILE STATUS IS FILE-STATUS. DATA DIVISION. FILE SECTION. FD EMPLOYEE-FILE. 01 EMPLOYEE-RECORD. 05 EMPLOYEE-ID PIC X(6). 05 EMPLOYEE-NAME PIC X(30). 05 EMPLOYEE-DEPT PIC X(15). 05 EMPLOYEE-SALARY PIC S9(6)V99. WORKING-STORAGE SECTION. 01 FILE-STATUS PIC X(2). 01 RECORD-NUMBER PIC 9(6). 01 MAX-RECORDS PIC 9(6) VALUE 1000. 01 RECORD-FOUND PIC X(1). PROCEDURE DIVISION. PERFORM OPEN-FILE PERFORM DEMONSTRATE-RELATIVE-ACCESS PERFORM CLOSE-FILE STOP RUN. OPEN-FILE. OPEN INPUT EMPLOYEE-FILE IF FILE-STATUS NOT = "00" DISPLAY "Error opening relative file: " FILE-STATUS STOP RUN END-IF DISPLAY "Relative file opened successfully". DEMONSTRATE-RELATIVE-ACCESS. DISPLAY "=== Relative Access Demonstration ===" * Access specific record by number DISPLAY "Enter record number to access (1-" MAX-RECORDS "): " WITH NO ADVANCING ACCEPT RECORD-NUMBER READ EMPLOYEE-FILE INVALID KEY DISPLAY "Record number " RECORD-NUMBER " not found or invalid" NOT INVALID KEY DISPLAY "Employee record found:" DISPLAY " Record #: " RECORD-NUMBER DISPLAY " ID: " EMPLOYEE-ID DISPLAY " Name: " EMPLOYEE-NAME DISPLAY " Department: " EMPLOYEE-DEPT DISPLAY " Salary: $" EMPLOYEE-SALARY END-READ DISPLAY " " * Demonstrate sequential access with relative file DISPLAY "Demonstrating sequential access on relative file..." MOVE 1 TO RECORD-NUMBER PERFORM UNTIL RECORD-NUMBER > 5 READ EMPLOYEE-FILE INVALID KEY DISPLAY "Record " RECORD-NUMBER " not found" NOT INVALID KEY DISPLAY "Record " RECORD-NUMBER ": " EMPLOYEE-NAME END-READ ADD 1 TO RECORD-NUMBER END-PERFORM. CLOSE-FILE. CLOSE EMPLOYEE-FILE DISPLAY "Relative file closed successfully".
Dynamic access combines multiple access methods in a single program, allowing you to switch between sequential, indexed, and relative access as needed. This provides maximum flexibility for complex applications.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201IDENTIFICATION DIVISION. PROGRAM-ID. DYNAMIC-ACCESS-DEMO. ENVIRONMENT DIVISION. INPUT-OUTPUT SECTION. FILE-CONTROL. SELECT PRODUCT-FILE ASSIGN TO "PRODUCT.DYN" ORGANIZATION IS INDEXED ACCESS MODE IS DYNAMIC RECORD KEY IS PRODUCT-ID ALTERNATE RECORD KEY IS PRODUCT-NAME RELATIVE KEY IS RECORD-POSITION FILE STATUS IS FILE-STATUS. DATA DIVISION. FILE SECTION. FD PRODUCT-FILE. 01 PRODUCT-RECORD. 05 PRODUCT-ID PIC X(8). 05 PRODUCT-NAME PIC X(30). 05 PRODUCT-CATEGORY PIC X(15). 05 PRODUCT-PRICE PIC S9(5)V99. 05 PRODUCT-STOCK PIC 9(5). WORKING-STORAGE SECTION. 01 FILE-STATUS PIC X(2). 01 RECORD-POSITION PIC 9(6). 01 ACCESS-MODE PIC X(10). 01 SEARCH-KEY PIC X(30). 01 MENU-CHOICE PIC 9(1). PROCEDURE DIVISION. PERFORM OPEN-FILE PERFORM MAIN-MENU PERFORM CLOSE-FILE STOP RUN. OPEN-FILE. OPEN I-O PRODUCT-FILE IF FILE-STATUS NOT = "00" DISPLAY "Error opening dynamic file: " FILE-STATUS STOP RUN END-IF DISPLAY "Dynamic file opened successfully". MAIN-MENU. PERFORM UNTIL MENU-CHOICE = 0 DISPLAY " " DISPLAY "=== Dynamic Access Menu ===" DISPLAY "1. Sequential Access (Read All Records)" DISPLAY "2. Indexed Access by Product ID" DISPLAY "3. Indexed Access by Product Name" DISPLAY "4. Relative Access by Record Number" DISPLAY "5. Add New Product" DISPLAY "6. Update Existing Product" DISPLAY "0. Exit" DISPLAY "Enter your choice: " WITH NO ADVANCING ACCEPT MENU-CHOICE EVALUATE MENU-CHOICE WHEN 1 PERFORM SEQUENTIAL-ACCESS WHEN 2 PERFORM INDEXED-ACCESS-BY-ID WHEN 3 PERFORM INDEXED-ACCESS-BY-NAME WHEN 4 PERFORM RELATIVE-ACCESS WHEN 5 PERFORM ADD-PRODUCT WHEN 6 PERFORM UPDATE-PRODUCT WHEN 0 DISPLAY "Exiting program..." WHEN OTHER DISPLAY "Invalid choice. Please try again." END-EVALUATE END-PERFORM. SEQUENTIAL-ACCESS. DISPLAY "=== Sequential Access Mode ===" MOVE "SEQUENTIAL" TO ACCESS-MODE START PRODUCT-FILE FIRST PERFORM UNTIL FILE-STATUS NOT = "00" READ PRODUCT-FILE NEXT AT END EXIT PERFORM NOT AT END DISPLAY "Product: " PRODUCT-ID " - " PRODUCT-NAME END-READ END-PERFORM. INDEXED-ACCESS-BY-ID. DISPLAY "=== Indexed Access by Product ID ===" DISPLAY "Enter Product ID: " WITH NO ADVANCING ACCEPT SEARCH-KEY MOVE SEARCH-KEY TO PRODUCT-ID READ PRODUCT-FILE INVALID KEY DISPLAY "Product ID " SEARCH-KEY " not found" NOT INVALID KEY DISPLAY "Product found:" DISPLAY " ID: " PRODUCT-ID DISPLAY " Name: " PRODUCT-NAME DISPLAY " Category: " PRODUCT-CATEGORY DISPLAY " Price: $" PRODUCT-PRICE DISPLAY " Stock: " PRODUCT-STOCK END-READ. INDEXED-ACCESS-BY-NAME. DISPLAY "=== Indexed Access by Product Name ===" DISPLAY "Enter Product Name: " WITH NO ADVANCING ACCEPT SEARCH-KEY MOVE SEARCH-KEY TO PRODUCT-NAME READ PRODUCT-FILE INVALID KEY DISPLAY "Product Name " SEARCH-KEY " not found" NOT INVALID KEY DISPLAY "Product found:" DISPLAY " ID: " PRODUCT-ID DISPLAY " Name: " PRODUCT-NAME DISPLAY " Category: " PRODUCT-CATEGORY DISPLAY " Price: $" PRODUCT-PRICE DISPLAY " Stock: " PRODUCT-STOCK END-READ. RELATIVE-ACCESS. DISPLAY "=== Relative Access Mode ===" DISPLAY "Enter record number: " WITH NO ADVANCING ACCEPT RECORD-POSITION READ PRODUCT-FILE INVALID KEY DISPLAY "Record number " RECORD-POSITION " not found" NOT INVALID KEY DISPLAY "Record found:" DISPLAY " Position: " RECORD-POSITION DISPLAY " ID: " PRODUCT-ID DISPLAY " Name: " PRODUCT-NAME DISPLAY " Category: " PRODUCT-CATEGORY DISPLAY " Price: $" PRODUCT-PRICE DISPLAY " Stock: " PRODUCT-STOCK END-READ. ADD-PRODUCT. DISPLAY "=== Add New Product ===" DISPLAY "Enter Product ID: " WITH NO ADVANCING ACCEPT PRODUCT-ID DISPLAY "Enter Product Name: " WITH NO ADVANCING ACCEPT PRODUCT-NAME DISPLAY "Enter Category: " WITH NO ADVANCING ACCEPT PRODUCT-CATEGORY DISPLAY "Enter Price: " WITH NO ADVANCING ACCEPT PRODUCT-PRICE DISPLAY "Enter Stock: " WITH NO ADVANCING ACCEPT PRODUCT-STOCK WRITE PRODUCT-RECORD INVALID KEY DISPLAY "Error adding product - duplicate ID" NOT INVALID KEY DISPLAY "Product added successfully" END-WRITE. UPDATE-PRODUCT. DISPLAY "=== Update Existing Product ===" DISPLAY "Enter Product ID to update: " WITH NO ADVANCING ACCEPT PRODUCT-ID READ PRODUCT-FILE INVALID KEY DISPLAY "Product ID " PRODUCT-ID " not found" NOT INVALID KEY DISPLAY "Current product information:" DISPLAY " Name: " PRODUCT-NAME DISPLAY " Category: " PRODUCT-CATEGORY DISPLAY " Price: $" PRODUCT-PRICE DISPLAY " Stock: " PRODUCT-STOCK DISPLAY " " DISPLAY "Enter new Price: " WITH NO ADVANCING ACCEPT PRODUCT-PRICE DISPLAY "Enter new Stock: " WITH NO ADVANCING ACCEPT PRODUCT-STOCK REWRITE PRODUCT-RECORD INVALID KEY DISPLAY "Error updating product" NOT INVALID KEY DISPLAY "Product updated successfully" END-REWRITE END-READ. CLOSE-FILE. CLOSE PRODUCT-FILE DISPLAY "Dynamic file closed successfully".
Choosing the right access method significantly impacts application performance. Understanding the performance characteristics of each method helps in making informed decisions.
12345678910111213141516171819202122232425* Performance characteristics of different access methods * Sequential Access Performance * - Best for: Processing entire files * - Time Complexity: O(n) for full file scan * - Memory Usage: Low * - Use When: Batch processing, reporting * Indexed Access Performance * - Best for: Finding specific records * - Time Complexity: O(log n) for key lookup * - Memory Usage: High (index overhead) * - Use When: Online transactions, lookups * Relative Access Performance * - Best for: Position-based access * - Time Complexity: O(1) for direct access * - Memory Usage: Moderate * - Use When: Array-like operations * Dynamic Access Performance * - Best for: Mixed access patterns * - Time Complexity: Varies by operation * - Memory Usage: High (multiple indexes) * - Use When: Complex applications
Following best practices ensures optimal performance and maintainability when implementing access methods in COBOL applications.
Design and implement a comprehensive file system that demonstrates all access methods. The system should include:
Consider these advanced requirements:
Access methods in COBOL define how data is retrieved from files, including sequential access (reading records in order), indexed access (using keys), relative access (using record numbers), and random access (direct record retrieval).
Sequential access reads records in the order they appear in the file, while indexed access uses key values to directly locate specific records. Sequential is faster for processing entire files, while indexed is faster for finding specific records.
Indexed access is implemented using the ACCESS MODE IS RANDOM or DYNAMIC clause in the SELECT statement, along with appropriate key definitions. Records are accessed using READ statements with key values.
Relative access allows reading records by their relative position in the file (record number). It's implemented using ACCESS MODE IS RANDOM with RELATIVE KEY, allowing direct access to records by their position.
Choose sequential access for processing entire files, indexed access for finding specific records by key, relative access for position-based retrieval, and random access for direct record access. Consider performance requirements and data access patterns.