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.
12345678910111213141516171819202122232425262728293031323334353637383940414243*> 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.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538IDENTIFICATION 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".
1234567891011121314151617181920212223242526272829303132333435FD 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.
1234567891011121314151617181920212223242526272829303132333435FD 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.
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.
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.
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.