Transaction processing in COBOL involves processing transaction records to update master files, generate reports, and maintain data integrity. This typically includes reading transaction files, matching transactions to master records, applying updates (adds, changes, deletes), handling control breaks, validating transactions, and maintaining audit trails. Understanding transaction processing is essential for building batch processing systems, maintaining master data, and implementing business logic that processes business events in mainframe COBOL applications.
Transaction processing involves:
Transaction processing is fundamental to batch processing systems where transactions are collected and processed together.
Understanding the relationship between master and transaction files:
| Aspect | Master File | Transaction File |
|---|---|---|
| Purpose | Contains current, authoritative data | Contains business events/changes to process |
| Organization | Typically indexed (KSDS) for direct access | Typically sequential, processed in order |
| Update frequency | Updated by transaction processing | Created by business events |
| Record type | Master records (accounts, items, etc.) | Transaction records (sales, payments, etc.) |
| Access | Random access by key | Sequential access |
| Lifecycle | Persistent, maintained over time | Processed and archived |
Transactions typically have types that determine the operation:
12345678910111213WORKING-STORAGE SECTION. 01 TRANSACTION-TYPES. 05 TRANS-ADD PIC X VALUE 'A'. *> Add new master record 05 TRANS-UPDATE PIC X VALUE 'U'. *> Update existing master 05 TRANS-DELETE PIC X VALUE 'D'. *> Delete master record 05 TRANS-QUERY PIC X VALUE 'Q'. *> Query only (no update) 01 TRANSACTION-RECORD. 05 TRANS-TYPE PIC X. 05 TRANS-KEY PIC 9(5). 05 TRANS-DATA PIC X(50). 05 TRANS-AMOUNT PIC 9(8)V99. 05 TRANS-DATE PIC 9(8).
Transaction types determine what operation to perform on the master file.
The standard transaction processing pattern:
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657PROCEDURE DIVISION. MAIN-PARA. PERFORM INITIALIZATION PERFORM PROCESS-TRANSACTIONS PERFORM FINALIZATION STOP RUN. INITIALIZATION. OPEN INPUT TRANSACTION-FILE OPEN I-O MASTER-FILE OPEN OUTPUT ERROR-FILE OPEN OUTPUT REPORT-FILE *> Initialize counters and totals MOVE ZERO TO TRANS-COUNT MOVE ZERO TO SUCCESS-COUNT MOVE ZERO TO ERROR-COUNT. PROCESS-TRANSACTIONS. PERFORM UNTIL END-OF-TRANSACTIONS READ TRANSACTION-FILE AT END SET END-OF-TRANSACTIONS TO TRUE NOT AT END ADD 1 TO TRANS-COUNT PERFORM PROCESS-ONE-TRANSACTION END-READ END-PERFORM. PROCESS-ONE-TRANSACTION. *> Validate transaction PERFORM VALIDATE-TRANSACTION IF TRANSACTION-VALID *> Process based on type EVALUATE TRANS-TYPE WHEN 'A' PERFORM ADD-MASTER-RECORD WHEN 'U' PERFORM UPDATE-MASTER-RECORD WHEN 'D' PERFORM DELETE-MASTER-RECORD WHEN OTHER PERFORM HANDLE-INVALID-TYPE END-EVALUATE ELSE PERFORM WRITE-ERROR-RECORD END-IF. FINALIZATION. *> Write summary report PERFORM WRITE-SUMMARY-REPORT CLOSE TRANSACTION-FILE MASTER-FILE ERROR-FILE REPORT-FILE.
12345678910111213141516171819202122232425ADD-MASTER-RECORD. *> Check if master already exists MOVE TRANS-KEY TO MASTER-KEY READ MASTER-FILE INVALID KEY *> Master doesn't exist - good for add MOVE TRANS-KEY TO MASTER-KEY MOVE TRANS-DATA TO MASTER-DATA MOVE TRANS-AMOUNT TO MASTER-BALANCE MOVE TRANS-DATE TO MASTER-DATE WRITE MASTER-RECORD INVALID KEY DISPLAY "Error adding master: " MASTER-KEY ADD 1 TO ERROR-COUNT NOT INVALID KEY ADD 1 TO SUCCESS-COUNT DISPLAY "Master added: " MASTER-KEY END-WRITE NOT INVALID KEY *> Master already exists - error DISPLAY "ERROR: Master already exists: " MASTER-KEY MOVE "Duplicate key on add" TO ERROR-MESSAGE PERFORM WRITE-ERROR-RECORD END-READ.
1234567891011121314151617181920212223UPDATE-MASTER-RECORD. *> Read master record to update MOVE TRANS-KEY TO MASTER-KEY READ MASTER-FILE INVALID KEY *> Master doesn't exist - error DISPLAY "ERROR: Master not found for update: " MASTER-KEY MOVE "Master not found" TO ERROR-MESSAGE PERFORM WRITE-ERROR-RECORD NOT INVALID KEY *> Master exists - apply update ADD TRANS-AMOUNT TO MASTER-BALANCE MOVE TRANS-DATE TO MASTER-LAST-UPDATE REWRITE MASTER-RECORD INVALID KEY DISPLAY "Error updating master: " MASTER-KEY ADD 1 TO ERROR-COUNT NOT INVALID KEY ADD 1 TO SUCCESS-COUNT DISPLAY "Master updated: " MASTER-KEY END-REWRITE END-READ.
1234567891011121314151617181920DELETE-MASTER-RECORD. *> Read master to verify it exists MOVE TRANS-KEY TO MASTER-KEY READ MASTER-FILE INVALID KEY *> Master doesn't exist - error DISPLAY "ERROR: Master not found for delete: " MASTER-KEY MOVE "Master not found" TO ERROR-MESSAGE PERFORM WRITE-ERROR-RECORD NOT INVALID KEY *> Master exists - delete it DELETE MASTER-FILE RECORD INVALID KEY DISPLAY "Error deleting master: " MASTER-KEY ADD 1 TO ERROR-COUNT NOT INVALID KEY ADD 1 TO SUCCESS-COUNT DISPLAY "Master deleted: " MASTER-KEY END-DELETE END-READ.
Validating transactions before processing:
123456789101112131415161718192021222324252627282930313233343536373839VALIDATE-TRANSACTION. MOVE 'Y' TO TRANSACTION-VALID *> Validate transaction type IF TRANS-TYPE NOT = 'A' AND TRANS-TYPE NOT = 'U' AND TRANS-TYPE NOT = 'D' MOVE 'N' TO TRANSACTION-VALID MOVE "Invalid transaction type" TO ERROR-MESSAGE END-IF *> Validate key is present IF TRANS-KEY = ZERO OR TRANS-KEY = SPACES MOVE 'N' TO TRANSACTION-VALID MOVE "Missing or invalid key" TO ERROR-MESSAGE END-IF *> Validate amount (if applicable) IF TRANS-AMOUNT < 0 MOVE 'N' TO TRANSACTION-VALID MOVE "Invalid amount" TO ERROR-MESSAGE END-IF *> Validate date format IF TRANS-DATE NOT NUMERIC MOVE 'N' TO TRANSACTION-VALID MOVE "Invalid date format" TO ERROR-MESSAGE END-IF *> Business rule validation IF TRANS-TYPE = 'U' *> For updates, verify master exists MOVE TRANS-KEY TO MASTER-KEY READ MASTER-FILE INVALID KEY MOVE 'N' TO TRANSACTION-VALID MOVE "Master not found for update" TO ERROR-MESSAGE END-READ END-IF.
Control breaks group transactions and generate subtotals:
1234567891011121314151617181920212223242526272829303132333435363738394041424344WORKING-STORAGE SECTION. 01 PREV-CUSTOMER-ID PIC 9(5) VALUE ZERO. 01 CURRENT-CUSTOMER-ID PIC 9(5). 01 CUSTOMER-TOTAL PIC 9(10)V99 VALUE ZERO. 01 GRAND-TOTAL PIC 9(12)V99 VALUE ZERO. PROCEDURE DIVISION. PROCESS-WITH-CONTROL-BREAKS. PERFORM UNTIL END-OF-TRANSACTIONS READ TRANSACTION-FILE AT END SET END-OF-TRANSACTIONS TO TRUE NOT AT END MOVE TRANS-CUSTOMER-ID TO CURRENT-CUSTOMER-ID *> Check for control break IF PREV-CUSTOMER-ID NOT = ZERO AND CURRENT-CUSTOMER-ID NOT = PREV-CUSTOMER-ID *> Control break - process previous group PERFORM PROCESS-CUSTOMER-BREAK END-IF *> Process current transaction ADD TRANS-AMOUNT TO CUSTOMER-TOTAL ADD TRANS-AMOUNT TO GRAND-TOTAL MOVE CURRENT-CUSTOMER-ID TO PREV-CUSTOMER-ID END-READ END-PERFORM *> Process final group IF PREV-CUSTOMER-ID NOT = ZERO PERFORM PROCESS-CUSTOMER-BREAK END-IF *> Process grand total PERFORM PROCESS-GRAND-TOTAL. PROCESS-CUSTOMER-BREAK. *> Write customer subtotal DISPLAY "Customer " PREV-CUSTOMER-ID " Total: " CUSTOMER-TOTAL WRITE REPORT-LINE FROM CUSTOMER-SUBTOTAL-LINE *> Reset for next customer MOVE ZERO TO CUSTOMER-TOTAL.
Proper error handling is crucial:
1234567891011121314WRITE-ERROR-RECORD. ADD 1 TO ERROR-COUNT *> Write to error file MOVE TRANSACTION-RECORD TO ERROR-RECORD MOVE ERROR-MESSAGE TO ERROR-DETAIL MOVE FUNCTION CURRENT-DATE TO ERROR-TIMESTAMP WRITE ERROR-RECORD *> Write to error report WRITE REPORT-LINE FROM ERROR-LINE DISPLAY "ERROR: " ERROR-MESSAGE DISPLAY " Transaction: " TRANS-KEY.
Complete batch transaction processing example:
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194IDENTIFICATION DIVISION. PROGRAM-ID. BATCH-TRANSACTION-PROCESSOR. ENVIRONMENT DIVISION. INPUT-OUTPUT SECTION. FILE-CONTROL. SELECT TRANSACTION-FILE ASSIGN TO TRANS.DAT ORGANIZATION IS SEQUENTIAL. SELECT MASTER-FILE ASSIGN TO MASTER.VSAM ORGANIZATION IS INDEXED ACCESS MODE IS RANDOM RECORD KEY IS CUSTOMER-ID FILE STATUS IS MASTER-STATUS. SELECT ERROR-FILE ASSIGN TO ERRORS.DAT ORGANIZATION IS SEQUENTIAL. DATA DIVISION. FILE SECTION. FD TRANSACTION-FILE. 01 TRANSACTION-RECORD. 05 TRANS-TYPE PIC X. 05 TRANS-CUSTOMER-ID PIC 9(5). 05 TRANS-AMOUNT PIC 9(8)V99. 05 TRANS-DESCRIPTION PIC X(30). FD MASTER-FILE. 01 MASTER-RECORD. 05 CUSTOMER-ID PIC 9(5). 05 CUSTOMER-NAME PIC X(30). 05 CUSTOMER-BALANCE PIC 9(8)V99. 05 LAST-UPDATE-DATE PIC 9(8). FD ERROR-FILE. 01 ERROR-RECORD PIC X(100). WORKING-STORAGE SECTION. 01 FILE-STATUS-FIELDS. 05 MASTER-STATUS PIC XX. 05 END-OF-TRANS PIC X VALUE 'N'. 88 END-OF-TRANSACTIONS VALUE 'Y'. 01 COUNTERS. 05 TRANS-COUNT PIC 9(6) VALUE ZERO. 05 SUCCESS-COUNT PIC 9(6) VALUE ZERO. 05 ERROR-COUNT PIC 9(6) VALUE ZERO. 01 VALIDATION-FLAGS. 05 TRANSACTION-VALID PIC X VALUE 'Y'. 05 ERROR-MESSAGE PIC X(50). PROCEDURE DIVISION. MAIN-PARA. DISPLAY "=== BATCH TRANSACTION PROCESSOR ===" PERFORM INITIALIZATION PERFORM PROCESS-TRANSACTIONS PERFORM FINALIZATION DISPLAY "=== PROCESSING COMPLETE ===" STOP RUN. INITIALIZATION. DISPLAY "Initializing batch processing..." OPEN INPUT TRANSACTION-FILE OPEN I-O MASTER-FILE OPEN OUTPUT ERROR-FILE IF MASTER-STATUS NOT = '00' DISPLAY "ERROR: Cannot open master file: " MASTER-STATUS STOP RUN END-IF MOVE ZERO TO TRANS-COUNT MOVE ZERO TO SUCCESS-COUNT MOVE ZERO TO ERROR-COUNT DISPLAY "Initialization complete". PROCESS-TRANSACTIONS. DISPLAY "Processing transactions..." PERFORM UNTIL END-OF-TRANSACTIONS READ TRANSACTION-FILE AT END SET END-OF-TRANSACTIONS TO TRUE NOT AT END ADD 1 TO TRANS-COUNT PERFORM PROCESS-ONE-TRANSACTION END-READ END-PERFORM DISPLAY "Transactions processed: " TRANS-COUNT. PROCESS-ONE-TRANSACTION. *> Validate transaction PERFORM VALIDATE-TRANSACTION IF TRANSACTION-VALID *> Process based on type EVALUATE TRANS-TYPE WHEN 'A' PERFORM ADD-MASTER-RECORD WHEN 'U' PERFORM UPDATE-MASTER-RECORD WHEN 'D' PERFORM DELETE-MASTER-RECORD WHEN OTHER MOVE "Invalid transaction type" TO ERROR-MESSAGE PERFORM WRITE-ERROR-RECORD END-EVALUATE ELSE PERFORM WRITE-ERROR-RECORD END-IF. VALIDATE-TRANSACTION. MOVE 'Y' TO TRANSACTION-VALID *> Validate transaction type IF TRANS-TYPE NOT = 'A' AND TRANS-TYPE NOT = 'U' AND TRANS-TYPE NOT = 'D' MOVE 'N' TO TRANSACTION-VALID MOVE "Invalid transaction type" TO ERROR-MESSAGE END-IF *> Validate customer ID IF TRANS-CUSTOMER-ID = ZERO MOVE 'N' TO TRANSACTION-VALID MOVE "Invalid customer ID" TO ERROR-MESSAGE END-IF. ADD-MASTER-RECORD. MOVE TRANS-CUSTOMER-ID TO CUSTOMER-ID READ MASTER-FILE INVALID KEY *> Good - master doesn't exist MOVE TRANS-CUSTOMER-ID TO CUSTOMER-ID MOVE SPACES TO CUSTOMER-NAME MOVE TRANS-AMOUNT TO CUSTOMER-BALANCE ACCEPT LAST-UPDATE-DATE FROM DATE YYYYMMDD WRITE MASTER-RECORD INVALID KEY ADD 1 TO ERROR-COUNT NOT INVALID KEY ADD 1 TO SUCCESS-COUNT END-WRITE NOT INVALID KEY MOVE "Master already exists" TO ERROR-MESSAGE PERFORM WRITE-ERROR-RECORD END-READ. UPDATE-MASTER-RECORD. MOVE TRANS-CUSTOMER-ID TO CUSTOMER-ID READ MASTER-FILE INVALID KEY MOVE "Master not found" TO ERROR-MESSAGE PERFORM WRITE-ERROR-RECORD NOT INVALID KEY ADD TRANS-AMOUNT TO CUSTOMER-BALANCE ACCEPT LAST-UPDATE-DATE FROM DATE YYYYMMDD REWRITE MASTER-RECORD INVALID KEY ADD 1 TO ERROR-COUNT NOT INVALID KEY ADD 1 TO SUCCESS-COUNT END-REWRITE END-READ. DELETE-MASTER-RECORD. MOVE TRANS-CUSTOMER-ID TO CUSTOMER-ID DELETE MASTER-FILE RECORD INVALID KEY MOVE "Master not found" TO ERROR-MESSAGE PERFORM WRITE-ERROR-RECORD NOT INVALID KEY ADD 1 TO SUCCESS-COUNT END-DELETE. WRITE-ERROR-RECORD. ADD 1 TO ERROR-COUNT MOVE TRANSACTION-RECORD TO ERROR-RECORD WRITE ERROR-RECORD DISPLAY "ERROR: " ERROR-MESSAGE " - Customer: " TRANS-CUSTOMER-ID. FINALIZATION. DISPLAY "Finalizing batch processing..." DISPLAY "Total transactions: " TRANS-COUNT DISPLAY "Successful: " SUCCESS-COUNT DISPLAY "Errors: " ERROR-COUNT CLOSE TRANSACTION-FILE MASTER-FILE ERROR-FILE DISPLAY "Finalization complete".
Follow these best practices:
Think of transaction processing like managing a piggy bank:
So transaction processing is like keeping your piggy bank balance up to date by going through a list of things that happened and updating the balance for each one!
Complete these exercises to reinforce your understanding:
Create a program that reads transaction records, validates them, and updates a master file. Handle ADD, UPDATE, and DELETE transaction types.
Create a comprehensive validation routine that checks transaction type, key fields, data formats, and business rules. Write invalid transactions to an error file.
Create a program that processes transactions with control breaks by customer ID, generating subtotals for each customer and a grand total.
Create a batch processing program that processes transactions, updates master files, writes errors to an error file, and generates a summary report of processing results.
Create a program that processes transactions, handles errors gracefully, maintains statistics, and provides detailed error reporting with transaction details.
1. What is a master file in transaction processing?
2. What is a transaction file?
3. What is a control break?
4. What is the typical sequence for updating a master file?
5. What is batch processing?
6. What should you do with invalid transactions?