MainframeMaster

COBOL Tutorial

COBOL LOCAL-STORAGE SECTION

The LOCAL-STORAGE SECTION represents sophisticated automatic data initialization and program-specific storage management within COBOL programming environments, providing guaranteed fresh data state, comprehensive memory reinitialization, and advanced program lifecycle management that enable reliable program execution, efficient data isolation, and optimized resource utilization. This section embodies advanced memory management principles by supporting automatic data reset, enabling clean program state, and facilitating comprehensive data initialization requirements while maintaining execution efficiency, ensuring data integrity, and enabling complex programming scenarios across enterprise applications requiring detailed memory control, automated initialization processes, and reliable data management with optimized performance characteristics and consistent state management throughout the program execution lifecycle.

LOCAL-STORAGE Syntax

Basic LOCAL-STORAGE Structure
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
DATA DIVISION. LOCAL-STORAGE SECTION. 01 data-name-1 PIC clause [VALUE clause]. 01 data-name-2. 05 subordinate-item PIC clause [VALUE clause]. *> Example with initialization DATA DIVISION. LOCAL-STORAGE SECTION. 01 LS-COUNTERS. 05 LS-RECORD-COUNT PIC 9(6) VALUE 0. 05 LS-ERROR-COUNT PIC 9(4) VALUE 0. 05 LS-PROCESS-COUNT PIC 9(5) VALUE 0. 01 LS-FLAGS. 05 LS-FIRST-TIME PIC X VALUE 'Y'. 05 LS-VALIDATION-FLAG PIC X VALUE 'N'. 05 LS-DEBUG-MODE PIC X VALUE 'N'. 01 LS-WORK-AREAS. 05 LS-TEMP-STRING PIC X(100) VALUE SPACES. 05 LS-CALCULATION-WORK PIC 9(8)V99 VALUE ZERO. 05 LS-DATE-WORK PIC 9(8) VALUE 0. *> Complex structures with automatic initialization 01 LS-EMPLOYEE-WORK. 05 LS-EMP-ID PIC 9(6) VALUE 0. 05 LS-EMP-NAME PIC X(30) VALUE SPACES. 05 LS-EMP-SALARY PIC 9(7)V99 VALUE 0. 05 LS-EMP-STATUS PIC X(10) VALUE "INACTIVE". 01 LS-TABLE-WORK. 05 LS-TABLE-ENTRIES OCCURS 10 TIMES. 10 LS-ENTRY-KEY PIC X(5) VALUE SPACES. 10 LS-ENTRY-VALUE PIC 9(8) VALUE 0. 10 LS-ENTRY-FLAG PIC X VALUE 'N'.
Automatic Init
Local Storage
Memory Management

Comprehensive LOCAL-STORAGE Examples

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
IDENTIFICATION DIVISION. PROGRAM-ID. LOCAL-STORAGE-DEMO. DATA DIVISION. *> WORKING-STORAGE for persistent data WORKING-STORAGE SECTION. 01 WS-CALL-COUNTER PIC 9(4) VALUE 0. 01 WS-PROGRAM-NAME PIC X(30) VALUE "LOCAL-STORAGE-DEMO". 01 WS-PERSISTENT-FLAGS. 05 WS-FIRST-CALL PIC X VALUE 'Y'. 05 WS-DEMO-MODE PIC X VALUE 'Y'. *> LOCAL-STORAGE for automatic reinitialization LOCAL-STORAGE SECTION. 01 LS-SESSION-DATA. 05 LS-SESSION-ID PIC 9(8) VALUE 0. 05 LS-START-TIME PIC 9(8) VALUE 0. 05 LS-END-TIME PIC 9(8) VALUE 0. 05 LS-DURATION PIC 9(6) VALUE 0. 01 LS-PROCESSING-COUNTERS. 05 LS-RECORDS-PROCESSED PIC 9(6) VALUE 0. 05 LS-RECORDS-VALIDATED PIC 9(6) VALUE 0. 05 LS-RECORDS-REJECTED PIC 9(5) VALUE 0. 05 LS-WARNINGS-ISSUED PIC 9(4) VALUE 0. 01 LS-VALIDATION-WORK. 05 LS-CURRENT-RECORD PIC X(100) VALUE SPACES. 05 LS-FIELD-BUFFER PIC X(50) VALUE SPACES. 05 LS-ERROR-MESSAGE PIC X(80) VALUE SPACES. 05 LS-VALIDATION-CODE PIC 9(2) VALUE 0. 01 LS-CALCULATION-AREAS. 05 LS-TEMP-AMOUNT PIC 9(8)V99 VALUE 0. 05 LS-RUNNING-TOTAL PIC 9(10)V99 VALUE 0. 05 LS-AVERAGE-VALUE PIC 9(8)V99 VALUE 0. 05 LS-MAX-VALUE PIC 9(8)V99 VALUE 0. 05 LS-MIN-VALUE PIC 9(8)V99 VALUE 999999.99. 01 LS-CONTROL-FLAGS. 05 LS-PROCESSING-ACTIVE PIC X VALUE 'N'. 05 LS-ERROR-OCCURRED PIC X VALUE 'N'. 05 LS-VALIDATION-PASSED PIC X VALUE 'Y'. 05 LS-CALCULATIONS-DONE PIC X VALUE 'N'. 01 LS-ARRAY-WORK. 05 LS-WORK-TABLE OCCURS 50 TIMES. 10 LS-TABLE-KEY PIC X(10) VALUE SPACES. 10 LS-TABLE-DATA PIC X(30) VALUE SPACES. 10 LS-TABLE-AMOUNT PIC 9(7)V99 VALUE 0. 10 LS-TABLE-FLAG PIC X VALUE 'N'. 01 LS-EMPLOYEE-PROCESSING. 05 LS-CURRENT-EMP. 10 LS-EMP-ID PIC 9(6) VALUE 0. 10 LS-EMP-NAME PIC X(30) VALUE SPACES. 10 LS-EMP-DEPT PIC X(15) VALUE SPACES. 10 LS-EMP-SALARY PIC 9(7)V99 VALUE 0. 05 LS-DEPARTMENT-TOTALS. 10 LS-DEPT-COUNT PIC 9(4) VALUE 0. 10 LS-DEPT-TOTAL-SAL PIC 9(9)V99 VALUE 0. 10 LS-DEPT-AVG-SAL PIC 9(7)V99 VALUE 0. PROCEDURE DIVISION. MAIN-PROCESSING. *> Demonstrate automatic initialization PERFORM DEMONSTRATE-INITIALIZATION *> Call this program recursively to show LOCAL-STORAGE behavior PERFORM DEMONSTRATE-RECURSIVE-CALLS *> Show persistent vs local storage differences PERFORM DEMONSTRATE-STORAGE-DIFFERENCES *> Show practical applications PERFORM DEMONSTRATE-PRACTICAL-USAGE STOP RUN. DEMONSTRATE-INITIALIZATION. DISPLAY "=== LOCAL-STORAGE INITIALIZATION DEMO ===" DISPLAY SPACES *> Increment persistent counter ADD 1 TO WS-CALL-COUNTER DISPLAY "Program call number: " WS-CALL-COUNTER DISPLAY "LOCAL-STORAGE values at start:" DISPLAY " LS-RECORDS-PROCESSED: " LS-RECORDS-PROCESSED DISPLAY " LS-RUNNING-TOTAL: " LS-RUNNING-TOTAL DISPLAY " LS-PROCESSING-ACTIVE: " LS-PROCESSING-ACTIVE DISPLAY " LS-MIN-VALUE: " LS-MIN-VALUE *> Modify LOCAL-STORAGE values MOVE 100 TO LS-RECORDS-PROCESSED MOVE 5000.50 TO LS-RUNNING-TOTAL MOVE 'Y' TO LS-PROCESSING-ACTIVE MOVE 25.75 TO LS-MIN-VALUE DISPLAY "After modification:" DISPLAY " LS-RECORDS-PROCESSED: " LS-RECORDS-PROCESSED DISPLAY " LS-RUNNING-TOTAL: " LS-RUNNING-TOTAL DISPLAY " LS-PROCESSING-ACTIVE: " LS-PROCESSING-ACTIVE DISPLAY " LS-MIN-VALUE: " LS-MIN-VALUE DISPLAY SPACES. DEMONSTRATE-RECURSIVE-CALLS. DISPLAY "=== RECURSIVE CALL DEMONSTRATION ===" DISPLAY SPACES IF WS-CALL-COUNTER < 3 DISPLAY "Making recursive call (call " WS-CALL-COUNTER ")" DISPLAY "Current LS-RECORDS-PROCESSED: " LS-RECORDS-PROCESSED *> Set a value before recursive call MOVE 555 TO LS-RECORDS-PROCESSED DISPLAY "Set LS-RECORDS-PROCESSED to: " LS-RECORDS-PROCESSED *> Make recursive call CALL "LOCAL-STORAGE-DEMO" *> Check value after recursive call DISPLAY "After recursive call, LS-RECORDS-PROCESSED: " LS-RECORDS-PROCESSED DISPLAY "This shows LOCAL-STORAGE is reinitialized on each call" ELSE DISPLAY "Maximum recursion depth reached" END-IF DISPLAY SPACES. DEMONSTRATE-STORAGE-DIFFERENCES. DISPLAY "=== STORAGE TYPE DIFFERENCES ===" DISPLAY SPACES DISPLAY "WORKING-STORAGE (persistent between calls):" DISPLAY " WS-CALL-COUNTER: " WS-CALL-COUNTER IF WS-FIRST-CALL = 'Y' DISPLAY " This is the first call - setting WS-FIRST-CALL to 'N'" MOVE 'N' TO WS-FIRST-CALL ELSE DISPLAY " This is a subsequent call - WS-FIRST-CALL is still 'N'" END-IF DISPLAY "LOCAL-STORAGE (reinitialized on each call):" DISPLAY " LS-PROCESSING-ACTIVE: " LS-PROCESSING-ACTIVE DISPLAY " LS-ERROR-OCCURRED: " LS-ERROR-OCCURRED DISPLAY " LS-VALIDATION-PASSED: " LS-VALIDATION-PASSED *> Modify LOCAL-STORAGE flags MOVE 'Y' TO LS-PROCESSING-ACTIVE MOVE 'Y' TO LS-ERROR-OCCURRED MOVE 'N' TO LS-VALIDATION-PASSED DISPLAY "After modification:" DISPLAY " LS-PROCESSING-ACTIVE: " LS-PROCESSING-ACTIVE DISPLAY " LS-ERROR-OCCURRED: " LS-ERROR-OCCURRED DISPLAY " LS-VALIDATION-PASSED: " LS-VALIDATION-PASSED DISPLAY "Note: These LOCAL-STORAGE values will be reset on next call" DISPLAY SPACES. DEMONSTRATE-PRACTICAL-USAGE. DISPLAY "=== PRACTICAL LOCAL-STORAGE USAGE ===" DISPLAY SPACES PERFORM EMPLOYEE-PROCESSING-EXAMPLE PERFORM VALIDATION-PROCESSING-EXAMPLE PERFORM CALCULATION-PROCESSING-EXAMPLE. EMPLOYEE-PROCESSING-EXAMPLE. DISPLAY "Employee Processing with LOCAL-STORAGE:" *> Initialize current employee (automatic each call) MOVE 123456 TO LS-EMP-ID MOVE "JOHN SMITH" TO LS-EMP-NAME MOVE "SALES" TO LS-EMP-DEPT MOVE 65000.00 TO LS-EMP-SALARY *> Process department statistics ADD 1 TO LS-DEPT-COUNT ADD LS-EMP-SALARY TO LS-DEPT-TOTAL-SAL COMPUTE LS-DEPT-AVG-SAL = LS-DEPT-TOTAL-SAL / LS-DEPT-COUNT DISPLAY " Employee: " LS-EMP-NAME DISPLAY " Department: " LS-EMP-DEPT DISPLAY " Salary: $" LS-EMP-SALARY DISPLAY " Dept Statistics: Count=" LS-DEPT-COUNT " Total=$" LS-DEPT-TOTAL-SAL " Avg=$" LS-DEPT-AVG-SAL DISPLAY SPACES. VALIDATION-PROCESSING-EXAMPLE. 01 WS-TEST-RECORD PIC X(50) VALUE "TEST DATA FOR VALIDATION". 01 WS-VALIDATION-INDEX PIC 9(2) VALUE 0. DISPLAY "Validation Processing with LOCAL-STORAGE:" MOVE WS-TEST-RECORD TO LS-CURRENT-RECORD *> Simulate validation process PERFORM VARYING WS-VALIDATION-INDEX FROM 1 BY 1 UNTIL WS-VALIDATION-INDEX > 5 ADD 1 TO LS-RECORDS-PROCESSED IF WS-VALIDATION-INDEX = 3 ADD 1 TO LS-RECORDS-REJECTED MOVE "VALIDATION ERROR AT POSITION 3" TO LS-ERROR-MESSAGE MOVE 'Y' TO LS-ERROR-OCCURRED ELSE ADD 1 TO LS-RECORDS-VALIDATED END-IF IF FUNCTION MOD(WS-VALIDATION-INDEX, 2) = 0 ADD 1 TO LS-WARNINGS-ISSUED END-IF END-PERFORM DISPLAY " Records processed: " LS-RECORDS-PROCESSED DISPLAY " Records validated: " LS-RECORDS-VALIDATED DISPLAY " Records rejected: " LS-RECORDS-REJECTED DISPLAY " Warnings issued: " LS-WARNINGS-ISSUED IF LS-ERROR-OCCURRED = 'Y' DISPLAY " Error: " LS-ERROR-MESSAGE END-IF DISPLAY SPACES. CALCULATION-PROCESSING-EXAMPLE. 01 WS-TEST-VALUES. 05 WS-TEST-AMOUNTS OCCURS 5 TIMES PIC 9(5)V99 VALUE 100.50, 250.75, 75.25, 400.00, 175.30. 01 WS-CALC-INDEX PIC 9(2) VALUE 0. DISPLAY "Calculation Processing with LOCAL-STORAGE:" *> Process test amounts PERFORM VARYING WS-CALC-INDEX FROM 1 BY 1 UNTIL WS-CALC-INDEX > 5 MOVE WS-TEST-AMOUNTS(WS-CALC-INDEX) TO LS-TEMP-AMOUNT ADD LS-TEMP-AMOUNT TO LS-RUNNING-TOTAL *> Track maximum and minimum IF LS-TEMP-AMOUNT > LS-MAX-VALUE MOVE LS-TEMP-AMOUNT TO LS-MAX-VALUE END-IF IF LS-TEMP-AMOUNT < LS-MIN-VALUE MOVE LS-TEMP-AMOUNT TO LS-MIN-VALUE END-IF END-PERFORM *> Calculate average COMPUTE LS-AVERAGE-VALUE = LS-RUNNING-TOTAL / 5 MOVE 'Y' TO LS-CALCULATIONS-DONE DISPLAY " Running total: $" LS-RUNNING-TOTAL DISPLAY " Average value: $" LS-AVERAGE-VALUE DISPLAY " Maximum value: $" LS-MAX-VALUE DISPLAY " Minimum value: $" LS-MIN-VALUE DISPLAY " Calculations complete: " LS-CALCULATIONS-DONE DISPLAY SPACES PERFORM SHOW-ARRAY-WORK-EXAMPLE. SHOW-ARRAY-WORK-EXAMPLE. 01 WS-ARRAY-INDEX PIC 9(2) VALUE 0. 01 WS-SAMPLE-KEYS. 05 WS-KEY-VALUES OCCURS 5 TIMES PIC X(10) VALUE "KEY001", "KEY002", "KEY003", "KEY004", "KEY005". 01 WS-SAMPLE-DATA. 05 WS-DATA-VALUES OCCURS 5 TIMES PIC X(30) VALUE "FIRST ENTRY", "SECOND ENTRY", "THIRD ENTRY", "FOURTH ENTRY", "FIFTH ENTRY". DISPLAY "Array Work Area Example (LOCAL-STORAGE):" *> Initialize array work area (starts clean each call) PERFORM VARYING WS-ARRAY-INDEX FROM 1 BY 1 UNTIL WS-ARRAY-INDEX > 5 MOVE WS-KEY-VALUES(WS-ARRAY-INDEX) TO LS-TABLE-KEY(WS-ARRAY-INDEX) MOVE WS-DATA-VALUES(WS-ARRAY-INDEX) TO LS-TABLE-DATA(WS-ARRAY-INDEX) COMPUTE LS-TABLE-AMOUNT(WS-ARRAY-INDEX) = WS-ARRAY-INDEX * 100.25 MOVE 'Y' TO LS-TABLE-FLAG(WS-ARRAY-INDEX) DISPLAY " Entry " WS-ARRAY-INDEX ": " LS-TABLE-KEY(WS-ARRAY-INDEX) " - " LS-TABLE-DATA(WS-ARRAY-INDEX) " - $" LS-TABLE-AMOUNT(WS-ARRAY-INDEX) END-PERFORM DISPLAY "Array initialized successfully in LOCAL-STORAGE" DISPLAY "This array will be reset to initial values on next call" DISPLAY SPACES. *> ================================================== *> UTILITY SUBPROGRAM USING LOCAL-STORAGE *> ================================================== IDENTIFICATION DIVISION. PROGRAM-ID. CALC-UTILITY. DATA DIVISION. WORKING-STORAGE SECTION. 01 WS-UTILITY-VERSION PIC X(10) VALUE "1.0". 01 WS-TOTAL-CALLS PIC 9(6) VALUE 0. LOCAL-STORAGE SECTION. 01 LS-CALCULATION-STATE. 05 LS-OPERATION-TYPE PIC X(10) VALUE SPACES. 05 LS-INPUT-VALUE-1 PIC 9(8)V99 VALUE 0. 05 LS-INPUT-VALUE-2 PIC 9(8)V99 VALUE 0. 05 LS-RESULT-VALUE PIC 9(10)V99 VALUE 0. 05 LS-ERROR-CODE PIC 9(2) VALUE 0. 01 LS-PROCESSING-FLAGS. 05 LS-INPUTS-VALIDATED PIC X VALUE 'N'. 05 LS-CALCULATION-DONE PIC X VALUE 'N'. 05 LS-RESULT-VALID PIC X VALUE 'N'. LINKAGE SECTION. 01 LK-OPERATION PIC X(10). 01 LK-VALUE-1 PIC 9(8)V99. 01 LK-VALUE-2 PIC 9(8)V99. 01 LK-RESULT PIC 9(10)V99. 01 LK-STATUS PIC 9(2). PROCEDURE DIVISION USING LK-OPERATION LK-VALUE-1 LK-VALUE-2 LK-RESULT LK-STATUS. CALCULATION-MAIN. ADD 1 TO WS-TOTAL-CALLS *> Initialize LOCAL-STORAGE from parameters MOVE LK-OPERATION TO LS-OPERATION-TYPE MOVE LK-VALUE-1 TO LS-INPUT-VALUE-1 MOVE LK-VALUE-2 TO LS-INPUT-VALUE-2 PERFORM VALIDATE-INPUTS IF LS-INPUTS-VALIDATED = 'Y' PERFORM PERFORM-CALCULATION PERFORM RETURN-RESULTS ELSE MOVE 1 TO LK-STATUS END-IF GOBACK. VALIDATE-INPUTS. IF LS-OPERATION-TYPE = "ADD" OR "SUBTRACT" OR "MULTIPLY" OR "DIVIDE" IF LS-INPUT-VALUE-1 >= 0 AND LS-INPUT-VALUE-2 >= 0 MOVE 'Y' TO LS-INPUTS-VALIDATED ELSE MOVE 2 TO LS-ERROR-CODE END-IF ELSE MOVE 1 TO LS-ERROR-CODE END-IF. PERFORM-CALCULATION. EVALUATE LS-OPERATION-TYPE WHEN "ADD" ADD LS-INPUT-VALUE-1 TO LS-INPUT-VALUE-2 GIVING LS-RESULT-VALUE WHEN "SUBTRACT" SUBTRACT LS-INPUT-VALUE-2 FROM LS-INPUT-VALUE-1 GIVING LS-RESULT-VALUE WHEN "MULTIPLY" MULTIPLY LS-INPUT-VALUE-1 BY LS-INPUT-VALUE-2 GIVING LS-RESULT-VALUE WHEN "DIVIDE" IF LS-INPUT-VALUE-2 NOT = 0 DIVIDE LS-INPUT-VALUE-1 BY LS-INPUT-VALUE-2 GIVING LS-RESULT-VALUE MOVE 'Y' TO LS-RESULT-VALID ELSE MOVE 3 TO LS-ERROR-CODE MOVE 'N' TO LS-RESULT-VALID END-IF WHEN OTHER MOVE 4 TO LS-ERROR-CODE MOVE 'N' TO LS-RESULT-VALID END-EVALUATE IF LS-ERROR-CODE = 0 MOVE 'Y' TO LS-CALCULATION-DONE MOVE 'Y' TO LS-RESULT-VALID END-IF. RETURN-RESULTS. IF LS-RESULT-VALID = 'Y' MOVE LS-RESULT-VALUE TO LK-RESULT MOVE 0 TO LK-STATUS ELSE MOVE LS-ERROR-CODE TO LK-STATUS MOVE 0 TO LK-RESULT END-IF.

LOCAL-STORAGE Features

Automatic Initialization
  • • Reset on each program call
  • • VALUE clauses reapplied
  • • Fresh data state guaranteed
  • • No data contamination
Memory Management
  • • Automatic allocation/deallocation
  • • Thread-safe storage
  • • Recursive program support
  • • Efficient memory usage

Interactive Tutorial

Hands-On Exercise: LOCAL-STORAGE vs WORKING-STORAGE
Practice understanding the differences between storage types

Exercise 1: Counter Comparison

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
DATA DIVISION. WORKING-STORAGE SECTION. 01 WS-PERSISTENT-COUNTER PIC 9(4) VALUE 0. LOCAL-STORAGE SECTION. 01 LS-SESSION-COUNTER PIC 9(4) VALUE 0. PROCEDURE DIVISION. COUNTER-DEMO. ADD 1 TO WS-PERSISTENT-COUNTER ADD 1 TO LS-SESSION-COUNTER DISPLAY "Call results:" DISPLAY " WORKING-STORAGE counter: " WS-PERSISTENT-COUNTER DISPLAY " LOCAL-STORAGE counter: " LS-SESSION-COUNTER *> Call self recursively to demonstrate difference IF WS-PERSISTENT-COUNTER < 3 CALL "COUNTER-DEMO" END-IF. *> Expected output: *> Call 1: WS=1, LS=1 *> Call 2: WS=2, LS=1 (LS reinitialized) *> Call 3: WS=3, LS=1 (LS reinitialized again)

Exercise 2: Data Processing with Clean State

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
DATA DIVISION. LOCAL-STORAGE SECTION. 01 LS-PROCESSING-WORK. 05 LS-RECORD-BUFFER PIC X(100) VALUE SPACES. 05 LS-VALIDATION-FLAGS. 10 LS-NAME-VALID PIC X VALUE 'N'. 10 LS-ID-VALID PIC X VALUE 'N'. 10 LS-AMOUNT-VALID PIC X VALUE 'N'. 05 LS-ERROR-COUNT PIC 9(2) VALUE 0. 05 LS-PROCESS-STATUS PIC X(10) VALUE "READY". LINKAGE SECTION. 01 LK-INPUT-RECORD PIC X(100). 01 LK-VALIDATION-RESULT PIC X(10). PROCEDURE DIVISION USING LK-INPUT-RECORD LK-VALIDATION-RESULT. PROCESS-RECORD. *> LS-PROCESSING-WORK is automatically reset to initial values MOVE LK-INPUT-RECORD TO LS-RECORD-BUFFER MOVE "PROCESSING" TO LS-PROCESS-STATUS PERFORM VALIDATE-RECORD-FORMAT PERFORM CHECK-BUSINESS-RULES IF LS-ERROR-COUNT = 0 MOVE "VALID" TO LK-VALIDATION-RESULT ELSE MOVE "INVALID" TO LK-VALIDATION-RESULT END-IF GOBACK. VALIDATE-RECORD-FORMAT. *> Validation logic that modifies LOCAL-STORAGE flags *> Each call starts with fresh 'N' values IF LS-RECORD-BUFFER(1:10) NOT = SPACES MOVE 'Y' TO LS-NAME-VALID ELSE ADD 1 TO LS-ERROR-COUNT END-IF.

Best Practices

Knowledge Check

Test Your Understanding

Question 1: Initialization Behavior

How does LOCAL-STORAGE initialization work?

Answer: LOCAL-STORAGE items are automatically initialized to their VALUE clause values (or default values) each time the program is called. This happens before the PROCEDURE DIVISION begins execution.

Question 2: Storage Comparison

When should you choose LOCAL-STORAGE over WORKING-STORAGE?

Answer: Choose LOCAL-STORAGE when you need guaranteed fresh data on each call, for recursive programs, in multithreaded environments, or when you want to prevent data contamination between program invocations.

Question 3: Practical Applications

What are common use cases for LOCAL-STORAGE?

Answer: Common uses include: validation routines needing clean flags, calculation modules requiring fresh work areas, recursive algorithms, utility programs called multiple times, and any processing requiring guaranteed initial state.