File processing in COBOL involves a series of operations to read, write, update, and manage data files. Understanding the basic file processing cycle is essential for developing robust COBOL applications that work with external data sources.
Every file operation in COBOL follows a standard cycle:
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758IDENTIFICATION DIVISION. PROGRAM-ID. FILE-PROCESSING-EXAMPLE. ENVIRONMENT DIVISION. INPUT-OUTPUT SECTION. FILE-CONTROL. SELECT CUSTOMER-FILE ASSIGN TO "CUSTOMER.DAT" ORGANIZATION IS SEQUENTIAL ACCESS MODE IS SEQUENTIAL FILE STATUS IS CUSTOMER-STATUS. DATA DIVISION. FILE SECTION. FD CUSTOMER-FILE LABEL RECORDS ARE STANDARD RECORD CONTAINS 80 CHARACTERS. 01 CUSTOMER-RECORD. 05 CUSTOMER-ID PIC 9(5). 05 CUSTOMER-NAME PIC X(30). 05 CUSTOMER-ADDRESS PIC X(35). 05 CUSTOMER-STATUS PIC X. WORKING-STORAGE SECTION. 01 CUSTOMER-STATUS PIC XX. 01 EOF-FLAG PIC X VALUE 'N'. 88 END-OF-FILE VALUE 'Y'. PROCEDURE DIVISION. MAIN-PROCESS. PERFORM OPEN-FILE PERFORM PROCESS-RECORDS UNTIL END-OF-FILE PERFORM CLOSE-FILE STOP RUN. OPEN-FILE. OPEN INPUT CUSTOMER-FILE IF CUSTOMER-STATUS NOT = "00" DISPLAY "Error opening file: " CUSTOMER-STATUS STOP RUN END-IF. PROCESS-RECORDS. READ CUSTOMER-FILE AT END MOVE "Y" TO EOF-FLAG NOT AT END PERFORM PROCESS-CUSTOMER-RECORD END-READ. PROCESS-CUSTOMER-RECORD. DISPLAY "Processing customer: " CUSTOMER-ID * Add your processing logic here. CLOSE-FILE. CLOSE CUSTOMER-FILE IF CUSTOMER-STATUS NOT = "00" DISPLAY "Error closing file: " CUSTOMER-STATUS END-IF.
This example demonstrates the basic file processing cycle: OPEN, READ (in a loop), and CLOSE. Notice the error checking after each file operation using the FILE STATUS field.
COBOL supports different access modes that determine how you can interact with files:
Access Mode | Description | Operations Allowed |
---|---|---|
SEQUENTIAL | Records are processed in order | READ, WRITE (for output files) |
RANDOM | Records are accessed by key or position | READ, WRITE, REWRITE, DELETE |
DYNAMIC | Combines sequential and random access | All operations with START capability |
The way you open a file determines what operations you can perform:
1234567891011* Read-only access OPEN INPUT file-name * Write-only access (creates new file or overwrites existing) OPEN OUTPUT file-name * Read and write access (for updating existing files) OPEN I-O file-name * Append mode (adds records to existing file) OPEN EXTEND file-name
Choose the appropriate opening mode based on your processing requirements. I-O mode is commonly used for maintenance programs that need to update existing records.
The READ statement is used to retrieve records from files. COBOL provides several variations of the READ statement to handle different access patterns and file organizations. Understanding these variations is crucial for effective file processing.
The most common form of READ is sequential reading, which processes records in the order they appear in the file:
123456789101112131415161718192021222324252627* Basic sequential READ with AT END handling READ file-name AT END MOVE "Y" TO EOF-FLAG NOT AT END PERFORM PROCESS-RECORD END-READ * READ with INTO clause (copies record to working storage) READ file-name INTO working-storage-record AT END MOVE "Y" TO EOF-FLAG NOT AT END PERFORM PROCESS-RECORD END-READ * READ with file status checking READ file-name AT END MOVE "Y" TO EOF-FLAG NOT AT END IF file-status = "00" PERFORM PROCESS-RECORD ELSE DISPLAY "Read error: " file-status END-IF END-READ
The AT END clause is essential for sequential reading to detect when you've reached the end of the file. The NOT AT END clause contains the logic to process each record.
For indexed and relative files, you can read specific records by key or position:
123456789101112131415161718192021222324252627282930313233* READ by key (for indexed files) MOVE "12345" TO CUSTOMER-KEY READ CUSTOMER-FILE INVALID KEY DISPLAY "Customer not found: " CUSTOMER-KEY NOT INVALID KEY PERFORM PROCESS-CUSTOMER END-READ * READ by relative record number (for relative files) MOVE 100 TO RELATIVE-RECORD-NUMBER READ RELATIVE-FILE INVALID KEY DISPLAY "Record not found at position: " RELATIVE-RECORD-NUMBER NOT INVALID KEY PERFORM PROCESS-RECORD END-READ * READ with file status for random access MOVE "12345" TO CUSTOMER-KEY READ CUSTOMER-FILE INVALID KEY EVALUATE CUSTOMER-STATUS WHEN "23" DISPLAY "Record not found" WHEN "30" DISPLAY "Permanent error" WHEN OTHER DISPLAY "Unexpected error: " CUSTOMER-STATUS END-EVALUATE NOT INVALID KEY PERFORM PROCESS-CUSTOMER END-READ
Random READ uses the INVALID KEY clause instead of AT END. The INVALID KEY clause is executed when the specified key or position doesn't exist in the file.
For files opened with DYNAMIC access mode, you can combine random and sequential access:
1234567891011121314151617181920* First, position the file at a specific key MOVE "10000" TO CUSTOMER-KEY START CUSTOMER-FILE KEY IS GREATER THAN CUSTOMER-KEY INVALID KEY DISPLAY "Start position not found" NOT INVALID KEY * Now read sequentially from this position PERFORM READ-SEQUENTIAL-RECORDS END-START READ-SEQUENTIAL-RECORDS. PERFORM UNTIL END-OF-FILE READ CUSTOMER-FILE NEXT AT END MOVE "Y" TO EOF-FLAG NOT AT END PERFORM PROCESS-CUSTOMER END-READ END-PERFORM.
READ NEXT is used after a START statement to read records sequentially from the positioned location. This is useful for processing subsets of data or implementing range queries.
Variation | Use Case | File Organization | Access Mode |
---|---|---|---|
READ file-name | Basic sequential reading | All | SEQUENTIAL |
READ file-name INTO ws-record | Read with automatic copy | All | SEQUENTIAL |
READ file-name (with key) | Random access by key | INDEXED | RANDOM/DYNAMIC |
READ file-name NEXT | Sequential after START | INDEXED | DYNAMIC |
READ file-name (with RRN) | Random access by position | RELATIVE | RANDOM/DYNAMIC |
The WRITE statement is used to add new records to files. Unlike READ operations, WRITE operations are generally simpler but require careful attention to file organization and access mode requirements.
The most common form of WRITE adds a record to the end of a file:
123456789101112131415161718192021* Basic WRITE for sequential files MOVE "12345" TO CUSTOMER-ID MOVE "JOHN DOE" TO CUSTOMER-NAME MOVE "123 MAIN ST" TO CUSTOMER-ADDRESS MOVE "A" TO CUSTOMER-STATUS WRITE CUSTOMER-RECORD * WRITE with FROM clause (copies from working storage) MOVE "12345" TO WS-CUSTOMER-ID MOVE "JOHN DOE" TO WS-CUSTOMER-NAME MOVE "123 MAIN ST" TO WS-CUSTOMER-ADDRESS MOVE "A" TO WS-CUSTOMER-STATUS WRITE CUSTOMER-RECORD FROM WS-CUSTOMER-RECORD * WRITE with error handling WRITE CUSTOMER-RECORD INVALID KEY DISPLAY "Write error occurred" NOT INVALID KEY DISPLAY "Record written successfully" END-WRITE
The WRITE statement transfers data from the record description to the file. The FROM clause allows you to specify a different source for the data.
The behavior of WRITE varies depending on the file organization:
123456789101112131415161718192021222324252627* Sequential files - records are added at the end OPEN OUTPUT SEQUENTIAL-FILE MOVE "DATA1" TO RECORD-FIELD WRITE SEQUENTIAL-RECORD MOVE "DATA2" TO RECORD-FIELD WRITE SEQUENTIAL-RECORD CLOSE SEQUENTIAL-FILE * Indexed files - records are inserted in key order OPEN OUTPUT INDEXED-FILE MOVE "10001" TO CUSTOMER-KEY MOVE "ALICE SMITH" TO CUSTOMER-NAME WRITE CUSTOMER-RECORD MOVE "10000" TO CUSTOMER-KEY MOVE "BOB JONES" TO CUSTOMER-NAME WRITE CUSTOMER-RECORD * This will be inserted before Alice CLOSE INDEXED-FILE * Relative files - records are written at specified positions OPEN OUTPUT RELATIVE-FILE MOVE 1 TO RELATIVE-RECORD-NUMBER MOVE "FIRST RECORD" TO RECORD-DATA WRITE RELATIVE-RECORD MOVE 5 TO RELATIVE-RECORD-NUMBER MOVE "FIFTH RECORD" TO RECORD-DATA WRITE RELATIVE-RECORD CLOSE RELATIVE-FILE
Sequential files append records in the order written. Indexed files maintain key order automatically. Relative files allow you to specify the exact position for each record.
For line sequential files (text files), you can control line spacing:
12345678910111213141516171819* WRITE with different advancing options OPEN OUTPUT REPORT-FILE * Write with single line advance (default) WRITE REPORT-LINE * Write with double spacing WRITE REPORT-LINE AFTER ADVANCING 2 LINES * Write with page advance WRITE REPORT-LINE AFTER ADVANCING PAGE * Write without advancing (overwrite current line) WRITE REPORT-LINE BEFORE ADVANCING 1 LINE * Write with specific line count WRITE REPORT-LINE AFTER ADVANCING 5 LINES CLOSE REPORT-FILE
The ADVANCING clause is primarily used for report generation and text file formatting. It controls how many lines to advance after writing each record.
File Organization | Required Opening Mode | Key Requirements | Common Errors |
---|---|---|---|
SEQUENTIAL | OUTPUT or EXTEND | None | Opening existing file with OUTPUT |
INDEXED | OUTPUT or I-O | Unique key values | Duplicate keys |
RELATIVE | OUTPUT or I-O | Valid record numbers | Invalid record numbers |
LINE SEQUENTIAL | OUTPUT or EXTEND | Text data | Binary data in text files |
REWRITE and DELETE operations are used to modify existing records in files. These operations require the file to be opened for I-O (Input-Output) mode and are typically used in maintenance programs.
The REWRITE statement replaces an existing record that was previously read from the file:
12345678910111213141516171819202122232425262728293031323334* Basic REWRITE operation OPEN I-O CUSTOMER-FILE * First, read the record to be updated MOVE "12345" TO CUSTOMER-KEY READ CUSTOMER-FILE INVALID KEY DISPLAY "Customer not found" NOT INVALID KEY * Modify the record data MOVE "JANE DOE" TO CUSTOMER-NAME MOVE "456 OAK AVE" TO CUSTOMER-ADDRESS * Replace the record REWRITE CUSTOMER-RECORD INVALID KEY DISPLAY "Rewrite failed" NOT INVALID KEY DISPLAY "Record updated successfully" END-REWRITE END-READ CLOSE CUSTOMER-FILE * REWRITE with FROM clause READ CUSTOMER-FILE INVALID KEY DISPLAY "Customer not found" NOT INVALID KEY * Prepare updated data in working storage MOVE CUSTOMER-RECORD TO WS-UPDATED-RECORD MOVE "NEW ADDRESS" TO WS-CUSTOMER-ADDRESS * Rewrite using working storage data REWRITE CUSTOMER-RECORD FROM WS-UPDATED-RECORD END-READ
REWRITE can only be used after a successful READ operation. The record being rewritten must exist in the file, and the key values (for indexed files) cannot be changed.
The DELETE statement removes a record from the file:
123456789101112131415161718192021222324252627282930313233* DELETE operation for indexed files OPEN I-O CUSTOMER-FILE * Read the record to be deleted MOVE "12345" TO CUSTOMER-KEY READ CUSTOMER-FILE INVALID KEY DISPLAY "Customer not found" NOT INVALID KEY * Delete the record DELETE CUSTOMER-FILE INVALID KEY DISPLAY "Delete failed" NOT INVALID KEY DISPLAY "Record deleted successfully" END-DELETE END-READ CLOSE CUSTOMER-FILE * DELETE for relative files OPEN I-O RELATIVE-FILE MOVE 100 TO RELATIVE-RECORD-NUMBER READ RELATIVE-FILE INVALID KEY DISPLAY "Record not found" NOT INVALID KEY DELETE RELATIVE-FILE DISPLAY "Record deleted" END-READ CLOSE RELATIVE-FILE
Like REWRITE, DELETE requires a previous READ operation. The record is permanently removed from the file and cannot be recovered through normal COBOL operations.
Here's a complete example of a customer maintenance program that demonstrates REWRITE and DELETE:
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101IDENTIFICATION DIVISION. PROGRAM-ID. CUSTOMER-MAINTENANCE. ENVIRONMENT DIVISION. INPUT-OUTPUT SECTION. FILE-CONTROL. SELECT CUSTOMER-FILE ASSIGN TO "CUSTOMER.DAT" ORGANIZATION IS INDEXED ACCESS MODE IS RANDOM RECORD KEY IS CUSTOMER-ID FILE STATUS IS CUSTOMER-STATUS. DATA DIVISION. FILE SECTION. FD CUSTOMER-FILE LABEL RECORDS ARE STANDARD RECORD CONTAINS 80 CHARACTERS. 01 CUSTOMER-RECORD. 05 CUSTOMER-ID PIC 9(5). 05 CUSTOMER-NAME PIC X(30). 05 CUSTOMER-ADDRESS PIC X(35). 05 CUSTOMER-STATUS PIC X. WORKING-STORAGE SECTION. 01 CUSTOMER-STATUS PIC XX. 01 ACTION-CODE PIC X. 01 SEARCH-ID PIC 9(5). PROCEDURE DIVISION. MAIN-PROCESS. PERFORM INITIALIZATION PERFORM PROCESS-ACTIONS UNTIL ACTION-CODE = "X" PERFORM FINALIZATION STOP RUN. INITIALIZATION. OPEN I-O CUSTOMER-FILE IF CUSTOMER-STATUS NOT = "00" DISPLAY "Error opening file: " CUSTOMER-STATUS STOP RUN END-IF. PROCESS-ACTIONS. DISPLAY "Enter action (U=Update, D=Delete, X=Exit): " ACCEPT ACTION-CODE EVALUATE ACTION-CODE WHEN "U" PERFORM UPDATE-CUSTOMER WHEN "D" PERFORM DELETE-CUSTOMER WHEN "X" CONTINUE WHEN OTHER DISPLAY "Invalid action" END-EVALUATE. UPDATE-CUSTOMER. DISPLAY "Enter customer ID to update: " ACCEPT SEARCH-ID MOVE SEARCH-ID TO CUSTOMER-ID READ CUSTOMER-FILE INVALID KEY DISPLAY "Customer not found" NOT INVALID KEY DISPLAY "Current name: " CUSTOMER-NAME DISPLAY "Enter new name: " ACCEPT CUSTOMER-NAME DISPLAY "Enter new address: " ACCEPT CUSTOMER-ADDRESS REWRITE CUSTOMER-RECORD INVALID KEY DISPLAY "Update failed: " CUSTOMER-STATUS NOT INVALID KEY DISPLAY "Customer updated successfully" END-REWRITE END-READ. DELETE-CUSTOMER. DISPLAY "Enter customer ID to delete: " ACCEPT SEARCH-ID MOVE SEARCH-ID TO CUSTOMER-ID READ CUSTOMER-FILE INVALID KEY DISPLAY "Customer not found" NOT INVALID KEY DISPLAY "Deleting customer: " CUSTOMER-NAME DELETE CUSTOMER-FILE INVALID KEY DISPLAY "Delete failed: " CUSTOMER-STATUS NOT INVALID KEY DISPLAY "Customer deleted successfully" END-DELETE END-READ. FINALIZATION. CLOSE CUSTOMER-FILE DISPLAY "Maintenance completed.".
This maintenance program allows users to update or delete customer records. Notice that both REWRITE and DELETE operations are preceded by a READ operation to locate the target record.
Operation | File Mode | Prerequisite | File Organizations | Common Errors |
---|---|---|---|---|
REWRITE | I-O | Successful READ | All except LINE SEQUENTIAL | Key changes, file not open I-O |
DELETE | I-O | Successful READ | INDEXED, RELATIVE | Record not found, file not open I-O |
Proper error handling is crucial for robust file processing. COBOL provides file status codes that indicate the success or failure of file operations, allowing programs to respond appropriately to various error conditions.
File status codes are two-character values that indicate the result of file operations:
Status Code | Meaning | Common Causes | Typical Response |
---|---|---|---|
"00" | Successful operation | Normal completion | Continue processing |
"10" | End of file | No more records to read | End processing loop |
"23" | Record not found | Invalid key or position | Display error message |
"30" | Permanent error | File corruption, hardware failure | Log error, terminate |
"35" | File not found | File doesn't exist | Create file or exit |
"37" | File already exists | OPEN OUTPUT on existing file | Use EXTEND or different name |
"39" | File organization mismatch | Wrong organization specified | Check file definition |
"41" | File already open | OPEN on already open file | Close file first |
"42" | File not open | I/O operation on closed file | Open file first |
"43" | File not open for input | READ on OUTPUT file | Open file for INPUT or I-O |
"44" | File not open for output | WRITE on INPUT file | Open file for OUTPUT or I-O |
Here are common patterns for handling file errors in COBOL:
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849* Pattern 1: Check status after each operation OPEN INPUT CUSTOMER-FILE IF CUSTOMER-STATUS NOT = "00" EVALUATE CUSTOMER-STATUS WHEN "35" DISPLAY "File not found - creating new file" OPEN OUTPUT CUSTOMER-FILE WHEN "41" DISPLAY "File already open" CLOSE CUSTOMER-FILE OPEN INPUT CUSTOMER-FILE WHEN OTHER DISPLAY "Unexpected error: " CUSTOMER-STATUS STOP RUN END-EVALUATE END-IF * Pattern 2: Use EVALUATE for comprehensive error handling READ CUSTOMER-FILE AT END MOVE "Y" TO EOF-FLAG NOT AT END EVALUATE CUSTOMER-STATUS WHEN "00" PERFORM PROCESS-CUSTOMER WHEN "10" MOVE "Y" TO EOF-FLAG WHEN "23" DISPLAY "Record not found" WHEN "30" DISPLAY "Permanent error - terminating" STOP RUN WHEN OTHER DISPLAY "Unexpected read error: " CUSTOMER-STATUS END-EVALUATE END-READ * Pattern 3: Centralized error handling routine PERFORM CHECK-FILE-STATUS USING CUSTOMER-STATUS "CUSTOMER-FILE" CHECK-FILE-STATUS SECTION. USING STATUS-CODE, FILE-NAME. IF STATUS-CODE NOT = "00" AND STATUS-CODE NOT = "10" DISPLAY "Error in " FILE-NAME ": " STATUS-CODE PERFORM LOG-ERROR USING STATUS-CODE, FILE-NAME IF STATUS-CODE = "30" OR STATUS-CODE = "39" STOP RUN END-IF END-IF.
These patterns help ensure that file errors are handled consistently and appropriately throughout your COBOL programs. Always check file status after operations that can fail.
Write a COBOL program that copies records from one sequential file to another. The program should:
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081IDENTIFICATION DIVISION. PROGRAM-ID. FILE-COPY. ENVIRONMENT DIVISION. INPUT-OUTPUT SECTION. FILE-CONTROL. SELECT INPUT-FILE ASSIGN TO "INPUT.DAT" ORGANIZATION IS SEQUENTIAL ACCESS MODE IS SEQUENTIAL FILE STATUS IS INPUT-STATUS. SELECT OUTPUT-FILE ASSIGN TO "OUTPUT.DAT" ORGANIZATION IS SEQUENTIAL ACCESS MODE IS SEQUENTIAL FILE STATUS IS OUTPUT-STATUS. DATA DIVISION. FILE SECTION. FD INPUT-FILE LABEL RECORDS ARE STANDARD RECORD CONTAINS 80 CHARACTERS. 01 INPUT-RECORD PIC X(80). FD OUTPUT-FILE LABEL RECORDS ARE STANDARD RECORD CONTAINS 80 CHARACTERS. 01 OUTPUT-RECORD PIC X(80). WORKING-STORAGE SECTION. 01 FILE-STATUSES. 05 INPUT-STATUS PIC XX. 05 OUTPUT-STATUS PIC XX. 01 EOF-FLAG PIC X VALUE 'N'. 88 END-OF-FILE VALUE 'Y'. 01 RECORD-COUNT PIC 9(5) VALUE ZERO. PROCEDURE DIVISION. MAIN-PROCESS. PERFORM INITIALIZATION PERFORM COPY-RECORDS UNTIL END-OF-FILE PERFORM FINALIZATION STOP RUN. INITIALIZATION. OPEN INPUT INPUT-FILE IF INPUT-STATUS NOT = "00" DISPLAY "Error opening input file: " INPUT-STATUS STOP RUN END-IF OPEN OUTPUT OUTPUT-FILE IF OUTPUT-STATUS NOT = "00" DISPLAY "Error opening output file: " OUTPUT-STATUS CLOSE INPUT-FILE STOP RUN END-IF. COPY-RECORDS. READ INPUT-FILE AT END MOVE "Y" TO EOF-FLAG NOT AT END IF INPUT-STATUS = "00" MOVE INPUT-RECORD TO OUTPUT-RECORD WRITE OUTPUT-RECORD IF OUTPUT-STATUS = "00" ADD 1 TO RECORD-COUNT ELSE DISPLAY "Error writing record: " OUTPUT-STATUS MOVE "Y" TO EOF-FLAG END-IF ELSE DISPLAY "Error reading record: " INPUT-STATUS MOVE "Y" TO EOF-FLAG END-IF END-READ. FINALIZATION. CLOSE INPUT-FILE CLOSE OUTPUT-FILE DISPLAY "Copy completed. Records processed: " RECORD-COUNT.
This program demonstrates proper file handling with error checking at each step.
Create a program that searches for customers in an indexed file by customer ID. The program should:
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576IDENTIFICATION DIVISION. PROGRAM-ID. CUSTOMER-SEARCH. ENVIRONMENT DIVISION. INPUT-OUTPUT SECTION. FILE-CONTROL. SELECT CUSTOMER-FILE ASSIGN TO "CUSTOMER.DAT" ORGANIZATION IS INDEXED ACCESS MODE IS RANDOM RECORD KEY IS CUSTOMER-ID FILE STATUS IS CUSTOMER-STATUS. DATA DIVISION. FILE SECTION. FD CUSTOMER-FILE LABEL RECORDS ARE STANDARD RECORD CONTAINS 80 CHARACTERS. 01 CUSTOMER-RECORD. 05 CUSTOMER-ID PIC 9(5). 05 CUSTOMER-NAME PIC X(30). 05 CUSTOMER-ADDRESS PIC X(35). 05 CUSTOMER-STATUS PIC X. WORKING-STORAGE SECTION. 01 CUSTOMER-STATUS PIC XX. 01 SEARCH-ID PIC 9(5). 01 CONTINUE-FLAG PIC X VALUE 'Y'. 88 CONTINUE-SEARCH VALUE 'Y'. 88 END-SEARCH VALUE 'N'. PROCEDURE DIVISION. MAIN-PROCESS. PERFORM INITIALIZATION PERFORM SEARCH-LOOP UNTIL END-SEARCH PERFORM FINALIZATION STOP RUN. INITIALIZATION. OPEN INPUT CUSTOMER-FILE IF CUSTOMER-STATUS NOT = "00" DISPLAY "Error opening customer file: " CUSTOMER-STATUS STOP RUN END-IF. SEARCH-LOOP. DISPLAY "Enter customer ID to search (or 00000 to exit): " ACCEPT SEARCH-ID IF SEARCH-ID = 00000 MOVE "N" TO CONTINUE-FLAG ELSE PERFORM SEARCH-CUSTOMER DISPLAY "Search another customer? (Y/N): " ACCEPT CONTINUE-FLAG END-IF. SEARCH-CUSTOMER. MOVE SEARCH-ID TO CUSTOMER-ID READ CUSTOMER-FILE INVALID KEY DISPLAY "Customer " SEARCH-ID " not found" NOT INVALID KEY IF CUSTOMER-STATUS = "00" DISPLAY "Customer found:" DISPLAY " ID: " CUSTOMER-ID DISPLAY " Name: " CUSTOMER-NAME DISPLAY " Address: " CUSTOMER-ADDRESS DISPLAY " Status: " CUSTOMER-STATUS ELSE DISPLAY "Error reading customer: " CUSTOMER-STATUS END-IF END-READ. FINALIZATION. CLOSE CUSTOMER-FILE DISPLAY "Search program completed.".
This program demonstrates random access to indexed files and proper error handling.
Write a program that updates customer records in an indexed file. The program should:
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119IDENTIFICATION DIVISION. PROGRAM-ID. CUSTOMER-UPDATE. ENVIRONMENT DIVISION. INPUT-OUTPUT SECTION. FILE-CONTROL. SELECT TRANSACTION-FILE ASSIGN TO "TRANS.DAT" ORGANIZATION IS SEQUENTIAL ACCESS MODE IS SEQUENTIAL FILE STATUS IS TRANS-STATUS. SELECT CUSTOMER-FILE ASSIGN TO "CUSTOMER.DAT" ORGANIZATION IS INDEXED ACCESS MODE IS RANDOM RECORD KEY IS CUSTOMER-ID FILE STATUS IS CUSTOMER-STATUS. SELECT ERROR-FILE ASSIGN TO "ERROR.DAT" ORGANIZATION IS SEQUENTIAL ACCESS MODE IS SEQUENTIAL FILE STATUS IS ERROR-STATUS. DATA DIVISION. FILE SECTION. FD TRANSACTION-FILE LABEL RECORDS ARE STANDARD RECORD CONTAINS 50 CHARACTERS. 01 TRANSACTION-RECORD. 05 TRANS-CUSTOMER-ID PIC 9(5). 05 TRANS-NAME PIC X(30). 05 TRANS-ADDRESS PIC X(15). FD CUSTOMER-FILE LABEL RECORDS ARE STANDARD RECORD CONTAINS 80 CHARACTERS. 01 CUSTOMER-RECORD. 05 CUSTOMER-ID PIC 9(5). 05 CUSTOMER-NAME PIC X(30). 05 CUSTOMER-ADDRESS PIC X(35). 05 CUSTOMER-STATUS PIC X. FD ERROR-FILE LABEL RECORDS ARE STANDARD RECORD CONTAINS 50 CHARACTERS. 01 ERROR-RECORD PIC X(50). WORKING-STORAGE SECTION. 01 FILE-STATUSES. 05 TRANS-STATUS PIC XX. 05 CUSTOMER-STATUS PIC XX. 05 ERROR-STATUS PIC XX. 01 EOF-FLAG PIC X VALUE 'N'. 88 END-OF-FILE VALUE 'Y'. 01 COUNTERS. 05 TRANS-COUNT PIC 9(5) VALUE ZERO. 05 UPDATE-COUNT PIC 9(5) VALUE ZERO. 05 ERROR-COUNT PIC 9(5) VALUE ZERO. PROCEDURE DIVISION. MAIN-PROCESS. PERFORM INITIALIZATION PERFORM PROCESS-TRANSACTIONS UNTIL END-OF-FILE PERFORM FINALIZATION STOP RUN. INITIALIZATION. OPEN INPUT TRANSACTION-FILE OPEN I-O CUSTOMER-FILE OPEN OUTPUT ERROR-FILE IF TRANS-STATUS NOT = "00" OR CUSTOMER-STATUS NOT = "00" OR ERROR-STATUS NOT = "00" DISPLAY "Error opening files" STOP RUN END-IF. PROCESS-TRANSACTIONS. READ TRANSACTION-FILE AT END MOVE "Y" TO EOF-FLAG NOT AT END ADD 1 TO TRANS-COUNT PERFORM UPDATE-CUSTOMER END-READ. UPDATE-CUSTOMER. MOVE TRANS-CUSTOMER-ID TO CUSTOMER-ID READ CUSTOMER-FILE INVALID KEY PERFORM WRITE-ERROR-RECORD NOT INVALID KEY IF CUSTOMER-STATUS = "00" MOVE TRANS-NAME TO CUSTOMER-NAME MOVE TRANS-ADDRESS TO CUSTOMER-ADDRESS REWRITE CUSTOMER-RECORD INVALID KEY PERFORM WRITE-ERROR-RECORD NOT INVALID KEY ADD 1 TO UPDATE-COUNT END-REWRITE ELSE PERFORM WRITE-ERROR-RECORD END-IF END-READ. WRITE-ERROR-RECORD. MOVE TRANSACTION-RECORD TO ERROR-RECORD WRITE ERROR-RECORD ADD 1 TO ERROR-COUNT. FINALIZATION. CLOSE TRANSACTION-FILE CLOSE CUSTOMER-FILE CLOSE ERROR-FILE DISPLAY "Processing Summary:" DISPLAY " Transactions processed: " TRANS-COUNT DISPLAY " Records updated: " UPDATE-COUNT DISPLAY " Errors: " ERROR-COUNT.
This program demonstrates file maintenance operations with comprehensive error handling and processing statistics.
1. What is the correct sequence of file operations in COBOL?
2. What does the AT END clause in a READ statement do?
3. Which file organization allows both sequential and random access?
4. What is the purpose of the FILE STATUS clause?
5. When should you use the REWRITE statement?
Understanding file descriptions and record layouts.
Detailed guide to sequential file processing.
Working with indexed files for random access.
Handling file operation errors and status codes.
Different file organizations and their characteristics.