MainframeMaster

COBOL Tutorial

COBOL LINAGE-COUNTER

The LINAGE-COUNTER special register represents the sophisticated automatic line counting and page position tracking mechanism within COBOL file processing environments, providing real-time line number management, intelligent page boundary detection, and comprehensive print control capabilities that enable precise document formatting, efficient page management, and reliable output positioning. This special register embodies advanced pagination principles by maintaining automatic line position tracking, supporting sophisticated page overflow detection, and facilitating comprehensive print control requirements while ensuring consistent page formatting, providing accurate line positioning feedback, and enabling complex document generation scenarios across enterprise applications requiring detailed print management, automated page control, and precise output formatting with optimized performance characteristics and reliable position tracking throughout the document lifecycle.

LINAGE-COUNTER Fundamentals

LINAGE-COUNTER Usage and Reference
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
*> LINAGE-COUNTER reference syntax LINAGE-COUNTER [OF file-name] *> Basic usage examples DISPLAY "Current line: " LINAGE-COUNTER OF REPORT-FILE IF LINAGE-COUNTER OF PRINT-FILE > 50 PERFORM END-OF-PAGE-PROCESSING END-IF *> File with LINAGE clause FD REPORT-FILE LINAGE IS 60 LINES WITH FOOTING AT 55 LINES AT TOP 3 LINES AT BOTTOM 3. 01 REPORT-RECORD PIC X(132). *> LINAGE-COUNTER automatically managed PROCEDURE DIVISION. WRITE-REPORT-LINE. WRITE REPORT-RECORD FROM WS-DETAIL-LINE *> LINAGE-COUNTER automatically incremented DISPLAY "Line written at position: " LINAGE-COUNTER OF REPORT-FILE *> Check for page overflow IF LINAGE-COUNTER OF REPORT-FILE >= 55 DISPLAY "Approaching page end" END-IF. *> Multiple files with LINAGE-COUNTER FD PRIMARY-REPORT LINAGE IS 50 LINES. 01 PRIMARY-RECORD PIC X(120). FD SECONDARY-REPORT LINAGE IS 40 LINES. 01 SECONDARY-RECORD PIC X(100). PROCEDURE DIVISION. MULTI-FILE-PROCESSING. DISPLAY "Primary report line: " LINAGE-COUNTER OF PRIMARY-REPORT DISPLAY "Secondary report line: " LINAGE-COUNTER OF SECONDARY-REPORT.
Special Register
Automatic
Line Tracking

Comprehensive LINAGE-COUNTER 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
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
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
IDENTIFICATION DIVISION. PROGRAM-ID. LINAGE-COUNTER-DEMO. ENVIRONMENT DIVISION. INPUT-OUTPUT SECTION. FILE-CONTROL. SELECT EMPLOYEE-FILE ASSIGN TO "EMPLOYEES.DAT" ORGANIZATION IS SEQUENTIAL ACCESS MODE IS SEQUENTIAL FILE STATUS IS WS-EMP-STATUS. SELECT REPORT-FILE ASSIGN TO "REPORT.TXT" ORGANIZATION IS SEQUENTIAL ACCESS MODE IS SEQUENTIAL FILE STATUS IS WS-RPT-STATUS. SELECT INVOICE-FILE ASSIGN TO "INVOICE.TXT" ORGANIZATION IS SEQUENTIAL ACCESS MODE IS SEQUENTIAL FILE STATUS IS WS-INV-STATUS. DATA DIVISION. FILE SECTION. FD EMPLOYEE-FILE. 01 EMPLOYEE-RECORD. 05 EMP-ID PIC 9(6). 05 EMP-NAME PIC X(30). 05 EMP-DEPT PIC X(15). 05 EMP-SALARY PIC 9(8)V99. *> Report file with LINAGE for automatic line counting FD REPORT-FILE LINAGE IS 60 LINES WITH FOOTING AT 55 LINES AT TOP 3 LINES AT BOTTOM 3. 01 REPORT-LINE PIC X(132). *> Invoice file with different page settings FD INVOICE-FILE LINAGE IS 45 LINES WITH FOOTING AT 40 LINES AT TOP 5 LINES AT BOTTOM 2. 01 INVOICE-LINE PIC X(80). WORKING-STORAGE SECTION. *> File status tracking 01 WS-FILE-STATUS. 05 WS-EMP-STATUS PIC X(2). 05 WS-RPT-STATUS PIC X(2). 05 WS-INV-STATUS PIC X(2). *> Line counting and page management 01 WS-LINE-MANAGEMENT. 05 WS-TOTAL-LINES PIC 9(6) VALUE 0. 05 WS-CURRENT-PAGE PIC 9(4) VALUE 1. 05 WS-PAGES-WRITTEN PIC 9(4) VALUE 0. 05 WS-LAST-LINE-POS PIC 9(3) VALUE 0. *> Report formatting structures 01 WS-REPORT-HEADERS. 05 WS-MAIN-HEADER PIC X(132) VALUE " EMPLOYEE MANAGEMENT REPORT". 05 WS-DATE-HEADER PIC X(132). 05 WS-COLUMN-HEADER PIC X(132) VALUE "EMP-ID NAME DEPT SALARY". 05 WS-SEPARATOR PIC X(132) VALUE ALL "-". 01 WS-DETAIL-LINE. 05 WS-DET-EMP-ID PIC Z(6). 05 FILLER PIC X(4) VALUE SPACES. 05 WS-DET-NAME PIC X(30). 05 FILLER PIC X(3) VALUE SPACES. 05 WS-DET-DEPT PIC X(15). 05 FILLER PIC X(3) VALUE SPACES. 05 WS-DET-SALARY PIC $,$$$,$$9.99. 05 FILLER PIC X(57) VALUE SPACES. 01 WS-PAGE-FOOTER. 05 FILLER PIC X(50) VALUE SPACES. 05 FILLER PIC X(6) VALUE "PAGE: ". 05 WS-PAGE-NUM PIC Z,ZZ9. 05 FILLER PIC X(10) VALUE SPACES. 05 FILLER PIC X(6) VALUE "LINE: ". 05 WS-FINAL-LINE PIC Z(3). 05 FILLER PIC X(47) VALUE SPACES. *> LINAGE-COUNTER monitoring 01 WS-COUNTER-TRACKING. 05 WS-PREVIOUS-COUNTER PIC 9(3) VALUE 0. 05 WS-COUNTER-DELTA PIC 9(3) VALUE 0. 05 WS-MAX-LINE-REACHED PIC 9(3) VALUE 0. 05 WS-OVERFLOW-COUNT PIC 9(3) VALUE 0. *> Sample employee data for demonstration 01 WS-SAMPLE-DATA. 05 WS-SAMPLE-COUNT PIC 9(3) VALUE 50. 05 WS-CURRENT-SAMPLE PIC 9(3) VALUE 0. PROCEDURE DIVISION. MAIN-PROCESSING. DISPLAY "=== LINAGE-COUNTER DEMONSTRATION ===" DISPLAY SPACES PERFORM INITIALIZE-PROCESSING PERFORM DEMONSTRATE-BASIC-COUNTER PERFORM DEMONSTRATE-PAGE-OVERFLOW PERFORM DEMONSTRATE-MULTI-FILE-COUNTERS PERFORM DEMONSTRATE-COUNTER-MONITORING PERFORM FINALIZE-PROCESSING DISPLAY "=== LINAGE-COUNTER DEMO COMPLETE ===" STOP RUN. INITIALIZE-PROCESSING. DISPLAY "Initializing files for LINAGE-COUNTER demonstration..." OPEN OUTPUT REPORT-FILE IF WS-RPT-STATUS NOT = "00" DISPLAY "Error opening report file: " WS-RPT-STATUS STOP RUN END-IF OPEN OUTPUT INVOICE-FILE IF WS-INV-STATUS NOT = "00" DISPLAY "Error opening invoice file: " WS-INV-STATUS STOP RUN END-IF DISPLAY "Files opened successfully" DISPLAY "Initial LINAGE-COUNTER values:" DISPLAY " Report file: " LINAGE-COUNTER OF REPORT-FILE DISPLAY " Invoice file: " LINAGE-COUNTER OF INVOICE-FILE DISPLAY SPACES. DEMONSTRATE-BASIC-COUNTER. DISPLAY "=== BASIC LINAGE-COUNTER OPERATIONS ===" DISPLAY SPACES PERFORM WRITE-REPORT-HEADERS PERFORM TRACK-COUNTER-INCREMENTS PERFORM MONITOR-LINE-POSITIONS. WRITE-REPORT-HEADERS. DISPLAY "Writing report headers and tracking LINAGE-COUNTER..." *> Capture initial counter value MOVE LINAGE-COUNTER OF REPORT-FILE TO WS-PREVIOUS-COUNTER DISPLAY "Starting LINAGE-COUNTER: " WS-PREVIOUS-COUNTER *> Write main header WRITE REPORT-LINE FROM WS-MAIN-HEADER PERFORM DISPLAY-COUNTER-CHANGE *> Write date header MOVE FUNCTION CURRENT-DATE TO WS-DATE-HEADER WRITE REPORT-LINE FROM WS-DATE-HEADER PERFORM DISPLAY-COUNTER-CHANGE *> Write blank line WRITE REPORT-LINE FROM SPACES PERFORM DISPLAY-COUNTER-CHANGE *> Write column headers WRITE REPORT-LINE FROM WS-COLUMN-HEADER PERFORM DISPLAY-COUNTER-CHANGE WRITE REPORT-LINE FROM WS-SEPARATOR PERFORM DISPLAY-COUNTER-CHANGE WRITE REPORT-LINE FROM SPACES PERFORM DISPLAY-COUNTER-CHANGE DISPLAY "Headers complete. Final LINAGE-COUNTER: " LINAGE-COUNTER OF REPORT-FILE DISPLAY SPACES. DISPLAY-COUNTER-CHANGE. COMPUTE WS-COUNTER-DELTA = LINAGE-COUNTER OF REPORT-FILE - WS-PREVIOUS-COUNTER DISPLAY " Line written - Counter now: " LINAGE-COUNTER OF REPORT-FILE " (+" WS-COUNTER-DELTA ")" MOVE LINAGE-COUNTER OF REPORT-FILE TO WS-PREVIOUS-COUNTER. TRACK-COUNTER-INCREMENTS. 01 WS-LINE-COUNT PIC 9(3) VALUE 0. 01 WS-TEST-LINE PIC X(132). DISPLAY "Tracking LINAGE-COUNTER increments with detail lines..." PERFORM VARYING WS-LINE-COUNT FROM 1 BY 1 UNTIL WS-LINE-COUNT > 20 *> Create sample employee data COMPUTE WS-DET-EMP-ID = 100000 + WS-LINE-COUNT MOVE "SAMPLE EMPLOYEE" TO WS-DET-NAME MOVE "DEPARTMENT" TO WS-DET-DEPT COMPUTE WS-DET-SALARY = 50000 + (WS-LINE-COUNT * 1000) *> Write detail line WRITE REPORT-LINE FROM WS-DETAIL-LINE *> Track counter progress IF FUNCTION MOD(WS-LINE-COUNT, 5) = 0 DISPLAY " Progress: " WS-LINE-COUNT " lines written" DISPLAY " Current LINAGE-COUNTER: " LINAGE-COUNTER OF REPORT-FILE *> Update maximum line tracking IF LINAGE-COUNTER OF REPORT-FILE > WS-MAX-LINE-REACHED MOVE LINAGE-COUNTER OF REPORT-FILE TO WS-MAX-LINE-REACHED END-IF END-IF END-PERFORM DISPLAY "Detail lines complete" DISPLAY " Total lines written: " WS-LINE-COUNT DISPLAY " Final LINAGE-COUNTER: " LINAGE-COUNTER OF REPORT-FILE DISPLAY " Maximum line reached: " WS-MAX-LINE-REACHED DISPLAY SPACES. MONITOR-LINE-POSITIONS. 01 WS-POSITION-TEST PIC 9(3). 01 WS-SPACING-LINE PIC X(132) VALUE "--- POSITION TEST LINE ---". DISPLAY "Monitoring specific line positions..." *> Test different line positions PERFORM VARYING WS-POSITION-TEST FROM 1 BY 1 UNTIL WS-POSITION-TEST > 5 WRITE REPORT-LINE FROM WS-SPACING-LINE DISPLAY " Position test " WS-POSITION-TEST " - LINAGE-COUNTER: " LINAGE-COUNTER OF REPORT-FILE *> Check for footing area approach IF LINAGE-COUNTER OF REPORT-FILE >= 50 DISPLAY " Approaching footing area (55)" END-IF IF LINAGE-COUNTER OF REPORT-FILE >= 55 DISPLAY " In footing area!" END-IF END-PERFORM DISPLAY "Position monitoring complete" DISPLAY SPACES. DEMONSTRATE-PAGE-OVERFLOW. DISPLAY "=== PAGE OVERFLOW AND COUNTER RESET ===" DISPLAY SPACES PERFORM FORCE-PAGE-OVERFLOW PERFORM MONITOR-OVERFLOW-BEHAVIOR. FORCE-PAGE-OVERFLOW. 01 WS-OVERFLOW-LINE PIC X(132) VALUE "OVERFLOW TEST LINE". 01 WS-LINES-TO-OVERFLOW PIC 9(3) VALUE 0. 01 WS-PRE-OVERFLOW PIC 9(3) VALUE 0. DISPLAY "Forcing page overflow to demonstrate counter reset..." *> Calculate lines needed to trigger overflow COMPUTE WS-LINES-TO-OVERFLOW = 55 - LINAGE-COUNTER OF REPORT-FILE + 5 MOVE LINAGE-COUNTER OF REPORT-FILE TO WS-PRE-OVERFLOW DISPLAY " Current LINAGE-COUNTER: " WS-PRE-OVERFLOW DISPLAY " Lines to write for overflow: " WS-LINES-TO-OVERFLOW PERFORM VARYING WS-OVERFLOW-COUNT FROM 1 BY 1 UNTIL WS-OVERFLOW-COUNT > WS-LINES-TO-OVERFLOW WRITE REPORT-LINE FROM WS-OVERFLOW-LINE AT END-OF-PAGE PERFORM HANDLE-PAGE-OVERFLOW IF FUNCTION MOD(WS-OVERFLOW-COUNT, 3) = 0 DISPLAY " Overflow line " WS-OVERFLOW-COUNT " - Counter: " LINAGE-COUNTER OF REPORT-FILE END-IF END-PERFORM DISPLAY "Page overflow demonstration complete" DISPLAY SPACES. HANDLE-PAGE-OVERFLOW. ADD 1 TO WS-PAGES-WRITTEN DISPLAY " *** PAGE OVERFLOW DETECTED ***" DISPLAY " Page " WS-PAGES-WRITTEN " completed" DISPLAY " LINAGE-COUNTER reset to: " LINAGE-COUNTER OF REPORT-FILE DISPLAY " Starting new page " WS-PAGES-WRITTEN *> Write new page header WRITE REPORT-LINE FROM SPACES WRITE REPORT-LINE FROM " NEW PAGE AFTER OVERFLOW" WRITE REPORT-LINE FROM SPACES DISPLAY " New page headers written - Counter: " LINAGE-COUNTER OF REPORT-FILE DISPLAY SPACES. MONITOR-OVERFLOW-BEHAVIOR. 01 WS-BEHAVIOR-LINE PIC X(132) VALUE "BEHAVIOR MONITORING LINE". 01 WS-BEHAVIOR-COUNT PIC 9(2) VALUE 0. 01 WS-COUNTER-HISTORY. 05 WS-HIST-ENTRY OCCURS 10 TIMES. 10 WS-HIST-OPERATION PIC X(20). 10 WS-HIST-COUNTER PIC 9(3). 01 WS-HIST-INDEX PIC 9(2) VALUE 0. DISPLAY "Monitoring overflow behavior patterns..." PERFORM VARYING WS-BEHAVIOR-COUNT FROM 1 BY 1 UNTIL WS-BEHAVIOR-COUNT > 8 ADD 1 TO WS-HIST-INDEX MOVE "BEFORE WRITE" TO WS-HIST-OPERATION(WS-HIST-INDEX) MOVE LINAGE-COUNTER OF REPORT-FILE TO WS-HIST-COUNTER(WS-HIST-INDEX) WRITE REPORT-LINE FROM WS-BEHAVIOR-LINE AT END-OF-PAGE PERFORM LOG-OVERFLOW-EVENT ADD 1 TO WS-HIST-INDEX IF WS-HIST-INDEX <= 10 MOVE "AFTER WRITE" TO WS-HIST-OPERATION(WS-HIST-INDEX) MOVE LINAGE-COUNTER OF REPORT-FILE TO WS-HIST-COUNTER(WS-HIST-INDEX) END-IF DISPLAY " Behavior test " WS-BEHAVIOR-COUNT " - Counter: " LINAGE-COUNTER OF REPORT-FILE END-PERFORM *> Display counter history DISPLAY "Counter behavior history:" PERFORM VARYING WS-HIST-INDEX FROM 1 BY 1 UNTIL WS-HIST-INDEX > 10 IF WS-HIST-OPERATION(WS-HIST-INDEX) NOT = SPACES DISPLAY " " WS-HIST-OPERATION(WS-HIST-INDEX) " - " WS-HIST-COUNTER(WS-HIST-INDEX) END-IF END-PERFORM DISPLAY SPACES. LOG-OVERFLOW-EVENT. DISPLAY " Overflow event logged - Counter behavior tracked" ADD 1 TO WS-OVERFLOW-COUNT. DEMONSTRATE-MULTI-FILE-COUNTERS. DISPLAY "=== MULTIPLE FILE LINAGE-COUNTERS ===" DISPLAY SPACES PERFORM COMPARE-COUNTER-STATES PERFORM INDEPENDENT-COUNTER-OPERATIONS. COMPARE-COUNTER-STATES. 01 WS-REPORT-COUNTER PIC 9(3). 01 WS-INVOICE-COUNTER PIC 9(3). 01 WS-COUNTER-DIFF PIC S9(3). DISPLAY "Comparing LINAGE-COUNTER states across files..." MOVE LINAGE-COUNTER OF REPORT-FILE TO WS-REPORT-COUNTER MOVE LINAGE-COUNTER OF INVOICE-FILE TO WS-INVOICE-COUNTER COMPUTE WS-COUNTER-DIFF = WS-REPORT-COUNTER - WS-INVOICE-COUNTER DISPLAY " Report file LINAGE-COUNTER: " WS-REPORT-COUNTER DISPLAY " Invoice file LINAGE-COUNTER: " WS-INVOICE-COUNTER DISPLAY " Difference: " WS-COUNTER-DIFF IF WS-COUNTER-DIFF = 0 DISPLAY " Counters are synchronized" ELSE DISPLAY " Counters are independent (expected)" END-IF DISPLAY SPACES. INDEPENDENT-COUNTER-OPERATIONS. 01 WS-INVOICE-LINE-DATA PIC X(80) VALUE "INVOICE LINE FOR COUNTER TEST". 01 WS-REPORT-LINE-DATA PIC X(132) VALUE "REPORT LINE FOR COUNTER TEST". 01 WS-OPERATION-COUNT PIC 9(2) VALUE 0. DISPLAY "Demonstrating independent counter operations..." PERFORM VARYING WS-OPERATION-COUNT FROM 1 BY 1 UNTIL WS-OPERATION-COUNT > 5 DISPLAY " Operation " WS-OPERATION-COUNT ":" *> Write to invoice file WRITE INVOICE-LINE FROM WS-INVOICE-LINE-DATA DISPLAY " Invoice write - Counter: " LINAGE-COUNTER OF INVOICE-FILE *> Write to report file WRITE REPORT-LINE FROM WS-REPORT-LINE-DATA DISPLAY " Report write - Counter: " LINAGE-COUNTER OF REPORT-FILE DISPLAY " Independent operation complete" DISPLAY SPACES END-PERFORM DISPLAY "Independent counter operations complete" DISPLAY " Final invoice counter: " LINAGE-COUNTER OF INVOICE-FILE DISPLAY " Final report counter: " LINAGE-COUNTER OF REPORT-FILE DISPLAY SPACES. DEMONSTRATE-COUNTER-MONITORING. DISPLAY "=== ADVANCED COUNTER MONITORING ===" DISPLAY SPACES PERFORM MONITOR-THRESHOLD-CONDITIONS PERFORM CALCULATE-REMAINING-LINES PERFORM PREDICT-OVERFLOW-POINTS. MONITOR-THRESHOLD-CONDITIONS. 01 WS-THRESHOLD-VALUES. 05 WS-EARLY-WARNING PIC 9(2) VALUE 40. 05 WS-CAUTION-POINT PIC 9(2) VALUE 50. 05 WS-CRITICAL-POINT PIC 9(2) VALUE 55. 01 WS-CURRENT-POSITION PIC 9(3). 01 WS-STATUS-MESSAGE PIC X(30). DISPLAY "Monitoring threshold conditions..." MOVE LINAGE-COUNTER OF REPORT-FILE TO WS-CURRENT-POSITION EVALUATE WS-CURRENT-POSITION WHEN 1 THRU 39 MOVE "NORMAL - PLENTY OF SPACE" TO WS-STATUS-MESSAGE WHEN 40 THRU 49 MOVE "EARLY WARNING - PLAN AHEAD" TO WS-STATUS-MESSAGE WHEN 50 THRU 54 MOVE "CAUTION - NEARING PAGE END" TO WS-STATUS-MESSAGE WHEN 55 THRU 60 MOVE "CRITICAL - IMMEDIATE OVERFLOW" TO WS-STATUS-MESSAGE WHEN OTHER MOVE "UNKNOWN POSITION" TO WS-STATUS-MESSAGE END-EVALUATE DISPLAY " Current position: " WS-CURRENT-POSITION DISPLAY " Status: " WS-STATUS-MESSAGE DISPLAY " Thresholds: Early=" WS-EARLY-WARNING " Caution=" WS-CAUTION-POINT " Critical=" WS-CRITICAL-POINT DISPLAY SPACES. CALCULATE-REMAINING-LINES. 01 WS-PAGE-CAPACITY PIC 9(2) VALUE 60. 01 WS-FOOTING-START PIC 9(2) VALUE 55. 01 WS-CURRENT-LINE PIC 9(3). 01 WS-REMAINING-LINES PIC 9(3). 01 WS-FOOTING-LINES PIC 9(2). DISPLAY "Calculating remaining line capacity..." MOVE LINAGE-COUNTER OF REPORT-FILE TO WS-CURRENT-LINE IF WS-CURRENT-LINE < WS-FOOTING-START COMPUTE WS-REMAINING-LINES = WS-FOOTING-START - WS-CURRENT-LINE COMPUTE WS-FOOTING-LINES = WS-PAGE-CAPACITY - WS-FOOTING-START ELSE COMPUTE WS-REMAINING-LINES = WS-PAGE-CAPACITY - WS-CURRENT-LINE MOVE 0 TO WS-FOOTING-LINES END-IF DISPLAY " Current line: " WS-CURRENT-LINE DISPLAY " Lines until footing: " WS-REMAINING-LINES DISPLAY " Footing area lines: " WS-FOOTING-LINES DISPLAY " Total page capacity: " WS-PAGE-CAPACITY DISPLAY SPACES. PREDICT-OVERFLOW-POINTS. 01 WS-PREDICTION-VARS. 05 WS-LINES-PER-RECORD PIC 9V9 VALUE 1.5. 05 WS-RECORDS-TO-WRITE PIC 9(3) VALUE 25. 05 WS-ESTIMATED-LINES PIC 9(4)V9. 05 WS-OVERFLOW-PREDICTION PIC X(50). 01 WS-CURRENT-COUNTER PIC 9(3). 01 WS-PREDICTED-FINAL PIC 9(4). DISPLAY "Predicting overflow points..." MOVE LINAGE-COUNTER OF REPORT-FILE TO WS-CURRENT-COUNTER COMPUTE WS-ESTIMATED-LINES = WS-RECORDS-TO-WRITE * WS-LINES-PER-RECORD COMPUTE WS-PREDICTED-FINAL = WS-CURRENT-COUNTER + WS-ESTIMATED-LINES IF WS-PREDICTED-FINAL <= 55 MOVE "NO OVERFLOW EXPECTED" TO WS-OVERFLOW-PREDICTION ELSE IF WS-PREDICTED-FINAL <= 120 MOVE "SINGLE PAGE OVERFLOW LIKELY" TO WS-OVERFLOW-PREDICTION ELSE MOVE "MULTIPLE PAGE OVERFLOWS EXPECTED" TO WS-OVERFLOW-PREDICTION END-IF END-IF DISPLAY " Current position: " WS-CURRENT-COUNTER DISPLAY " Records to write: " WS-RECORDS-TO-WRITE DISPLAY " Avg lines per record: " WS-LINES-PER-RECORD DISPLAY " Estimated total lines: " WS-ESTIMATED-LINES DISPLAY " Predicted final position: " WS-PREDICTED-FINAL DISPLAY " Overflow prediction: " WS-OVERFLOW-PREDICTION DISPLAY SPACES. FINALIZE-PROCESSING. DISPLAY "=== FINALIZING LINAGE-COUNTER DEMO ===" DISPLAY SPACES PERFORM WRITE-FINAL-STATISTICS PERFORM CLOSE-FILES. WRITE-FINAL-STATISTICS. 01 WS-FINAL-STATS. 05 WS-FINAL-RPT-COUNTER PIC 9(3). 05 WS-FINAL-INV-COUNTER PIC 9(3). 05 WS-TOTAL-OPERATIONS PIC 9(4). MOVE LINAGE-COUNTER OF REPORT-FILE TO WS-FINAL-RPT-COUNTER MOVE LINAGE-COUNTER OF INVOICE-FILE TO WS-FINAL-INV-COUNTER ADD WS-FINAL-RPT-COUNTER WS-FINAL-INV-COUNTER GIVING WS-TOTAL-OPERATIONS DISPLAY "Final LINAGE-COUNTER statistics:" DISPLAY " Report file final position: " WS-FINAL-RPT-COUNTER DISPLAY " Invoice file final position: " WS-FINAL-INV-COUNTER DISPLAY " Total line operations: " WS-TOTAL-OPERATIONS DISPLAY " Pages completed: " WS-PAGES-WRITTEN DISPLAY " Overflow events: " WS-OVERFLOW-COUNT DISPLAY " Maximum line reached: " WS-MAX-LINE-REACHED DISPLAY SPACES. CLOSE-FILES. CLOSE REPORT-FILE CLOSE INVOICE-FILE DISPLAY "Files closed successfully" DISPLAY "LINAGE-COUNTER demonstration completed" DISPLAY "All automatic line counting operations verified".

LINAGE-COUNTER Features

Automatic Management
  • • System-maintained counter
  • • Auto-increment on WRITE
  • • Auto-reset on page overflow
  • • Read-only access
Position Tracking
  • • Current line position
  • • Page boundary detection
  • • Footing area identification
  • • Overflow prediction

Interactive Tutorial

Hands-On Exercise: LINAGE-COUNTER Monitoring
Practice monitoring and using LINAGE-COUNTER for page control

Exercise 1: Basic Counter Monitoring

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
FD PAYROLL-REPORT LINAGE IS 50 LINES WITH FOOTING AT 45. 01 PAYROLL-LINE PIC X(120). 01 WS-PAYROLL-DATA. 05 WS-EMPLOYEE-COUNT PIC 9(3) VALUE 0. 05 WS-LINE-THRESHOLD PIC 9(2) VALUE 40. PROCEDURE DIVISION. MONITOR-COUNTER-EXAMPLE. OPEN OUTPUT PAYROLL-REPORT *> Write header WRITE PAYROLL-LINE FROM "PAYROLL REPORT HEADER" DISPLAY "Header written at line: " LINAGE-COUNTER OF PAYROLL-REPORT *> Process employees with counter monitoring PERFORM VARYING WS-EMPLOYEE-COUNT FROM 1 BY 1 UNTIL WS-EMPLOYEE-COUNT > 60 MOVE "EMPLOYEE PAYROLL LINE" TO PAYROLL-LINE WRITE PAYROLL-LINE *> Monitor counter for page management IF LINAGE-COUNTER OF PAYROLL-REPORT >= WS-LINE-THRESHOLD DISPLAY "Approaching page end at line: " LINAGE-COUNTER OF PAYROLL-REPORT END-IF *> Handle page overflow IF LINAGE-COUNTER OF PAYROLL-REPORT >= 45 DISPLAY "Page overflow imminent" END-IF END-PERFORM.

Exercise 2: Multi-File Counter Coordination

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
FD SUMMARY-REPORT LINAGE IS 30 LINES. 01 SUMMARY-LINE PIC X(80). FD DETAIL-REPORT LINAGE IS 55 LINES. 01 DETAIL-LINE PIC X(120). 01 WS-COORDINATION. 05 WS-SUMMARY-POS PIC 9(2). 05 WS-DETAIL-POS PIC 9(2). 05 WS-SYNC-NEEDED PIC X VALUE 'N'. PROCEDURE DIVISION. COORDINATE-COUNTERS. OPEN OUTPUT SUMMARY-REPORT DETAIL-REPORT PERFORM 20 TIMES *> Write to both files WRITE SUMMARY-LINE FROM "SUMMARY DATA" WRITE DETAIL-LINE FROM "DETAIL DATA" *> Monitor counter positions MOVE LINAGE-COUNTER OF SUMMARY-REPORT TO WS-SUMMARY-POS MOVE LINAGE-COUNTER OF DETAIL-REPORT TO WS-DETAIL-POS DISPLAY "Summary line: " WS-SUMMARY-POS " Detail line: " WS-DETAIL-POS *> Check for synchronization needs IF WS-SUMMARY-POS >= 25 AND WS-DETAIL-POS < 50 MOVE 'Y' TO WS-SYNC-NEEDED DISPLAY "Files may need synchronization" END-IF END-PERFORM.

Best Practices

Knowledge Check

Test Your Understanding

Question 1: Automatic Management

How is LINAGE-COUNTER automatically managed by COBOL?

Answer: LINAGE-COUNTER is automatically incremented by 1 with each WRITE statement to a file with LINAGE. It resets to 1 when page overflow occurs, and it cannot be directly modified by the program.

Question 2: Multiple Files

How do LINAGE-COUNTER values work with multiple files?

Answer: Each file has its own independent LINAGE-COUNTER. You must specify the file name when referencing: LINAGE-COUNTER OF file-name. Each counter operates independently of others.

Question 3: Practical Uses

What are practical applications of monitoring LINAGE-COUNTER?

Answer: Monitoring LINAGE-COUNTER helps with: preventing orphan lines, planning section breaks, calculating remaining page space, coordinating multi-file output, and debugging page formatting issues.