MainframeMaster

COBOL Tutorial

COBOL RANDOM

COBOL RANDOM represents sophisticated direct access methodologies and comprehensive non-sequential file processing capabilities within advanced data management environments, providing intelligent key-based retrieval mechanisms for optimal record positioning, enhanced random access features for complex file navigation workflows, and systematic direct access patterns that enable precise record location, efficient data retrieval operations, and strategic file positioning while maintaining access performance, ensuring predictable retrieval behavior, and enabling flexible access architectures across enterprise applications requiring exact record targeting, comprehensive random access capabilities, and reliable direct positioning throughout sophisticated business data processing scenarios and high-performance file management environments.

RANDOM Access Fundamentals

Basic Random Access Configuration
Setting up files for random access operations
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
*> RANDOM access file definitions and basic operations IDENTIFICATION DIVISION. PROGRAM-ID. RANDOM-ACCESS-DEMO. ENVIRONMENT DIVISION. INPUT-OUTPUT SECTION. FILE-CONTROL. *> Indexed file with RANDOM access SELECT CUSTOMER-FILE ASSIGN TO "customers.dat" ORGANIZATION IS INDEXED ACCESS MODE IS RANDOM RECORD KEY IS CUST-KEY FILE STATUS IS WS-CUST-STATUS. *> Relative file with RANDOM access SELECT INVENTORY-FILE ASSIGN TO "inventory.rel" ORGANIZATION IS RELATIVE ACCESS MODE IS RANDOM RELATIVE KEY IS WS-REL-KEY FILE STATUS IS WS-INV-STATUS. *> Multiple key indexed file SELECT PRODUCT-FILE ASSIGN TO "products.idx" ORGANIZATION IS INDEXED ACCESS MODE IS RANDOM RECORD KEY IS PROD-PRIMARY-KEY ALTERNATE RECORD KEY IS PROD-NAME-KEY WITH DUPLICATES ALTERNATE RECORD KEY IS PROD-CATEGORY-KEY WITH DUPLICATES FILE STATUS IS WS-PROD-STATUS. DATA DIVISION. FILE SECTION. *> Customer file record FD CUSTOMER-FILE. 01 CUSTOMER-RECORD. 05 CUST-KEY PIC X(8). 05 CUST-NAME PIC X(40). 05 CUST-ADDRESS PIC X(60). 05 CUST-PHONE PIC X(15). 05 CUST-BALANCE PIC S9(7)V99 COMP-3. 05 CUST-CREDIT-LIMIT PIC S9(7)V99 COMP-3. 05 CUST-STATUS PIC X. 05 FILLER PIC X(10). *> Inventory file record FD INVENTORY-FILE. 01 INVENTORY-RECORD. 05 INV-ITEM-CODE PIC X(10). 05 INV-DESCRIPTION PIC X(50). 05 INV-QUANTITY PIC S9(7) COMP-3. 05 INV-UNIT-COST PIC S9(5)V99 COMP-3. 05 INV-REORDER-LEVEL PIC S9(5) COMP-3. 05 INV-SUPPLIER-CODE PIC X(8). 05 FILLER PIC X(15). *> Product file record FD PRODUCT-FILE. 01 PRODUCT-RECORD. 05 PROD-PRIMARY-KEY PIC X(12). 05 PROD-NAME-KEY PIC X(30). 05 PROD-CATEGORY-KEY PIC X(15). 05 PROD-DESCRIPTION PIC X(100). 05 PROD-PRICE PIC S9(7)V99 COMP-3. 05 PROD-WEIGHT PIC S9(5)V99 COMP-3. 05 PROD-DIMENSIONS PIC X(20). 05 FILLER PIC X(20). WORKING-STORAGE SECTION. 01 WS-FILE-STATUS-CODES. 05 WS-CUST-STATUS PIC XX. 05 WS-INV-STATUS PIC XX. 05 WS-PROD-STATUS PIC XX. 01 WS-ACCESS-KEYS. 05 WS-REL-KEY PIC 9(6) COMP. 05 WS-SEARCH-KEY PIC X(30). 05 WS-CATEGORY-KEY PIC X(15). 01 WS-OPERATION-CONTROLS. 05 WS-RECORD-FOUND PIC X VALUE 'N'. 05 WS-OPERATION-SUCCESS PIC X VALUE 'N'. 05 WS-RETRY-COUNT PIC 9(2) VALUE 0. 05 WS-MAX-RETRIES PIC 9(2) VALUE 3. PROCEDURE DIVISION. MAIN-RANDOM-ACCESS-DEMO. DISPLAY "=== COBOL RANDOM ACCESS DEMONSTRATION ===" PERFORM OPEN-FILES PERFORM DEMONSTRATE-INDEXED-RANDOM-ACCESS PERFORM DEMONSTRATE-RELATIVE-RANDOM-ACCESS PERFORM DEMONSTRATE-ALTERNATE-KEY-ACCESS PERFORM DEMONSTRATE-RANDOM-UPDATE-OPERATIONS PERFORM CLOSE-FILES DISPLAY "=== RANDOM ACCESS DEMO COMPLETE ===" STOP RUN. OPEN-FILES. DISPLAY " " DISPLAY "📂 OPENING FILES FOR RANDOM ACCESS" DISPLAY "==================================" OPEN I-O CUSTOMER-FILE IF WS-CUST-STATUS NOT = "00" DISPLAY "❌ Error opening customer file: " WS-CUST-STATUS STOP RUN ELSE DISPLAY "✅ Customer file opened successfully" END-IF OPEN I-O INVENTORY-FILE IF WS-INV-STATUS NOT = "00" DISPLAY "❌ Error opening inventory file: " WS-INV-STATUS STOP RUN ELSE DISPLAY "✅ Inventory file opened successfully" END-IF OPEN I-O PRODUCT-FILE IF WS-PROD-STATUS NOT = "00" DISPLAY "❌ Error opening product file: " WS-PROD-STATUS STOP RUN ELSE DISPLAY "✅ Product file opened successfully" END-IF. DEMONSTRATE-INDEXED-RANDOM-ACCESS. DISPLAY " " DISPLAY "🔍 INDEXED FILE RANDOM ACCESS" DISPLAY "=============================" *> Direct access by primary key MOVE "CUST0001" TO CUST-KEY PERFORM READ-CUSTOMER-BY-KEY IF WS-RECORD-FOUND = 'Y' DISPLAY "Customer found: " CUST-NAME DISPLAY "Balance: " CUST-BALANCE DISPLAY "Status: " CUST-STATUS ELSE DISPLAY "Customer CUST0001 not found" END-IF *> Access another customer directly MOVE "CUST0025" TO CUST-KEY PERFORM READ-CUSTOMER-BY-KEY IF WS-RECORD-FOUND = 'Y' DISPLAY "Customer found: " CUST-NAME DISPLAY "Credit limit: " CUST-CREDIT-LIMIT ELSE DISPLAY "Customer CUST0025 not found" END-IF *> Access non-existent customer MOVE "CUST9999" TO CUST-KEY PERFORM READ-CUSTOMER-BY-KEY IF WS-RECORD-FOUND = 'N' DISPLAY "Customer CUST9999 not found (expected)" END-IF. READ-CUSTOMER-BY-KEY. MOVE 'N' TO WS-RECORD-FOUND READ CUSTOMER-FILE INVALID KEY DISPLAY "Invalid key for customer: " CUST-KEY NOT INVALID KEY MOVE 'Y' TO WS-RECORD-FOUND DISPLAY "✅ Customer record read successfully" END-READ. DEMONSTRATE-RELATIVE-RANDOM-ACCESS. DISPLAY " " DISPLAY "🎯 RELATIVE FILE RANDOM ACCESS" DISPLAY "==============================" *> Access record at relative position 1 MOVE 1 TO WS-REL-KEY PERFORM READ-INVENTORY-BY-RELATIVE-KEY IF WS-RECORD-FOUND = 'Y' DISPLAY "Inventory item: " INV-DESCRIPTION DISPLAY "Quantity: " INV-QUANTITY DISPLAY "Unit cost: " INV-UNIT-COST END-IF *> Access record at relative position 50 MOVE 50 TO WS-REL-KEY PERFORM READ-INVENTORY-BY-RELATIVE-KEY IF WS-RECORD-FOUND = 'Y' DISPLAY "Item 50: " INV-DESCRIPTION DISPLAY "Supplier: " INV-SUPPLIER-CODE END-IF *> Access record at relative position 100 MOVE 100 TO WS-REL-KEY PERFORM READ-INVENTORY-BY-RELATIVE-KEY IF WS-RECORD-FOUND = 'Y' DISPLAY "Item 100: " INV-DESCRIPTION DISPLAY "Reorder level: " INV-REORDER-LEVEL ELSE DISPLAY "Inventory record 100 not found" END-IF. READ-INVENTORY-BY-RELATIVE-KEY. MOVE 'N' TO WS-RECORD-FOUND READ INVENTORY-FILE INVALID KEY DISPLAY "Invalid relative key: " WS-REL-KEY NOT INVALID KEY MOVE 'Y' TO WS-RECORD-FOUND DISPLAY "✅ Inventory record " WS-REL-KEY " read successfully" END-READ. DEMONSTRATE-ALTERNATE-KEY-ACCESS. DISPLAY " " DISPLAY "🔑 ALTERNATE KEY RANDOM ACCESS" DISPLAY "==============================" *> Access by product name (alternate key) MOVE "Digital Camera Pro" TO PROD-NAME-KEY PERFORM READ-PRODUCT-BY-NAME IF WS-RECORD-FOUND = 'Y' DISPLAY "Product: " PROD-DESCRIPTION DISPLAY "Price: " PROD-PRICE DISPLAY "Category: " PROD-CATEGORY-KEY END-IF *> Access by category (alternate key with duplicates) MOVE "ELECTRONICS" TO PROD-CATEGORY-KEY PERFORM READ-PRODUCT-BY-CATEGORY IF WS-RECORD-FOUND = 'Y' DISPLAY "Found product in ELECTRONICS:" DISPLAY "Name: " PROD-NAME-KEY DISPLAY "Price: " PROD-PRICE END-IF *> Access by primary key MOVE "PROD00000123" TO PROD-PRIMARY-KEY PERFORM READ-PRODUCT-BY-PRIMARY-KEY IF WS-RECORD-FOUND = 'Y' DISPLAY "Product by ID: " PROD-DESCRIPTION DISPLAY "Weight: " PROD-WEIGHT DISPLAY "Dimensions: " PROD-DIMENSIONS END-IF. READ-PRODUCT-BY-NAME. MOVE 'N' TO WS-RECORD-FOUND READ PRODUCT-FILE KEY IS PROD-NAME-KEY INVALID KEY DISPLAY "Product name not found: " PROD-NAME-KEY NOT INVALID KEY MOVE 'Y' TO WS-RECORD-FOUND DISPLAY "✅ Product found by name" END-READ. READ-PRODUCT-BY-CATEGORY. MOVE 'N' TO WS-RECORD-FOUND READ PRODUCT-FILE KEY IS PROD-CATEGORY-KEY INVALID KEY DISPLAY "No products in category: " PROD-CATEGORY-KEY NOT INVALID KEY MOVE 'Y' TO WS-RECORD-FOUND DISPLAY "✅ Product found in category" END-READ. READ-PRODUCT-BY-PRIMARY-KEY. MOVE 'N' TO WS-RECORD-FOUND READ PRODUCT-FILE INVALID KEY DISPLAY "Product ID not found: " PROD-PRIMARY-KEY NOT INVALID KEY MOVE 'Y' TO WS-RECORD-FOUND DISPLAY "✅ Product found by primary key" END-READ. DEMONSTRATE-RANDOM-UPDATE-OPERATIONS. DISPLAY " " DISPLAY "✏️ RANDOM UPDATE OPERATIONS" DISPLAY "============================" *> Update customer balance randomly MOVE "CUST0001" TO CUST-KEY PERFORM UPDATE-CUSTOMER-BALANCE *> Update inventory quantity randomly MOVE 25 TO WS-REL-KEY PERFORM UPDATE-INVENTORY-QUANTITY *> Update product price randomly MOVE "PROD00000456" TO PROD-PRIMARY-KEY PERFORM UPDATE-PRODUCT-PRICE. UPDATE-CUSTOMER-BALANCE. MOVE 'N' TO WS-OPERATION-SUCCESS READ CUSTOMER-FILE INVALID KEY DISPLAY "Customer not found for update: " CUST-KEY NOT INVALID KEY ADD 500.00 TO CUST-BALANCE REWRITE CUSTOMER-RECORD INVALID KEY DISPLAY "Error updating customer: " CUST-KEY NOT INVALID KEY MOVE 'Y' TO WS-OPERATION-SUCCESS DISPLAY "✅ Customer balance updated: " CUST-BALANCE END-REWRITE END-READ. UPDATE-INVENTORY-QUANTITY. MOVE 'N' TO WS-OPERATION-SUCCESS READ INVENTORY-FILE INVALID KEY DISPLAY "Inventory item not found: " WS-REL-KEY NOT INVALID KEY SUBTRACT 10 FROM INV-QUANTITY REWRITE INVENTORY-RECORD INVALID KEY DISPLAY "Error updating inventory: " WS-REL-KEY NOT INVALID KEY MOVE 'Y' TO WS-OPERATION-SUCCESS DISPLAY "✅ Inventory quantity updated: " INV-QUANTITY END-REWRITE END-READ. UPDATE-PRODUCT-PRICE. MOVE 'N' TO WS-OPERATION-SUCCESS READ PRODUCT-FILE INVALID KEY DISPLAY "Product not found for update: " PROD-PRIMARY-KEY NOT INVALID KEY MULTIPLY PROD-PRICE BY 1.10 REWRITE PRODUCT-RECORD INVALID KEY DISPLAY "Error updating product: " PROD-PRIMARY-KEY NOT INVALID KEY MOVE 'Y' TO WS-OPERATION-SUCCESS DISPLAY "✅ Product price updated: " PROD-PRICE END-REWRITE END-READ. CLOSE-FILES. DISPLAY " " DISPLAY "🔒 CLOSING FILES" DISPLAY "===============" CLOSE CUSTOMER-FILE IF WS-CUST-STATUS NOT = "00" DISPLAY "❌ Error closing customer file: " WS-CUST-STATUS ELSE DISPLAY "✅ Customer file closed successfully" END-IF CLOSE INVENTORY-FILE IF WS-INV-STATUS NOT = "00" DISPLAY "❌ Error closing inventory file: " WS-INV-STATUS ELSE DISPLAY "✅ Inventory file closed successfully" END-IF CLOSE PRODUCT-FILE IF WS-PROD-STATUS NOT = "00" DISPLAY "❌ Error closing product file: " WS-PROD-STATUS ELSE DISPLAY "✅ Product file closed successfully" END-IF.
File Access
Random Processing
Direct Access

Advanced Random Access Patterns

Complex Random Access Operations
Advanced techniques for efficient random file processing
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
*> Advanced random access patterns and optimization techniques IDENTIFICATION DIVISION. PROGRAM-ID. ADVANCED-RANDOM-ACCESS. ENVIRONMENT DIVISION. INPUT-OUTPUT SECTION. FILE-CONTROL. *> High-performance indexed file with multiple keys SELECT TRANSACTION-FILE ASSIGN TO "transactions.idx" ORGANIZATION IS INDEXED ACCESS MODE IS RANDOM RECORD KEY IS TRANS-PRIMARY-KEY ALTERNATE RECORD KEY IS TRANS-DATE-KEY WITH DUPLICATES ALTERNATE RECORD KEY IS TRANS-CUSTOMER-KEY WITH DUPLICATES ALTERNATE RECORD KEY IS TRANS-AMOUNT-KEY WITH DUPLICATES FILE STATUS IS WS-TRANS-STATUS. *> Cache lookup file for performance SELECT CACHE-FILE ASSIGN TO "cache.rel" ORGANIZATION IS RELATIVE ACCESS MODE IS RANDOM RELATIVE KEY IS WS-CACHE-KEY FILE STATUS IS WS-CACHE-STATUS. DATA DIVISION. FILE SECTION. FD TRANSACTION-FILE. 01 TRANSACTION-RECORD. 05 TRANS-PRIMARY-KEY PIC X(15). 05 TRANS-DATE-KEY PIC 9(8). 05 TRANS-CUSTOMER-KEY PIC X(8). 05 TRANS-AMOUNT-KEY PIC S9(9)V99 COMP-3. 05 TRANS-TYPE PIC X(3). 05 TRANS-DESCRIPTION PIC X(50). 05 TRANS-REFERENCE PIC X(20). 05 TRANS-STATUS PIC X. 05 TRANS-CREATED-BY PIC X(8). 05 TRANS-TIMESTAMP PIC X(20). 05 FILLER PIC X(20). FD CACHE-FILE. 01 CACHE-RECORD. 05 CACHE-KEY-VALUE PIC X(20). 05 CACHE-DATA PIC X(200). 05 CACHE-TIMESTAMP PIC 9(8). 05 CACHE-EXPIRY PIC 9(8). 05 CACHE-HIT-COUNT PIC 9(7) COMP-3. 05 FILLER PIC X(15). WORKING-STORAGE SECTION. 01 WS-FILE-STATUS-CODES. 05 WS-TRANS-STATUS PIC XX. 05 WS-CACHE-STATUS PIC XX. 01 WS-RANDOM-ACCESS-KEYS. 05 WS-CACHE-KEY PIC 9(6) COMP. 05 WS-LOOKUP-KEY PIC X(20). 05 WS-SEARCH-DATE PIC 9(8). 05 WS-CUSTOMER-ID PIC X(8). 05 WS-AMOUNT-RANGE PIC S9(9)V99 COMP-3. 01 WS-PERFORMANCE-METRICS. 05 WS-RANDOM-READS PIC 9(7) VALUE 0. 05 WS-CACHE-HITS PIC 9(7) VALUE 0. 05 WS-CACHE-MISSES PIC 9(7) VALUE 0. 05 WS-UPDATE-COUNT PIC 9(7) VALUE 0. 05 WS-ERROR-COUNT PIC 9(5) VALUE 0. 01 WS-BATCH-PROCESSING. 05 WS-BATCH-KEYS OCCURS 100 TIMES. 10 WS-BATCH-KEY PIC X(15). 10 WS-BATCH-STATUS PIC X. 05 WS-BATCH-SIZE PIC 9(3) VALUE 0. 05 WS-BATCH-PROCESSED PIC 9(3) VALUE 0. 01 WS-OPTIMIZATION-FLAGS. 05 WS-USE-CACHE PIC X VALUE 'Y'. 05 WS-BATCH-MODE PIC X VALUE 'N'. 05 WS-PREFETCH-MODE PIC X VALUE 'N'. 05 WS-PERFORMANCE-LOG PIC X VALUE 'Y'. PROCEDURE DIVISION. MAIN-ADVANCED-RANDOM-ACCESS. DISPLAY "=== ADVANCED RANDOM ACCESS PATTERNS ===" PERFORM INITIALIZE-ADVANCED-PROCESSING PERFORM DEMONSTRATE-CACHED-RANDOM-ACCESS PERFORM DEMONSTRATE-BATCH-RANDOM-PROCESSING PERFORM DEMONSTRATE-MULTI-KEY-RANDOM-ACCESS PERFORM DEMONSTRATE-PERFORMANCE-OPTIMIZATION PERFORM DISPLAY-PERFORMANCE-METRICS PERFORM CLEANUP-ADVANCED-PROCESSING DISPLAY "=== ADVANCED RANDOM ACCESS COMPLETE ===" STOP RUN. INITIALIZE-ADVANCED-PROCESSING. DISPLAY " " DISPLAY "🚀 INITIALIZING ADVANCED PROCESSING" DISPLAY "===================================" OPEN I-O TRANSACTION-FILE IF WS-TRANS-STATUS NOT = "00" DISPLAY "❌ Error opening transaction file: " WS-TRANS-STATUS STOP RUN ELSE DISPLAY "✅ Transaction file opened for random access" END-IF OPEN I-O CACHE-FILE IF WS-CACHE-STATUS NOT = "00" DISPLAY "❌ Error opening cache file: " WS-CACHE-STATUS STOP RUN ELSE DISPLAY "✅ Cache file opened for random access" END-IF *> Initialize performance counters MOVE 0 TO WS-RANDOM-READS MOVE 0 TO WS-CACHE-HITS MOVE 0 TO WS-CACHE-MISSES MOVE 0 TO WS-UPDATE-COUNT MOVE 0 TO WS-ERROR-COUNT DISPLAY "✅ Performance metrics initialized". DEMONSTRATE-CACHED-RANDOM-ACCESS. DISPLAY " " DISPLAY "💾 CACHED RANDOM ACCESS OPERATIONS" DISPLAY "==================================" *> Access transaction with cache lookup MOVE "TRANS0001234567" TO TRANS-PRIMARY-KEY PERFORM CACHED-TRANSACTION-LOOKUP *> Access same transaction again (should hit cache) MOVE "TRANS0001234567" TO TRANS-PRIMARY-KEY PERFORM CACHED-TRANSACTION-LOOKUP *> Access different transaction MOVE "TRANS0007654321" TO TRANS-PRIMARY-KEY PERFORM CACHED-TRANSACTION-LOOKUP *> Access by customer key with caching MOVE "CUST0123" TO TRANS-CUSTOMER-KEY PERFORM CACHED-CUSTOMER-TRANSACTION-LOOKUP. CACHED-TRANSACTION-LOOKUP. *> Check cache first IF WS-USE-CACHE = 'Y' PERFORM CHECK-TRANSACTION-CACHE IF CACHE-KEY-VALUE = TRANS-PRIMARY-KEY ADD 1 TO WS-CACHE-HITS DISPLAY "✅ Cache hit for: " TRANS-PRIMARY-KEY MOVE CACHE-DATA TO TRANSACTION-RECORD ELSE PERFORM LOAD-TRANSACTION-FROM-FILE PERFORM UPDATE-TRANSACTION-CACHE END-IF ELSE PERFORM LOAD-TRANSACTION-FROM-FILE END-IF. CHECK-TRANSACTION-CACHE. *> Simple hash function for cache key COMPUTE WS-CACHE-KEY = FUNCTION NUMVAL(TRANS-PRIMARY-KEY(6:6)) READ CACHE-FILE INVALID KEY MOVE SPACES TO CACHE-RECORD NOT INVALID KEY CONTINUE END-READ. LOAD-TRANSACTION-FROM-FILE. ADD 1 TO WS-RANDOM-READS ADD 1 TO WS-CACHE-MISSES READ TRANSACTION-FILE INVALID KEY DISPLAY "❌ Transaction not found: " TRANS-PRIMARY-KEY ADD 1 TO WS-ERROR-COUNT NOT INVALID KEY DISPLAY "✅ Transaction loaded: " TRANS-DESCRIPTION END-READ. UPDATE-TRANSACTION-CACHE. MOVE TRANS-PRIMARY-KEY TO CACHE-KEY-VALUE MOVE TRANSACTION-RECORD TO CACHE-DATA MOVE FUNCTION CURRENT-DATE(1:8) TO CACHE-TIMESTAMP ADD 1 TO CACHE-TIMESTAMP GIVING CACHE-EXPIRY ADD 1 TO CACHE-HIT-COUNT WRITE CACHE-RECORD INVALID KEY REWRITE CACHE-RECORD INVALID KEY DISPLAY "❌ Cache update failed" NOT INVALID KEY CONTINUE END-REWRITE NOT INVALID KEY CONTINUE END-WRITE. CACHED-CUSTOMER-TRANSACTION-LOOKUP. DISPLAY "🔍 Looking up customer transactions: " TRANS-CUSTOMER-KEY READ TRANSACTION-FILE KEY IS TRANS-CUSTOMER-KEY INVALID KEY DISPLAY "❌ No transactions for customer: " TRANS-CUSTOMER-KEY NOT INVALID KEY DISPLAY "✅ Found transaction: " TRANS-PRIMARY-KEY DISPLAY " Amount: " TRANS-AMOUNT-KEY DISPLAY " Date: " TRANS-DATE-KEY END-READ. DEMONSTRATE-BATCH-RANDOM-PROCESSING. DISPLAY " " DISPLAY "📦 BATCH RANDOM PROCESSING" DISPLAY "==========================" *> Setup batch of keys for processing PERFORM SETUP-BATCH-KEYS *> Process batch with random access PERFORM PROCESS-BATCH-RANDOMLY *> Display batch results PERFORM DISPLAY-BATCH-RESULTS. SETUP-BATCH-KEYS. MOVE 5 TO WS-BATCH-SIZE MOVE "TRANS0001000001" TO WS-BATCH-KEY(1) MOVE "TRANS0001000002" TO WS-BATCH-KEY(2) MOVE "TRANS0001000003" TO WS-BATCH-KEY(3) MOVE "TRANS0001000004" TO WS-BATCH-KEY(4) MOVE "TRANS0001000005" TO WS-BATCH-KEY(5) DISPLAY "✅ Batch of " WS-BATCH-SIZE " keys prepared". PROCESS-BATCH-RANDOMLY. MOVE 0 TO WS-BATCH-PROCESSED PERFORM VARYING WS-CACHE-KEY FROM 1 BY 1 UNTIL WS-CACHE-KEY > WS-BATCH-SIZE MOVE WS-BATCH-KEY(WS-CACHE-KEY) TO TRANS-PRIMARY-KEY READ TRANSACTION-FILE INVALID KEY MOVE 'N' TO WS-BATCH-STATUS(WS-CACHE-KEY) DISPLAY "❌ Batch item " WS-CACHE-KEY " not found" NOT INVALID KEY MOVE 'Y' TO WS-BATCH-STATUS(WS-CACHE-KEY) ADD 1 TO WS-BATCH-PROCESSED *> Process the transaction PERFORM PROCESS-TRANSACTION-RECORD END-READ END-PERFORM. PROCESS-TRANSACTION-RECORD. *> Example processing: update status IF TRANS-STATUS = 'P' MOVE 'C' TO TRANS-STATUS REWRITE TRANSACTION-RECORD INVALID KEY DISPLAY "❌ Error updating transaction" NOT INVALID KEY ADD 1 TO WS-UPDATE-COUNT END-REWRITE END-IF. DISPLAY-BATCH-RESULTS. DISPLAY "📊 Batch Processing Results:" DISPLAY " Keys processed: " WS-BATCH-PROCESSED DISPLAY " Total keys: " WS-BATCH-SIZE DISPLAY " Success rate: " FUNCTION NUMVAL(WS-BATCH-PROCESSED) / WS-BATCH-SIZE * 100 "%". DEMONSTRATE-MULTI-KEY-RANDOM-ACCESS. DISPLAY " " DISPLAY "🗝️ MULTI-KEY RANDOM ACCESS" DISPLAY "==========================" *> Access by date range MOVE 20231001 TO WS-SEARCH-DATE PERFORM ACCESS-BY-DATE-KEY *> Access by amount range MOVE 1000.00 TO WS-AMOUNT-RANGE PERFORM ACCESS-BY-AMOUNT-KEY *> Access by multiple criteria PERFORM ACCESS-BY-MULTIPLE-KEYS. ACCESS-BY-DATE-KEY. MOVE WS-SEARCH-DATE TO TRANS-DATE-KEY READ TRANSACTION-FILE KEY IS TRANS-DATE-KEY INVALID KEY DISPLAY "❌ No transactions for date: " WS-SEARCH-DATE NOT INVALID KEY DISPLAY "✅ Found transaction for date: " TRANS-DATE-KEY DISPLAY " Transaction: " TRANS-PRIMARY-KEY DISPLAY " Customer: " TRANS-CUSTOMER-KEY DISPLAY " Amount: " TRANS-AMOUNT-KEY END-READ. ACCESS-BY-AMOUNT-KEY. MOVE WS-AMOUNT-RANGE TO TRANS-AMOUNT-KEY READ TRANSACTION-FILE KEY IS TRANS-AMOUNT-KEY INVALID KEY DISPLAY "❌ No transactions for amount: " WS-AMOUNT-RANGE NOT INVALID KEY DISPLAY "✅ Found transaction for amount: " TRANS-AMOUNT-KEY DISPLAY " Transaction: " TRANS-PRIMARY-KEY DISPLAY " Date: " TRANS-DATE-KEY END-READ. ACCESS-BY-MULTIPLE-KEYS. DISPLAY "🔍 Multi-criteria search example:" *> Search for customer transactions in date range MOVE "CUST0456" TO TRANS-CUSTOMER-KEY READ TRANSACTION-FILE KEY IS TRANS-CUSTOMER-KEY INVALID KEY DISPLAY "❌ No transactions for customer: " TRANS-CUSTOMER-KEY NOT INVALID KEY *> Check if transaction meets additional criteria IF TRANS-DATE-KEY >= 20231001 AND TRANS-AMOUNT-KEY >= 500.00 DISPLAY "✅ Multi-criteria match found:" DISPLAY " Customer: " TRANS-CUSTOMER-KEY DISPLAY " Date: " TRANS-DATE-KEY DISPLAY " Amount: " TRANS-AMOUNT-KEY ELSE DISPLAY "❌ Transaction found but doesn't meet criteria" END-IF END-READ. DEMONSTRATE-PERFORMANCE-OPTIMIZATION. DISPLAY " " DISPLAY "⚡ PERFORMANCE OPTIMIZATION" DISPLAY "==========================" *> Demonstrate read-ahead optimization PERFORM OPTIMIZE-READ-AHEAD *> Demonstrate key clustering optimization PERFORM OPTIMIZE-KEY-CLUSTERING *> Demonstrate cache warming PERFORM OPTIMIZE-CACHE-WARMING. OPTIMIZE-READ-AHEAD. DISPLAY "🚀 Read-ahead optimization:" *> Read multiple consecutive records MOVE "TRANS0002000001" TO TRANS-PRIMARY-KEY PERFORM 5 TIMES READ TRANSACTION-FILE INVALID KEY CONTINUE NOT INVALID KEY DISPLAY " Read: " TRANS-PRIMARY-KEY END-READ *> Increment key for next read ADD 1 TO TRANS-PRIMARY-KEY(11:5) END-PERFORM. OPTIMIZE-KEY-CLUSTERING. DISPLAY "🔗 Key clustering optimization:" *> Process related records together MOVE "CUST0789" TO WS-CUSTOMER-ID MOVE WS-CUSTOMER-ID TO TRANS-CUSTOMER-KEY PERFORM 3 TIMES READ TRANSACTION-FILE KEY IS TRANS-CUSTOMER-KEY INVALID KEY CONTINUE NOT INVALID KEY DISPLAY " Clustered read: " TRANS-PRIMARY-KEY DISPLAY " Customer: " TRANS-CUSTOMER-KEY END-READ END-PERFORM. OPTIMIZE-CACHE-WARMING. DISPLAY "🔥 Cache warming optimization:" *> Pre-load frequently accessed records PERFORM VARYING WS-CACHE-KEY FROM 1 BY 1 UNTIL WS-CACHE-KEY > 3 EVALUATE WS-CACHE-KEY WHEN 1 MOVE "TRANS0003000001" TO TRANS-PRIMARY-KEY WHEN 2 MOVE "TRANS0003000002" TO TRANS-PRIMARY-KEY WHEN 3 MOVE "TRANS0003000003" TO TRANS-PRIMARY-KEY END-EVALUATE PERFORM CACHED-TRANSACTION-LOOKUP DISPLAY " Pre-loaded: " TRANS-PRIMARY-KEY END-PERFORM. DISPLAY-PERFORMANCE-METRICS. DISPLAY " " DISPLAY "📈 PERFORMANCE METRICS" DISPLAY "=====================" DISPLAY "Random reads: " WS-RANDOM-READS DISPLAY "Cache hits: " WS-CACHE-HITS DISPLAY "Cache misses: " WS-CACHE-MISSES DISPLAY "Updates: " WS-UPDATE-COUNT DISPLAY "Errors: " WS-ERROR-COUNT IF WS-CACHE-HITS + WS-CACHE-MISSES > 0 COMPUTE WS-AMOUNT-RANGE = (WS-CACHE-HITS / (WS-CACHE-HITS + WS-CACHE-MISSES)) * 100 DISPLAY "Cache hit ratio: " WS-AMOUNT-RANGE "%" END-IF. CLEANUP-ADVANCED-PROCESSING. DISPLAY " " DISPLAY "🧹 CLEANUP" DISPLAY "==========" CLOSE TRANSACTION-FILE CLOSE CACHE-FILE DISPLAY "✅ All files closed successfully".

RANDOM Access Features and Capabilities

Access Methods
  • • Direct key-based access
  • • Relative record positioning
  • • Alternate key navigation
  • • Non-sequential processing
File Organizations
  • • Indexed file support
  • • Relative file support
  • • Multiple key handling
  • • Duplicate key management
Performance Features
  • • Cached access patterns
  • • Batch processing support
  • • Read-ahead optimization
  • • Key clustering strategies
Business Applications
  • • Customer lookup systems
  • • Inventory management
  • • Transaction processing
  • • Reference data access

Best Practices