MainframeMaster

COBOL Tutorial

COBOL END-REWRITE Statement

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.

Understanding END-REWRITE Architecture

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.

Basic END-REWRITE Usage

cobol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
IDENTIFICATION 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.

Advanced END-REWRITE Patterns

cobol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
IDENTIFICATION 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.

Best Practices and FAQ

Best Practices
  • • Always use END-REWRITE with error handling
  • • Implement proper record locking strategies
  • • Validate data before rewriting
  • • Use meaningful error messages
  • • Implement retry logic for locked records
Common Mistakes
  • • Omitting END-REWRITE in complex structures
  • • Not handling record locking properly
  • • Poor validation before updates
  • • Missing transaction logging
  • • Inadequate error recovery