The END-REWRITE statement represents a fundamental component of file update operations in COBOL, serving as an explicit scope terminator that clearly defines the boundaries of REWRITE statement blocks. This statement embodies modern data management principles by providing unambiguous termination points for record modification operations, enabling sophisticated error handling for file update scenarios, and supporting the development of robust data processing applications that require precise control over file modification operations and data integrity maintenance.
In contemporary enterprise COBOL development, END-REWRITE plays a vital role in creating sophisticated data update systems that must handle various file types, concurrent access scenarios, and complex validation requirements. By providing explicit termination for REWRITE blocks, this statement enables developers to implement comprehensive file update logic while maintaining code clarity and ensuring that modification operations are properly bounded and controlled within the application's data processing flow.
The END-REWRITE statement implements sophisticated scope management for file update operations. This architecture addresses the complexity inherent in modern data processing scenarios where REWRITE statements must manage record locking, concurrent access control, data validation, and integrity constraints. The explicit termination provided by END-REWRITE ensures that all these operations are properly contained within defined boundaries.
The architectural design of END-REWRITE reflects the evolution of COBOL toward robust data management paradigms that emphasize transaction integrity, proper error handling, and maintainable code organization. When used with conditional phrases like INVALID KEY and NOT INVALID KEY, END-REWRITE creates a comprehensive framework for handling both successful updates and various error conditions that may arise during file modification operations.
END-REWRITE also plays a crucial role in transaction management and data consistency. Modern COBOL implementations can perform more sophisticated analysis when update boundaries are explicitly defined, leading to better transaction control, more efficient locking mechanisms, and improved data integrity management for concurrent file access scenarios.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243IDENTIFICATION DIVISION. PROGRAM-ID. END-REWRITE-DEMO. ENVIRONMENT DIVISION. INPUT-OUTPUT SECTION. FILE-CONTROL. SELECT CUSTOMER-FILE ASSIGN TO 'CUSTOMERS.DAT' ORGANIZATION IS INDEXED ACCESS MODE IS DYNAMIC RECORD KEY IS CUSTOMER-ID FILE STATUS IS CUSTOMER-FILE-STATUS. DATA DIVISION. FILE SECTION. FD CUSTOMER-FILE. 01 CUSTOMER-RECORD. 05 CUSTOMER-ID PIC X(10). 05 CUSTOMER-NAME PIC X(30). 05 CUSTOMER-ADDRESS PIC X(50). 05 CUSTOMER-PHONE PIC X(15). 05 CUSTOMER-BALANCE PIC S9(9)V99. 05 CUSTOMER-CREDIT-LIMIT PIC 9(9)V99. 05 CUSTOMER-STATUS PIC X(2). 05 LAST-UPDATE-DATE PIC X(8). WORKING-STORAGE SECTION. 01 FILE-STATUS-CONTROLS. 05 CUSTOMER-FILE-STATUS PIC XX. 88 FILE-OK VALUE '00'. 88 RECORD-NOT-FOUND VALUE '23'. 88 FILE-ERROR VALUE '01' THRU '22', '24' THRU '99'. 01 UPDATE-CONTROLS. 05 UPDATES-PROCESSED PIC 9(7) VALUE 0. 05 SUCCESSFUL-UPDATES PIC 9(7) VALUE 0. 05 FAILED-UPDATES PIC 9(7) VALUE 0. 05 VALIDATION-ERRORS PIC 9(5) VALUE 0. 01 CUSTOMER-UPDATES. 05 UPDATE-TYPE PIC X(2). 88 ADDRESS-UPDATE VALUE 'AD'. 88 PHONE-UPDATE VALUE 'PH'. 88 BALANCE-UPDATE VALUE 'BA'. 88 CREDIT-UPDATE VALUE 'CR'. 88 STATUS-UPDATE VALUE 'ST'. 05 NEW-ADDRESS PIC X(50). 05 NEW-PHONE PIC X(15). 05 NEW-BALANCE PIC S9(9)V99. 05 NEW-CREDIT-LIMIT PIC 9(9)V99. 05 NEW-STATUS PIC X(2). 01 PROCESSING-FLAGS. 05 CONTINUE-FLAG PIC X VALUE 'Y'. 88 CONTINUE-PROCESSING VALUE 'Y'. 88 STOP-PROCESSING VALUE 'N'. PROCEDURE DIVISION. MAIN-PROCESSING. PERFORM INITIALIZE-FILE-PROCESSING PERFORM PROCESS-CUSTOMER-UPDATES PERFORM FINALIZE-FILE-PROCESSING STOP RUN. INITIALIZE-FILE-PROCESSING. DISPLAY 'Initializing customer file processing...' OPEN I-O CUSTOMER-FILE IF NOT FILE-OK DISPLAY 'Error opening customer file: ' CUSTOMER-FILE-STATUS STOP RUN END-IF DISPLAY 'Customer file opened successfully' SET CONTINUE-PROCESSING TO TRUE. PROCESS-CUSTOMER-UPDATES. DISPLAY 'Starting customer update processing...' PERFORM DEMONSTRATE-ADDRESS-UPDATE PERFORM DEMONSTRATE-BALANCE-UPDATE PERFORM DEMONSTRATE-CREDIT-LIMIT-UPDATE PERFORM DEMONSTRATE-STATUS-UPDATE PERFORM DEMONSTRATE-BATCH-UPDATES DISPLAY 'Customer update processing completed'. DEMONSTRATE-ADDRESS-UPDATE. DISPLAY 'Demonstrating address update...' MOVE 'CUST001' TO CUSTOMER-ID MOVE '123 NEW MAIN STREET, ANYTOWN, ST 12345' TO NEW-ADDRESS PERFORM READ-CUSTOMER-RECORD IF FILE-OK MOVE NEW-ADDRESS TO CUSTOMER-ADDRESS MOVE FUNCTION CURRENT-DATE(1:8) TO LAST-UPDATE-DATE PERFORM UPDATE-CUSTOMER-RECORD ELSE DISPLAY 'Customer not found: ' CUSTOMER-ID END-IF. DEMONSTRATE-BALANCE-UPDATE. DISPLAY 'Demonstrating balance update...' MOVE 'CUST002' TO CUSTOMER-ID MOVE 1500.00 TO NEW-BALANCE PERFORM READ-CUSTOMER-RECORD IF FILE-OK *> Validate balance change IF NEW-BALANCE >= 0 AND NEW-BALANCE <= CUSTOMER-CREDIT-LIMIT MOVE NEW-BALANCE TO CUSTOMER-BALANCE MOVE FUNCTION CURRENT-DATE(1:8) TO LAST-UPDATE-DATE PERFORM UPDATE-CUSTOMER-RECORD ELSE DISPLAY 'Invalid balance amount: ' NEW-BALANCE ADD 1 TO VALIDATION-ERRORS END-IF ELSE DISPLAY 'Customer not found: ' CUSTOMER-ID END-IF. DEMONSTRATE-CREDIT-LIMIT-UPDATE. DISPLAY 'Demonstrating credit limit update...' MOVE 'CUST003' TO CUSTOMER-ID MOVE 5000.00 TO NEW-CREDIT-LIMIT PERFORM READ-CUSTOMER-RECORD IF FILE-OK *> Validate credit limit IF NEW-CREDIT-LIMIT >= CUSTOMER-BALANCE MOVE NEW-CREDIT-LIMIT TO CUSTOMER-CREDIT-LIMIT MOVE FUNCTION CURRENT-DATE(1:8) TO LAST-UPDATE-DATE PERFORM UPDATE-CUSTOMER-RECORD ELSE DISPLAY 'Credit limit below current balance' ADD 1 TO VALIDATION-ERRORS END-IF ELSE DISPLAY 'Customer not found: ' CUSTOMER-ID END-IF. DEMONSTRATE-STATUS-UPDATE. DISPLAY 'Demonstrating status update...' MOVE 'CUST004' TO CUSTOMER-ID MOVE 'AC' TO NEW-STATUS *> Active status PERFORM READ-CUSTOMER-RECORD IF FILE-OK *> Validate status change EVALUATE NEW-STATUS WHEN 'AC' *> Active MOVE NEW-STATUS TO CUSTOMER-STATUS WHEN 'SU' *> Suspended MOVE NEW-STATUS TO CUSTOMER-STATUS WHEN 'CL' *> Closed MOVE NEW-STATUS TO CUSTOMER-STATUS MOVE 0 TO CUSTOMER-BALANCE WHEN OTHER DISPLAY 'Invalid status code: ' NEW-STATUS ADD 1 TO VALIDATION-ERRORS EXIT PERFORM END-EVALUATE MOVE FUNCTION CURRENT-DATE(1:8) TO LAST-UPDATE-DATE PERFORM UPDATE-CUSTOMER-RECORD ELSE DISPLAY 'Customer not found: ' CUSTOMER-ID END-IF. DEMONSTRATE-BATCH-UPDATES. DISPLAY 'Demonstrating batch updates...' *> Process multiple customer updates PERFORM VARYING CUSTOMER-ID FROM 'CUST005' BY 1 UNTIL CUSTOMER-ID > 'CUST010' PERFORM PROCESS-SINGLE-CUSTOMER-UPDATE END-PERFORM. PROCESS-SINGLE-CUSTOMER-UPDATE. PERFORM READ-CUSTOMER-RECORD IF FILE-OK *> Apply standard processing updates COMPUTE CUSTOMER-BALANCE = CUSTOMER-BALANCE * 1.02 *> 2% increase MOVE FUNCTION CURRENT-DATE(1:8) TO LAST-UPDATE-DATE PERFORM UPDATE-CUSTOMER-RECORD ELSE DISPLAY 'Customer not found in batch: ' CUSTOMER-ID END-IF. READ-CUSTOMER-RECORD. READ CUSTOMER-FILE KEY IS CUSTOMER-ID INVALID KEY DISPLAY 'Customer not found: ' CUSTOMER-ID NOT INVALID KEY DISPLAY 'Customer record read: ' CUSTOMER-ID DISPLAY 'Current balance: ' CUSTOMER-BALANCE END-READ. UPDATE-CUSTOMER-RECORD. ADD 1 TO UPDATES-PROCESSED REWRITE CUSTOMER-RECORD INVALID KEY DISPLAY 'Update failed for customer: ' CUSTOMER-ID DISPLAY 'File status: ' CUSTOMER-FILE-STATUS ADD 1 TO FAILED-UPDATES *> Log the error details DISPLAY 'Error details:' DISPLAY 'Customer ID: ' CUSTOMER-ID DISPLAY 'Customer Name: ' CUSTOMER-NAME DISPLAY 'File Status: ' CUSTOMER-FILE-STATUS NOT INVALID KEY DISPLAY 'Customer updated successfully: ' CUSTOMER-ID DISPLAY 'New balance: ' CUSTOMER-BALANCE DISPLAY 'Update date: ' LAST-UPDATE-DATE ADD 1 TO SUCCESSFUL-UPDATES END-REWRITE. FINALIZE-FILE-PROCESSING. CLOSE CUSTOMER-FILE DISPLAY 'File processing statistics:' DISPLAY 'Updates processed: ' UPDATES-PROCESSED DISPLAY 'Successful updates: ' SUCCESSFUL-UPDATES DISPLAY 'Failed updates: ' FAILED-UPDATES DISPLAY 'Validation errors: ' VALIDATION-ERRORS IF UPDATES-PROCESSED > 0 COMPUTE SUCCESSFUL-UPDATES = (SUCCESSFUL-UPDATES / UPDATES-PROCESSED) * 100 DISPLAY 'Success rate: ' SUCCESSFUL-UPDATES '%' END-IF.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498IDENTIFICATION DIVISION. PROGRAM-ID. ADVANCED-END-REWRITE. ENVIRONMENT DIVISION. INPUT-OUTPUT SECTION. FILE-CONTROL. SELECT ACCOUNT-MASTER ASSIGN TO 'ACCOUNTS.DAT' ORGANIZATION IS INDEXED ACCESS MODE IS DYNAMIC RECORD KEY IS ACCOUNT-NUMBER ALTERNATE RECORD KEY IS CUSTOMER-SSN WITH DUPLICATES FILE STATUS IS MASTER-FILE-STATUS. SELECT TRANSACTION-LOG ASSIGN TO 'TRANS.LOG' ORGANIZATION IS SEQUENTIAL ACCESS MODE IS SEQUENTIAL. DATA DIVISION. FILE SECTION. FD ACCOUNT-MASTER. 01 ACCOUNT-RECORD. 05 ACCOUNT-NUMBER PIC X(12). 05 CUSTOMER-SSN PIC X(11). 05 ACCOUNT-TYPE PIC X(2). 05 ACCOUNT-BALANCE PIC S9(11)V99. 05 AVAILABLE-BALANCE PIC S9(11)V99. 05 CREDIT-LIMIT PIC 9(11)V99. 05 INTEREST-RATE PIC 9V9999. 05 LAST-TRANSACTION-DATE PIC X(8). 05 ACCOUNT-STATUS PIC X(2). 05 OVERDRAFT-PROTECTION PIC X(1). 05 MONTHLY-FEE PIC 9(5)V99. 05 TRANSACTION-COUNT PIC 9(7). FD TRANSACTION-LOG. 01 LOG-RECORD PIC X(200). WORKING-STORAGE SECTION. 01 FILE-STATUS-CONTROLS. 05 MASTER-FILE-STATUS PIC XX. 88 MASTER-FILE-OK VALUE '00'. 88 RECORD-NOT-FOUND VALUE '23'. 88 RECORD-LOCKED VALUE '9D'. 88 MASTER-FILE-ERROR VALUE '01' THRU '22', '24' THRU '9C', '9E' THRU '99'. 01 TRANSACTION-PROCESSING. 05 TRANSACTION-TYPES. 10 TRANS-TYPE PIC X(2). 88 DEPOSIT VALUE 'DP'. 88 WITHDRAWAL VALUE 'WD'. 88 TRANSFER-IN VALUE 'TI'. 88 TRANSFER-OUT VALUE 'TO'. 88 FEE-CHARGE VALUE 'FC'. 88 INTEREST-CREDIT VALUE 'IC'. 88 OVERDRAFT-FEE VALUE 'OF'. 05 TRANSACTION-AMOUNT PIC S9(11)V99. 05 REFERENCE-NUMBER PIC X(20). 05 TRANSACTION-DATE PIC X(8). 01 ADVANCED-CONTROLS. 05 BATCH-PROCESSING. 10 BATCH-SIZE PIC 9(5) VALUE 1000. 10 CURRENT-BATCH PIC 9(5) VALUE 0. 10 RECORDS-IN-BATCH PIC 9(5) VALUE 0. 10 BATCH-TOTAL-AMOUNT PIC S9(13)V99 VALUE 0. 05 RETRY-LOGIC. 10 RETRY-COUNT PIC 9(2) VALUE 0. 10 MAX-RETRIES PIC 9(2) VALUE 3. 10 RETRY-DELAY PIC 9(3) VALUE 100. 05 VALIDATION-CONTROLS. 10 BUSINESS-RULE-ERRORS PIC 9(5) VALUE 0. 10 DATA-INTEGRITY-ERRORS PIC 9(5) VALUE 0. 10 CONCURRENCY-ERRORS PIC 9(5) VALUE 0. 01 ACCOUNT-PROCESSING-STATS. 05 ACCOUNTS-PROCESSED PIC 9(7) VALUE 0. 05 SUCCESSFUL-UPDATES PIC 9(7) VALUE 0. 05 FAILED-UPDATES PIC 9(7) VALUE 0. 05 LOCKED-RECORDS PIC 9(5) VALUE 0. 05 TOTAL-AMOUNT-PROCESSED PIC S9(15)V99 VALUE 0. 01 COMPLEX-BUSINESS-RULES. 05 OVERDRAFT-RULES. 10 MAX-OVERDRAFT-AMOUNT PIC 9(9)V99 VALUE 1000.00. 10 OVERDRAFT-FEE-RATE PIC 9V9999 VALUE 0.0350. 10 DAILY-OVERDRAFT-LIMIT PIC 9(7)V99 VALUE 500.00. 05 INTEREST-RULES. 10 MIN-BALANCE-INTEREST PIC 9(9)V99 VALUE 1000.00. 10 PREMIUM-RATE-THRESHOLD PIC 9(9)V99 VALUE 10000.00. 10 BASE-INTEREST-RATE PIC 9V9999 VALUE 0.0150. 10 PREMIUM-INTEREST-RATE PIC 9V9999 VALUE 0.0250. PROCEDURE DIVISION. MAIN-PROCESSING. PERFORM INITIALIZE-ADVANCED-PROCESSING PERFORM EXECUTE-COMPLEX-TRANSACTION-PROCESSING PERFORM FINALIZE-ADVANCED-PROCESSING STOP RUN. INITIALIZE-ADVANCED-PROCESSING. DISPLAY 'Initializing advanced account processing...' OPEN I-O ACCOUNT-MASTER IF NOT MASTER-FILE-OK DISPLAY 'Critical error opening master file: ' MASTER-FILE-STATUS STOP RUN END-IF OPEN OUTPUT TRANSACTION-LOG MOVE FUNCTION CURRENT-DATE(1:8) TO TRANSACTION-DATE DISPLAY 'Advanced processing initialized' DISPLAY 'Processing date: ' TRANSACTION-DATE. EXECUTE-COMPLEX-TRANSACTION-PROCESSING. DISPLAY 'Starting complex transaction processing...' PERFORM PROCESS-DEPOSIT-TRANSACTIONS PERFORM PROCESS-WITHDRAWAL-TRANSACTIONS PERFORM PROCESS-TRANSFER-TRANSACTIONS PERFORM PROCESS-FEE-CALCULATIONS PERFORM PROCESS-INTEREST-CALCULATIONS PERFORM PROCESS-OVERDRAFT-MANAGEMENT DISPLAY 'Complex transaction processing completed'. PROCESS-DEPOSIT-TRANSACTIONS. DISPLAY 'Processing deposit transactions...' *> Simulate processing multiple deposit transactions PERFORM VARYING CURRENT-BATCH FROM 1 BY 1 UNTIL CURRENT-BATCH > 5 PERFORM PROCESS-DEPOSIT-BATCH END-PERFORM. PROCESS-DEPOSIT-BATCH. MOVE 0 TO RECORDS-IN-BATCH MOVE 0 TO BATCH-TOTAL-AMOUNT PERFORM VARYING RECORDS-IN-BATCH FROM 1 BY 1 UNTIL RECORDS-IN-BATCH > 100 *> Generate test account number STRING 'ACC' DELIMITED BY SIZE CURRENT-BATCH DELIMITED BY SIZE RECORDS-IN-BATCH DELIMITED BY SIZE INTO ACCOUNT-NUMBER END-STRING *> Generate random deposit amount COMPUTE TRANSACTION-AMOUNT = FUNCTION RANDOM(RECORDS-IN-BATCH) * 1000 + 100 SET DEPOSIT TO TRUE PERFORM PROCESS-ACCOUNT-TRANSACTION ADD TRANSACTION-AMOUNT TO BATCH-TOTAL-AMOUNT END-PERFORM DISPLAY 'Deposit batch ' CURRENT-BATCH ' completed' DISPLAY 'Batch total: ' BATCH-TOTAL-AMOUNT. PROCESS-WITHDRAWAL-TRANSACTIONS. DISPLAY 'Processing withdrawal transactions...' PERFORM VARYING CURRENT-BATCH FROM 1 BY 1 UNTIL CURRENT-BATCH > 3 PERFORM PROCESS-WITHDRAWAL-BATCH END-PERFORM. PROCESS-WITHDRAWAL-BATCH. MOVE 0 TO RECORDS-IN-BATCH PERFORM VARYING RECORDS-IN-BATCH FROM 1 BY 1 UNTIL RECORDS-IN-BATCH > 50 STRING 'ACC' DELIMITED BY SIZE CURRENT-BATCH DELIMITED BY SIZE RECORDS-IN-BATCH DELIMITED BY SIZE INTO ACCOUNT-NUMBER END-STRING COMPUTE TRANSACTION-AMOUNT = FUNCTION RANDOM(RECORDS-IN-BATCH) * 500 + 50 SET WITHDRAWAL TO TRUE PERFORM PROCESS-ACCOUNT-TRANSACTION END-PERFORM. PROCESS-TRANSFER-TRANSACTIONS. DISPLAY 'Processing transfer transactions...' *> Process transfer out transactions PERFORM VARYING CURRENT-BATCH FROM 1 BY 1 UNTIL CURRENT-BATCH > 2 PERFORM PROCESS-TRANSFER-BATCH END-PERFORM. PROCESS-TRANSFER-BATCH. MOVE 0 TO RECORDS-IN-BATCH PERFORM VARYING RECORDS-IN-BATCH FROM 1 BY 1 UNTIL RECORDS-IN-BATCH > 25 STRING 'ACC' DELIMITED BY SIZE CURRENT-BATCH DELIMITED BY SIZE RECORDS-IN-BATCH DELIMITED BY SIZE INTO ACCOUNT-NUMBER END-STRING COMPUTE TRANSACTION-AMOUNT = FUNCTION RANDOM(RECORDS-IN-BATCH) * 200 + 25 SET TRANSFER-OUT TO TRUE PERFORM PROCESS-ACCOUNT-TRANSACTION END-PERFORM. PROCESS-ACCOUNT-TRANSACTION. MOVE 0 TO RETRY-COUNT PERFORM UNTIL RETRY-COUNT >= MAX-RETRIES PERFORM READ-ACCOUNT-WITH-RETRY IF MASTER-FILE-OK PERFORM VALIDATE-TRANSACTION IF BUSINESS-RULE-ERRORS = 0 PERFORM APPLY-TRANSACTION-TO-ACCOUNT EXIT PERFORM ELSE PERFORM LOG-BUSINESS-RULE-ERROR EXIT PERFORM END-IF ELSE IF RECORD-LOCKED ADD 1 TO RETRY-COUNT ADD 1 TO LOCKED-RECORDS DISPLAY 'Record locked, retry ' RETRY-COUNT ': ' ACCOUNT-NUMBER CALL 'SYSTEM-DELAY' USING RETRY-DELAY ELSE IF RECORD-NOT-FOUND DISPLAY 'Account not found: ' ACCOUNT-NUMBER EXIT PERFORM ELSE DISPLAY 'File error: ' MASTER-FILE-STATUS ADD 1 TO DATA-INTEGRITY-ERRORS EXIT PERFORM END-IF END-IF END-IF END-PERFORM IF RETRY-COUNT >= MAX-RETRIES DISPLAY 'Max retries exceeded for account: ' ACCOUNT-NUMBER ADD 1 TO CONCURRENCY-ERRORS END-IF. READ-ACCOUNT-WITH-RETRY. READ ACCOUNT-MASTER KEY IS ACCOUNT-NUMBER INVALID KEY CONTINUE NOT INVALID KEY CONTINUE END-READ. VALIDATE-TRANSACTION. MOVE 0 TO BUSINESS-RULE-ERRORS *> Validate account status IF ACCOUNT-STATUS NOT = 'AC' *> Active DISPLAY 'Account not active: ' ACCOUNT-NUMBER ADD 1 TO BUSINESS-RULE-ERRORS EXIT PERFORM END-IF *> Validate transaction based on type EVALUATE TRUE WHEN DEPOSIT *> Deposits are generally always valid CONTINUE WHEN WITHDRAWAL OR TRANSFER-OUT *> Check available balance IF TRANSACTION-AMOUNT > AVAILABLE-BALANCE *> Check overdraft protection IF OVERDRAFT-PROTECTION = 'Y' COMPUTE AVAILABLE-BALANCE = AVAILABLE-BALANCE + CREDIT-LIMIT IF TRANSACTION-AMOUNT > AVAILABLE-BALANCE DISPLAY 'Insufficient funds with overdraft: ' ACCOUNT-NUMBER ADD 1 TO BUSINESS-RULE-ERRORS END-IF ELSE DISPLAY 'Insufficient funds: ' ACCOUNT-NUMBER ADD 1 TO BUSINESS-RULE-ERRORS END-IF END-IF WHEN OTHER CONTINUE END-EVALUATE. APPLY-TRANSACTION-TO-ACCOUNT. ADD 1 TO ACCOUNTS-PROCESSED *> Apply transaction to account balances EVALUATE TRUE WHEN DEPOSIT OR TRANSFER-IN OR INTEREST-CREDIT ADD TRANSACTION-AMOUNT TO ACCOUNT-BALANCE ADD TRANSACTION-AMOUNT TO AVAILABLE-BALANCE WHEN WITHDRAWAL OR TRANSFER-OUT OR FEE-CHARGE OR OVERDRAFT-FEE SUBTRACT TRANSACTION-AMOUNT FROM ACCOUNT-BALANCE SUBTRACT TRANSACTION-AMOUNT FROM AVAILABLE-BALANCE END-EVALUATE *> Update transaction tracking MOVE TRANSACTION-DATE TO LAST-TRANSACTION-DATE ADD 1 TO TRANSACTION-COUNT *> Generate reference number STRING 'REF' DELIMITED BY SIZE TRANSACTION-DATE DELIMITED BY SIZE ACCOUNTS-PROCESSED DELIMITED BY SIZE INTO REFERENCE-NUMBER END-STRING PERFORM UPDATE-ACCOUNT-RECORD. UPDATE-ACCOUNT-RECORD. REWRITE ACCOUNT-RECORD INVALID KEY DISPLAY 'Update failed for account: ' ACCOUNT-NUMBER DISPLAY 'File status: ' MASTER-FILE-STATUS ADD 1 TO FAILED-UPDATES EVALUATE MASTER-FILE-STATUS WHEN '23' DISPLAY 'Record no longer exists' WHEN '9D' DISPLAY 'Record locked by another process' ADD 1 TO CONCURRENCY-ERRORS WHEN OTHER DISPLAY 'Unknown update error' ADD 1 TO DATA-INTEGRITY-ERRORS END-EVALUATE PERFORM LOG-UPDATE-ERROR NOT INVALID KEY ADD 1 TO SUCCESSFUL-UPDATES ADD TRANSACTION-AMOUNT TO TOTAL-AMOUNT-PROCESSED DISPLAY 'Account updated: ' ACCOUNT-NUMBER DISPLAY 'Transaction: ' TRANS-TYPE ' ' TRANSACTION-AMOUNT DISPLAY 'New balance: ' ACCOUNT-BALANCE DISPLAY 'Available: ' AVAILABLE-BALANCE PERFORM LOG-SUCCESSFUL-TRANSACTION END-REWRITE. PROCESS-FEE-CALCULATIONS. DISPLAY 'Processing monthly fees...' *> Apply monthly fees to applicable accounts PERFORM VARYING CURRENT-BATCH FROM 1 BY 1 UNTIL CURRENT-BATCH > 10 STRING 'ACC' DELIMITED BY SIZE CURRENT-BATCH DELIMITED BY SIZE '001' DELIMITED BY SIZE INTO ACCOUNT-NUMBER END-STRING PERFORM READ-ACCOUNT-WITH-RETRY IF MASTER-FILE-OK *> Apply monthly fee if balance below minimum IF ACCOUNT-BALANCE < MIN-BALANCE-INTEREST MOVE MONTHLY-FEE TO TRANSACTION-AMOUNT SET FEE-CHARGE TO TRUE PERFORM APPLY-TRANSACTION-TO-ACCOUNT END-IF END-IF END-PERFORM. PROCESS-INTEREST-CALCULATIONS. DISPLAY 'Processing interest calculations...' *> Calculate and apply interest to eligible accounts PERFORM VARYING CURRENT-BATCH FROM 1 BY 1 UNTIL CURRENT-BATCH > 10 STRING 'ACC' DELIMITED BY SIZE CURRENT-BATCH DELIMITED BY SIZE '001' DELIMITED BY SIZE INTO ACCOUNT-NUMBER END-STRING PERFORM READ-ACCOUNT-WITH-RETRY IF MASTER-FILE-OK IF ACCOUNT-BALANCE >= MIN-BALANCE-INTEREST *> Calculate interest based on balance tier IF ACCOUNT-BALANCE >= PREMIUM-RATE-THRESHOLD COMPUTE TRANSACTION-AMOUNT = ACCOUNT-BALANCE * PREMIUM-INTEREST-RATE / 12 ELSE COMPUTE TRANSACTION-AMOUNT = ACCOUNT-BALANCE * BASE-INTEREST-RATE / 12 END-IF SET INTEREST-CREDIT TO TRUE PERFORM APPLY-TRANSACTION-TO-ACCOUNT END-IF END-IF END-PERFORM. PROCESS-OVERDRAFT-MANAGEMENT. DISPLAY 'Processing overdraft management...' *> Check for overdraft conditions and apply fees PERFORM VARYING CURRENT-BATCH FROM 1 BY 1 UNTIL CURRENT-BATCH > 10 STRING 'ACC' DELIMITED BY SIZE CURRENT-BATCH DELIMITED BY SIZE '001' DELIMITED BY SIZE INTO ACCOUNT-NUMBER END-STRING PERFORM READ-ACCOUNT-WITH-RETRY IF MASTER-FILE-OK IF ACCOUNT-BALANCE < 0 *> Apply overdraft fee COMPUTE TRANSACTION-AMOUNT = ACCOUNT-BALANCE * OVERDRAFT-FEE-RATE * -1 SET OVERDRAFT-FEE TO TRUE PERFORM APPLY-TRANSACTION-TO-ACCOUNT END-IF END-IF END-PERFORM. LOG-BUSINESS-RULE-ERROR. STRING 'BUSINESS_RULE_ERROR: ' DELIMITED BY SIZE 'Account=' ACCOUNT-NUMBER DELIMITED BY SIZE ' Type=' TRANS-TYPE DELIMITED BY SIZE ' Amount=' TRANSACTION-AMOUNT DELIMITED BY SIZE ' Date=' TRANSACTION-DATE DELIMITED BY SIZE INTO LOG-RECORD END-STRING WRITE LOG-RECORD. LOG-UPDATE-ERROR. STRING 'UPDATE_ERROR: ' DELIMITED BY SIZE 'Account=' ACCOUNT-NUMBER DELIMITED BY SIZE ' Status=' MASTER-FILE-STATUS DELIMITED BY SIZE ' Type=' TRANS-TYPE DELIMITED BY SIZE ' Amount=' TRANSACTION-AMOUNT DELIMITED BY SIZE INTO LOG-RECORD END-STRING WRITE LOG-RECORD. LOG-SUCCESSFUL-TRANSACTION. STRING 'SUCCESS: ' DELIMITED BY SIZE 'Account=' ACCOUNT-NUMBER DELIMITED BY SIZE ' Type=' TRANS-TYPE DELIMITED BY SIZE ' Amount=' TRANSACTION-AMOUNT DELIMITED BY SIZE ' Balance=' ACCOUNT-BALANCE DELIMITED BY SIZE ' Ref=' REFERENCE-NUMBER DELIMITED BY SIZE INTO LOG-RECORD END-STRING WRITE LOG-RECORD. FINALIZE-ADVANCED-PROCESSING. CLOSE ACCOUNT-MASTER CLOSE TRANSACTION-LOG DISPLAY 'Advanced Processing Statistics:' DISPLAY '================================' DISPLAY 'Accounts processed: ' ACCOUNTS-PROCESSED DISPLAY 'Successful updates: ' SUCCESSFUL-UPDATES DISPLAY 'Failed updates: ' FAILED-UPDATES DISPLAY 'Locked records encountered: ' LOCKED-RECORDS DISPLAY 'Total amount processed: ' TOTAL-AMOUNT-PROCESSED DISPLAY '' DISPLAY 'Error Analysis:' DISPLAY 'Business rule errors: ' BUSINESS-RULE-ERRORS DISPLAY 'Data integrity errors: ' DATA-INTEGRITY-ERRORS DISPLAY 'Concurrency errors: ' CONCURRENCY-ERRORS IF ACCOUNTS-PROCESSED > 0 COMPUTE SUCCESSFUL-UPDATES = (SUCCESSFUL-UPDATES / ACCOUNTS-PROCESSED) * 100 DISPLAY 'Success rate: ' SUCCESSFUL-UPDATES '%' END-IF.