PAGE-COUNTER is a special system variable in COBOL that automatically keeps track of the current page number in a report. Think of it as an automatic page number that COBOL manages for you - every time your report starts a new page, PAGE-COUNTER automatically increases by 1, so you always know which page you're currently working on.
Imagine you're writing a book:
PAGE-COUNTER does the same thing for your COBOL reports - it automatically tracks page numbers.
Using PAGE-COUNTER is straightforward - it's automatically available when you need it, and you can use it in various ways to display page numbers in your reports.
1234567891011121314151617181920212223242526272829303132333435363738* Basic PAGE-COUNTER example IDENTIFICATION DIVISION. PROGRAM-ID. PAGE-COUNTER-EXAMPLE. DATA DIVISION. WORKING-STORAGE SECTION. 01 REPORT-HEADER PIC X(80). 01 REPORT-FOOTER PIC X(80). 01 FORMATTED-PAGE PIC ZZZ9. PROCEDURE DIVISION. * Initialize page counter to 1 MOVE 1 TO PAGE-COUNTER * Display page header with page number MOVE PAGE-COUNTER TO FORMATTED-PAGE STRING "SALES REPORT" DELIMITED BY SIZE " Page " DELIMITED BY SIZE FORMATTED-PAGE DELIMITED BY SIZE INTO REPORT-HEADER DISPLAY REPORT-HEADER * Generate some report content DISPLAY "Customer data goes here..." DISPLAY "More report content..." * Start a new page DISPLAY " " UPON CONSOLE ADVANCING PAGE * PAGE-COUNTER automatically incremented to 2 MOVE PAGE-COUNTER TO FORMATTED-PAGE STRING "SALES REPORT" DELIMITED BY SIZE " Page " DELIMITED BY SIZE FORMATTED-PAGE DELIMITED BY SIZE INTO REPORT-HEADER DISPLAY REPORT-HEADER STOP RUN.
This example shows how PAGE-COUNTER automatically tracks page numbers in a report.
Operation | Syntax | Example |
---|---|---|
Display page number | DISPLAY PAGE-COUNTER | DISPLAY "Page: " PAGE-COUNTER |
Set page number | MOVE value TO PAGE-COUNTER | MOVE 1 TO PAGE-COUNTER |
Format for display | MOVE PAGE-COUNTER TO formatted-field | MOVE PAGE-COUNTER TO FORMATTED-PAGE |
Use in string | STRING ... PAGE-COUNTER ... | STRING "Page " PAGE-COUNTER INTO OUTPUT |
Compare page number | IF PAGE-COUNTER = value | IF PAGE-COUNTER = 10 |
Let's look at some real-world examples of how PAGE-COUNTER is used in COBOL applications.
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576* Complete report with PAGE-COUNTER IDENTIFICATION DIVISION. PROGRAM-ID. COMPLETE-REPORT. DATA DIVISION. WORKING-STORAGE SECTION. 01 REPORT-HEADER. 05 REPORT-TITLE PIC X(30) VALUE "CUSTOMER SALES REPORT". 05 FILLER PIC X(20) VALUE SPACES. 05 PAGE-LABEL PIC X(6) VALUE "Page: ". 05 PAGE-NUMBER PIC ZZZ9. 05 FILLER PIC X(20) VALUE SPACES. 05 REPORT-DATE PIC X(10). 01 REPORT-FOOTER. 05 FILLER PIC X(30) VALUE "End of Report". 05 FILLER PIC X(20) VALUE SPACES. 05 TOTAL-PAGES PIC X(10) VALUE "Total Pages: ". 05 FINAL-PAGE PIC ZZZ9. 01 CUSTOMER-RECORD. 05 CUSTOMER-ID PIC 9(6). 05 CUSTOMER-NAME PIC X(30). 05 SALES-AMOUNT PIC 9(8)V99. 01 LINE-COUNT PIC 9(2) VALUE 0. 01 MAX-LINES-PER-PAGE PIC 9(2) VALUE 20. PROCEDURE DIVISION. * Initialize report MOVE 1 TO PAGE-COUNTER MOVE FUNCTION CURRENT-DATE(1:10) TO REPORT-DATE * Display first page header PERFORM DISPLAY-PAGE-HEADER * Process customer records PERFORM UNTIL NO-MORE-RECORDS * Check if we need a new page IF LINE-COUNT >= MAX-LINES-PER-PAGE PERFORM DISPLAY-PAGE-FOOTER DISPLAY " " UPON CONSOLE ADVANCING PAGE PERFORM DISPLAY-PAGE-HEADER END-IF * Display customer record DISPLAY CUSTOMER-ID " " CUSTOMER-NAME " " SALES-AMOUNT ADD 1 TO LINE-COUNT * Read next record (simulated) PERFORM READ-NEXT-RECORD END-PERFORM * Display final page footer MOVE PAGE-COUNTER TO FINAL-PAGE PERFORM DISPLAY-PAGE-FOOTER STOP RUN. DISPLAY-PAGE-HEADER. MOVE PAGE-COUNTER TO PAGE-NUMBER DISPLAY REPORT-HEADER DISPLAY "Customer ID Customer Name Sales Amount" DISPLAY "---------- ---------------------- ------------" MOVE 0 TO LINE-COUNT. DISPLAY-PAGE-FOOTER. DISPLAY " " DISPLAY "----------------------------------------" DISPLAY "Page " PAGE-COUNTER " completed" DISPLAY "----------------------------------------". READ-NEXT-RECORD. * Simulate reading next record * In real program, this would read from a file EXIT.
This example shows a complete report with automatic page numbering and page breaks.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960* Multi-section report with different page numbering IDENTIFICATION DIVISION. PROGRAM-ID. MULTI-SECTION-REPORT. DATA DIVISION. WORKING-STORAGE SECTION. 01 SECTION-HEADER. 05 SECTION-TITLE PIC X(40). 05 FILLER PIC X(10) VALUE SPACES. 05 PAGE-LABEL PIC X(6) VALUE "Page: ". 05 PAGE-NUMBER PIC ZZZ9. 01 CURRENT-SECTION PIC X(20). 01 SECTION-PAGE-START PIC 9(3). PROCEDURE DIVISION. * Generate Executive Summary Section MOVE "EXECUTIVE SUMMARY" TO CURRENT-SECTION MOVE 1 TO PAGE-COUNTER MOVE PAGE-COUNTER TO SECTION-PAGE-START PERFORM GENERATE-SECTION * Generate Detailed Analysis Section MOVE "DETAILED ANALYSIS" TO CURRENT-SECTION * Don't reset PAGE-COUNTER - continue numbering PERFORM GENERATE-SECTION * Generate Recommendations Section MOVE "RECOMMENDATIONS" TO CURRENT-SECTION PERFORM GENERATE-SECTION * Display final summary DISPLAY " " DISPLAY "Report Summary:" DISPLAY "Total Pages: " PAGE-COUNTER DISPLAY "Executive Summary: Pages " SECTION-PAGE-START " - " FUNCTION MIN(PAGE-COUNTER, 5) STOP RUN. GENERATE-SECTION. * Display section header MOVE CURRENT-SECTION TO SECTION-TITLE MOVE PAGE-COUNTER TO PAGE-NUMBER DISPLAY SECTION-HEADER DISPLAY " " * Generate section content (simulated) DISPLAY "Section content goes here..." DISPLAY "More content..." * Simulate multiple pages for this section PERFORM VARYING PAGE-COUNTER FROM PAGE-COUNTER BY 1 UNTIL PAGE-COUNTER > PAGE-COUNTER + 2 DISPLAY " " UPON CONSOLE ADVANCING PAGE MOVE PAGE-COUNTER TO PAGE-NUMBER DISPLAY SECTION-HEADER DISPLAY "Continued content..." END-PERFORM.
This example shows how to use PAGE-COUNTER across multiple report sections.
PAGE-COUNTER supports advanced features for complex reporting scenarios.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657* Conditional page numbering based on content IDENTIFICATION DIVISION. PROGRAM-ID. CONDITIONAL-PAGING. DATA DIVISION. WORKING-STORAGE SECTION. 01 PAGE-HEADER. 05 REPORT-TITLE PIC X(30) VALUE "CONDITIONAL REPORT". 05 FILLER PIC X(20) VALUE SPACES. 05 PAGE-NUMBER PIC ZZZ9. 01 CONTENT-TYPE PIC X(10). 01 LINE-COUNT PIC 9(2) VALUE 0. 01 MAX-LINES PIC 9(2) VALUE 15. PROCEDURE DIVISION. MOVE 1 TO PAGE-COUNTER * Process different content types PERFORM PROCESS-CONTENT UNTIL NO-MORE-CONTENT STOP RUN. PROCESS-CONTENT. * Read content type (simulated) MOVE "SUMMARY" TO CONTENT-TYPE * Different page numbering based on content type EVALUATE CONTENT-TYPE WHEN "SUMMARY" * Summary pages use "S-" prefix PERFORM DISPLAY-SUMMARY-PAGE WHEN "DETAIL" * Detail pages use "D-" prefix PERFORM DISPLAY-DETAIL-PAGE WHEN "APPENDIX" * Appendix pages use "A-" prefix PERFORM DISPLAY-APPENDIX-PAGE END-EVALUATE. DISPLAY-SUMMARY-PAGE. MOVE PAGE-COUNTER TO PAGE-NUMBER DISPLAY "S-" PAGE-NUMBER " - " REPORT-TITLE DISPLAY "Summary content..." DISPLAY " " UPON CONSOLE ADVANCING PAGE. DISPLAY-DETAIL-PAGE. MOVE PAGE-COUNTER TO PAGE-NUMBER DISPLAY "D-" PAGE-NUMBER " - " REPORT-TITLE DISPLAY "Detailed content..." DISPLAY " " UPON CONSOLE ADVANCING PAGE. DISPLAY-APPENDIX-PAGE. MOVE PAGE-COUNTER TO PAGE-NUMBER DISPLAY "A-" PAGE-NUMBER " - " REPORT-TITLE DISPLAY "Appendix content..." DISPLAY " " UPON CONSOLE ADVANCING PAGE.
This example shows how to use different page numbering schemes based on content type.
12345678910111213141516171819202122232425262728293031323334353637383940414243444546* Advanced page number formatting IDENTIFICATION DIVISION. PROGRAM-ID. FORMATTED-PAGING. DATA DIVISION. WORKING-STORAGE SECTION. 01 FORMATTED-PAGE-INFO. 05 PAGE-PREFIX PIC X(5). 05 PAGE-NUMBER PIC ZZZ9. 05 PAGE-SUFFIX PIC X(5). 05 TOTAL-PAGES PIC X(10) VALUE " of ". 05 FINAL-PAGE PIC ZZZ9. 01 PAGE-STYLE PIC X(10). 01 TOTAL-PAGE-COUNT PIC 9(3) VALUE 25. PROCEDURE DIVISION. MOVE 1 TO PAGE-COUNTER * Different page number styles PERFORM VARYING PAGE-COUNTER FROM 1 BY 1 UNTIL PAGE-COUNTER > 5 * Style 1: Simple numbering MOVE "Page " TO PAGE-PREFIX MOVE PAGE-COUNTER TO PAGE-NUMBER MOVE "" TO PAGE-SUFFIX DISPLAY FORMATTED-PAGE-INFO * Style 2: With total pages MOVE "Page " TO PAGE-PREFIX MOVE PAGE-COUNTER TO PAGE-NUMBER MOVE TOTAL-PAGES TO PAGE-SUFFIX MOVE TOTAL-PAGE-COUNT TO FINAL-PAGE DISPLAY FORMATTED-PAGE-INFO * Style 3: Roman numerals (simulated) MOVE "Page " TO PAGE-PREFIX MOVE PAGE-COUNTER TO PAGE-NUMBER MOVE " (I)" TO PAGE-SUFFIX DISPLAY FORMATTED-PAGE-INFO DISPLAY " " UPON CONSOLE ADVANCING PAGE END-PERFORM STOP RUN.
This example demonstrates different ways to format page numbers for display.
Following these best practices will help you use PAGE-COUNTER effectively in your COBOL applications.
Mistake | Problem | Solution |
---|---|---|
Not initializing PAGE-COUNTER | Page numbers may start from unexpected values | Always set PAGE-COUNTER to 1 at report start |
Forgetting page breaks | Content runs together without proper pagination | Use ADVANCING PAGE when starting new pages |
Inconsistent formatting | Report looks unprofessional | Use consistent page number formatting |
Not checking page limits | Reports may exceed printer limits | Monitor PAGE-COUNTER for page limits |
Missing page numbers | Users can't navigate multi-page reports | Always include page numbers in headers/footers |
Action | Syntax | Example |
---|---|---|
Initialize page counter | MOVE 1 TO PAGE-COUNTER | MOVE 1 TO PAGE-COUNTER |
Display page number | DISPLAY PAGE-COUNTER | DISPLAY "Page: " PAGE-COUNTER |
Format page number | MOVE PAGE-COUNTER TO formatted-field | MOVE PAGE-COUNTER TO PAGE-NUMBER |
Start new page | DISPLAY " " ADVANCING PAGE | DISPLAY " " UPON CONSOLE ADVANCING PAGE |
Check page number | IF PAGE-COUNTER = value | IF PAGE-COUNTER = 10 |
Reset page counter | MOVE value TO PAGE-COUNTER | MOVE 1 TO PAGE-COUNTER |
1. What is PAGE-COUNTER in COBOL?
2. How do you declare PAGE-COUNTER in a COBOL program?
3. When does PAGE-COUNTER automatically increment?
4. How do you display the current page number using PAGE-COUNTER?
5. In which COBOL division is PAGE-COUNTER typically used?
Understanding report generation concepts in COBOL.
Working with print formatting in COBOL programs.
Understanding LINE-COUNTER for line positioning.
Working with ADVANCING for page and line control.
Creating headers and footers in COBOL reports.