The WRITE statement is used to add new records to a file. It is one of the fundamental file processing verbs in COBOL, allowing programs to create and append data to files. The WRITE statement supports various options depending on the file organization and access mode.
1234567WRITE record-name [FROM data-name] [ADVANCING {identifier-1 | integer-1 | mnemonic-name} {LINE | LINES | PAGE}] [BEFORE | AFTER] [AT END-OF-PAGE imperative-statement-1] [NOT AT END-OF-PAGE imperative-statement-2] [END-WRITE]
The WRITE statement writes a record to a file. The record-name must be defined in the FILE SECTION and correspond to a file opened in OUTPUT, EXTEND, or I-O mode.
File Mode | WRITE Allowed | Purpose |
---|---|---|
OUTPUT | Yes | Create new file, write records |
EXTEND | Yes | Append records to existing file |
I-O | Yes | Read and write operations |
INPUT | No | Read-only operations |
The WRITE statement supports several optional clauses that provide additional functionality for different file organizations and output requirements.
The FROM clause copies data from a working storage field to the record before writing:
123456789* Basic FROM clause WRITE CUSTOMER-RECORD FROM WS-CUSTOMER-DATA. * FROM clause with literal WRITE HEADER-RECORD FROM "CUSTOMER MASTER FILE". * FROM clause with calculated data COMPUTE WS-TOTAL = WS-AMOUNT + WS-TAX WRITE TOTAL-RECORD FROM WS-TOTAL.
The FROM clause is useful when you want to write data from a different source than the record description, or when you need to perform calculations before writing.
The ADVANCING clause controls line spacing for LINE SEQUENTIAL files:
1234567891011121314* Single line advance (default) WRITE REPORT-LINE ADVANCING 1 LINE. * Double spacing WRITE REPORT-LINE ADVANCING 2 LINES. * Page break WRITE REPORT-LINE ADVANCING PAGE. * Variable spacing WRITE REPORT-LINE ADVANCING WS-LINE-COUNT LINES. * No advance WRITE REPORT-LINE ADVANCING 0 LINES.
The ADVANCING clause is required for LINE SEQUENTIAL files and ignored for other file organizations. It controls how many lines to advance after writing the record.
Controls when the line advance occurs relative to the WRITE operation:
12345678* AFTER ADVANCING (default) - advance after writing WRITE REPORT-LINE AFTER ADVANCING 1 LINE. * BEFORE ADVANCING - advance before writing WRITE REPORT-LINE BEFORE ADVANCING 1 LINE. * BEFORE ADVANCING PAGE - page break before writing WRITE REPORT-LINE BEFORE ADVANCING PAGE.
BEFORE ADVANCING is useful when you want to write at a specific line position, while AFTER ADVANCING is the standard behavior for most applications.
Handles page overflow conditions for LINE SEQUENTIAL files:
1234567WRITE REPORT-LINE AT END-OF-PAGE PERFORM PRINT-PAGE-HEADER MOVE 1 TO LINE-COUNTER NOT AT END-OF-PAGE ADD 1 TO LINE-COUNTER END-WRITE.
The AT END-OF-PAGE clause allows you to handle page overflow conditions and perform special processing when a page break occurs.
The behavior of the WRITE statement varies depending on the file organization. Understanding these differences is crucial for proper file handling.
WRITE operations with sequential files are straightforward:
123456* Sequential file WRITE OPEN OUTPUT CUSTOMER-FILE MOVE "JOHN DOE" TO CUSTOMER-NAME MOVE "123 MAIN ST" TO CUSTOMER-ADDRESS WRITE CUSTOMER-RECORD CLOSE CUSTOMER-FILE.
Records are written in the order they are processed. No special considerations are needed for sequential files.
Indexed files require key field values and support duplicate key handling:
123456789101112* Indexed file WRITE with error handling OPEN OUTPUT CUSTOMER-FILE MOVE "C001" TO CUSTOMER-ID MOVE "JOHN DOE" TO CUSTOMER-NAME WRITE CUSTOMER-RECORD INVALID KEY DISPLAY "Duplicate key: " CUSTOMER-ID PERFORM ERROR-HANDLING NOT INVALID KEY DISPLAY "Record written successfully" END-WRITE CLOSE CUSTOMER-FILE.
The INVALID KEY clause is essential for handling duplicate key errors in indexed files. The key field must be properly set before the WRITE operation.
Relative files require a relative record number for positioning:
1234567891011* Relative file WRITE OPEN OUTPUT CUSTOMER-FILE MOVE 1 TO CUSTOMER-ID MOVE "JOHN DOE" TO CUSTOMER-NAME WRITE CUSTOMER-RECORD INVALID KEY DISPLAY "Invalid relative record number: " CUSTOMER-ID NOT INVALID KEY DISPLAY "Record written at position: " CUSTOMER-ID END-WRITE CLOSE CUSTOMER-FILE.
The relative record number (key field) determines where the record is written. Gaps in the file are filled with empty records.
LINE SEQUENTIAL files require the ADVANCING clause:
1234567* LINE SEQUENTIAL file WRITE OPEN OUTPUT REPORT-FILE MOVE "CUSTOMER REPORT" TO REPORT-LINE WRITE REPORT-LINE ADVANCING 2 LINES MOVE "================" TO REPORT-LINE WRITE REPORT-LINE ADVANCING 1 LINE CLOSE REPORT-FILE.
The ADVANCING clause is required for LINE SEQUENTIAL files to control line spacing. This is commonly used for report generation.
Proper error handling is essential when using WRITE statements. Understanding file status codes helps diagnose and handle errors effectively.
Status Code | Meaning | Action Required |
---|---|---|
00 | Successful operation | Continue processing |
22 | Duplicate key (indexed files) | Handle duplicate key logic |
23 | No record found | Check record existence |
30 | Permanent error | Check file permissions, disk space |
34 | Boundary violation | Check record size limits |
35 | File not found | Check file existence |
37 | File not open | Ensure file is opened |
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677IDENTIFICATION DIVISION. PROGRAM-ID. WRITE-ERROR-HANDLING. ENVIRONMENT DIVISION. INPUT-OUTPUT SECTION. FILE-CONTROL. SELECT CUSTOMER-FILE ASSIGN TO "CUSTOMER.DAT" ORGANIZATION IS INDEXED ACCESS MODE IS SEQUENTIAL 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 X(5). 05 CUSTOMER-NAME PIC X(30). 05 CUSTOMER-ADDRESS PIC X(45). WORKING-STORAGE SECTION. 01 CUSTOMER-STATUS PIC XX. 01 ERROR-MESSAGE PIC X(50). PROCEDURE DIVISION. MAIN-PROCESS. PERFORM INITIALIZATION PERFORM WRITE-RECORDS PERFORM FINALIZATION STOP RUN. INITIALIZATION. OPEN OUTPUT CUSTOMER-FILE IF CUSTOMER-STATUS NOT = "00" DISPLAY "Error opening file: " CUSTOMER-STATUS STOP RUN END-IF. WRITE-RECORDS. MOVE "C001" TO CUSTOMER-ID MOVE "JOHN DOE" TO CUSTOMER-NAME MOVE "123 MAIN STREET" TO CUSTOMER-ADDRESS WRITE CUSTOMER-RECORD INVALID KEY PERFORM HANDLE-INVALID-KEY NOT INVALID KEY DISPLAY "Record written successfully" END-WRITE * Check file status after WRITE IF CUSTOMER-STATUS NOT = "00" PERFORM HANDLE-WRITE-ERROR END-IF. HANDLE-INVALID-KEY. EVALUATE CUSTOMER-STATUS WHEN "22" MOVE "Duplicate key detected" TO ERROR-MESSAGE WHEN "30" MOVE "Permanent error occurred" TO ERROR-MESSAGE WHEN "34" MOVE "Boundary violation" TO ERROR-MESSAGE WHEN OTHER MOVE "Unknown error occurred" TO ERROR-MESSAGE END-EVALUATE DISPLAY "Error: " ERROR-MESSAGE. HANDLE-WRITE-ERROR. DISPLAY "Write error - Status: " CUSTOMER-STATUS PERFORM FINALIZATION STOP RUN. FINALIZATION. CLOSE CUSTOMER-FILE.
This example demonstrates comprehensive error handling for WRITE operations, including INVALID KEY processing and file status checking.
These practical examples demonstrate common WRITE statement usage patterns for different scenarios and file types.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869IDENTIFICATION DIVISION. PROGRAM-ID. CREATE-CUSTOMER-FILE. ENVIRONMENT DIVISION. INPUT-OUTPUT SECTION. FILE-CONTROL. SELECT CUSTOMER-FILE ASSIGN TO "CUSTOMER.DAT" ORGANIZATION IS INDEXED ACCESS MODE IS SEQUENTIAL RECORD KEY IS CUSTOMER-ID FILE STATUS IS CUSTOMER-STATUS. DATA DIVISION. FILE SECTION. FD CUSTOMER-FILE LABEL RECORDS ARE STANDARD RECORD CONTAINS 100 CHARACTERS. 01 CUSTOMER-RECORD. 05 CUSTOMER-ID PIC X(5). 05 CUSTOMER-NAME PIC X(30). 05 CUSTOMER-ADDRESS PIC X(50). 05 CUSTOMER-PHONE PIC X(15). WORKING-STORAGE SECTION. 01 CUSTOMER-STATUS PIC XX. 01 RECORD-COUNT PIC 9(5) VALUE 0. PROCEDURE DIVISION. MAIN-PROCESS. PERFORM INITIALIZATION PERFORM CREATE-CUSTOMERS PERFORM FINALIZATION STOP RUN. INITIALIZATION. OPEN OUTPUT CUSTOMER-FILE IF CUSTOMER-STATUS NOT = "00" DISPLAY "Error opening file: " CUSTOMER-STATUS STOP RUN END-IF. CREATE-CUSTOMERS. * Customer 1 MOVE "C001" TO CUSTOMER-ID MOVE "JOHN DOE" TO CUSTOMER-NAME MOVE "123 MAIN STREET, ANYTOWN, USA" TO CUSTOMER-ADDRESS MOVE "(555) 123-4567" TO CUSTOMER-PHONE WRITE CUSTOMER-RECORD ADD 1 TO RECORD-COUNT * Customer 2 MOVE "C002" TO CUSTOMER-ID MOVE "JANE SMITH" TO CUSTOMER-NAME MOVE "456 OAK AVENUE, SOMETOWN, USA" TO CUSTOMER-ADDRESS MOVE "(555) 987-6543" TO CUSTOMER-PHONE WRITE CUSTOMER-RECORD ADD 1 TO RECORD-COUNT * Customer 3 MOVE "C003" TO CUSTOMER-ID MOVE "BOB JOHNSON" TO CUSTOMER-NAME MOVE "789 PINE ROAD, OTHERTOWN, USA" TO CUSTOMER-ADDRESS MOVE "(555) 456-7890" TO CUSTOMER-PHONE WRITE CUSTOMER-RECORD ADD 1 TO RECORD-COUNT. FINALIZATION. CLOSE CUSTOMER-FILE DISPLAY "Created " RECORD-COUNT " customer records".
This example creates an indexed customer master file with three sample records.
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465IDENTIFICATION DIVISION. PROGRAM-ID. GENERATE-REPORT. ENVIRONMENT DIVISION. INPUT-OUTPUT SECTION. FILE-CONTROL. SELECT REPORT-FILE ASSIGN TO "SALES-REPORT.TXT" ORGANIZATION IS LINE SEQUENTIAL FILE STATUS IS REPORT-STATUS. DATA DIVISION. FILE SECTION. FD REPORT-FILE LABEL RECORDS ARE OMITTED RECORD CONTAINS 80 CHARACTERS. 01 REPORT-LINE PIC X(80). WORKING-STORAGE SECTION. 01 REPORT-STATUS PIC XX. 01 LINE-COUNTER PIC 9(3) VALUE 0. 01 PAGE-COUNTER PIC 9(3) VALUE 1. PROCEDURE DIVISION. MAIN-PROCESS. PERFORM INITIALIZATION PERFORM WRITE-REPORT-HEADER PERFORM WRITE-REPORT-BODY PERFORM WRITE-REPORT-FOOTER PERFORM FINALIZATION STOP RUN. INITIALIZATION. OPEN OUTPUT REPORT-FILE. WRITE-REPORT-HEADER. MOVE "SALES REPORT" TO REPORT-LINE WRITE REPORT-LINE ADVANCING 2 LINES MOVE "=============" TO REPORT-LINE WRITE REPORT-LINE ADVANCING 1 LINE MOVE "DATE: 12/31/2023" TO REPORT-LINE WRITE REPORT-LINE ADVANCING 2 LINES. WRITE-REPORT-BODY. MOVE "CUSTOMER SALES AMOUNT DATE" TO REPORT-LINE WRITE REPORT-LINE ADVANCING 1 LINE MOVE "-------- ------------ ----" TO REPORT-LINE WRITE REPORT-LINE ADVANCING 1 LINE MOVE "JOHN DOE $1,250.00 12/15/2023" TO REPORT-LINE WRITE REPORT-LINE ADVANCING 1 LINE MOVE "JANE SMITH $2,100.00 12/20/2023" TO REPORT-LINE WRITE REPORT-LINE ADVANCING 1 LINE MOVE "BOB JOHNSON $950.00 12/25/2023" TO REPORT-LINE WRITE REPORT-LINE ADVANCING 1 LINE. WRITE-REPORT-FOOTER. MOVE "-------- ------------ ----" TO REPORT-LINE WRITE REPORT-LINE ADVANCING 1 LINE MOVE "TOTAL $4,300.00" TO REPORT-LINE WRITE REPORT-LINE ADVANCING 2 LINES MOVE "END OF REPORT" TO REPORT-LINE WRITE REPORT-LINE ADVANCING 1 LINE. FINALIZATION. CLOSE REPORT-FILE.
This example demonstrates report generation using LINE SEQUENTIAL files with proper line spacing and formatting.
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061IDENTIFICATION DIVISION. PROGRAM-ID. APPEND-TRANSACTIONS. ENVIRONMENT DIVISION. INPUT-OUTPUT SECTION. FILE-CONTROL. SELECT TRANSACTION-FILE ASSIGN TO "TRANSACTIONS.DAT" ORGANIZATION IS SEQUENTIAL ACCESS MODE IS SEQUENTIAL FILE STATUS IS TRANSACTION-STATUS. DATA DIVISION. FILE SECTION. FD TRANSACTION-FILE LABEL RECORDS ARE STANDARD RECORD CONTAINS 50 CHARACTERS. 01 TRANSACTION-RECORD. 05 TRANSACTION-ID PIC X(10). 05 TRANSACTION-DATE PIC 9(8). 05 TRANSACTION-AMT PIC 9(7)V99. 05 TRANSACTION-TYPE PIC X. 05 FILLER PIC X(23). WORKING-STORAGE SECTION. 01 TRANSACTION-STATUS PIC XX. 01 APPEND-COUNT PIC 9(3) VALUE 0. PROCEDURE DIVISION. MAIN-PROCESS. PERFORM INITIALIZATION PERFORM APPEND-TRANSACTIONS PERFORM FINALIZATION STOP RUN. INITIALIZATION. OPEN EXTEND TRANSACTION-FILE IF TRANSACTION-STATUS NOT = "00" DISPLAY "Error opening file: " TRANSACTION-STATUS STOP RUN END-IF. APPEND-TRANSACTIONS. * Append transaction 1 MOVE "TXN001" TO TRANSACTION-ID MOVE 20231231 TO TRANSACTION-DATE MOVE 1250.50 TO TRANSACTION-AMT MOVE "S" TO TRANSACTION-TYPE WRITE TRANSACTION-RECORD ADD 1 TO APPEND-COUNT * Append transaction 2 MOVE "TXN002" TO TRANSACTION-ID MOVE 20231231 TO TRANSACTION-DATE MOVE 750.25 TO TRANSACTION-AMT MOVE "P" TO TRANSACTION-TYPE WRITE TRANSACTION-RECORD ADD 1 TO APPEND-COUNT. FINALIZATION. CLOSE TRANSACTION-FILE DISPLAY "Appended " APPEND-COUNT " transactions".
This example demonstrates appending records to an existing sequential file using the EXTEND mode.
Following these best practices ensures reliable and efficient WRITE operations in COBOL programs.
1. What is the basic syntax of the WRITE statement in COBOL?
2. When is the ADVANCING clause required in a WRITE statement?
3. What does the FROM clause do in a WRITE statement?
4. Which file organization requires a prior READ before using WRITE?
5. What is the purpose of the INVALID KEY clause in a WRITE statement?
Understanding file operations and WRITE usage.
How file organization affects WRITE operations.
WRITE operations with sequential files.
WRITE operations with indexed files.
Error handling for WRITE operations.