The BOTTOM clause in COBOL is a powerful report formatting feature used to control page layout and positioning in printed reports and formatted output. This clause defines the bottom margin of a page and determines where footings, totals, and page endings should be placed in report generation. BOTTOM is essential for creating professional-looking reports, ensuring consistent page formatting, managing white space, controlling page breaks, and optimizing printed output layout in business applications, financial reports, inventory systems, and any scenario where precise page formatting and professional presentation of data are critical for business communication and documentation requirements.
The BOTTOM clause specifies the bottom margin of a report page by defining how many lines from the bottom of the page should be reserved. This ensures proper spacing for footings, page numbers, and maintains consistent formatting across multi-page reports. It's commonly used in conjunction with TOP and PAGE clauses for complete page layout control.
12345678910111213141516171819202122232425262728293031323334ENVIRONMENT DIVISION. CONFIGURATION SECTION. SOURCE-COMPUTER. IBM-370. OBJECT-COMPUTER. IBM-370. INPUT-OUTPUT SECTION. FILE-CONTROL. SELECT REPORT-FILE ASSIGN TO PRINTER. DATA DIVISION. FILE SECTION. FD REPORT-FILE LABEL RECORDS ARE OMITTED LINAGE IS 60 LINES WITH FOOTING AT 55 LINES AT TOP 5 LINES AT BOTTOM 3. 01 REPORT-RECORD PIC X(132). WORKING-STORAGE SECTION. 01 PAGE-CONTROL. 05 CURRENT-PAGE PIC 999 VALUE 1. 05 LINE-COUNT PIC 99 VALUE ZERO. 05 MAX-LINES PIC 99 VALUE 52. 05 FOOTER-LINE PIC 99 VALUE 55. PROCEDURE DIVISION. GENERATE-REPORT. OPEN OUTPUT REPORT-FILE PERFORM WRITE-REPORT-HEADER PERFORM PROCESS-DETAIL-LINES PERFORM WRITE-REPORT-FOOTER CLOSE REPORT-FILE.
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576*> Comprehensive page layout with BOTTOM clause DATA DIVISION. WORKING-STORAGE SECTION. 01 PAGE-LAYOUT-CONTROL. 05 PAGE-SIZE PIC 99 VALUE 66. 05 TOP-MARGIN PIC 99 VALUE 6. 05 BOTTOM-MARGIN PIC 99 VALUE 6. 05 USABLE-LINES PIC 99 VALUE 54. 05 FOOTER-START PIC 99 VALUE 60. 01 REPORT-HEADERS. 05 MAIN-TITLE PIC X(80) VALUE " MONTHLY SALES REPORT". 05 SUB-TITLE PIC X(80) VALUE " REGIONAL SUMMARY". 05 COLUMN-HEADERS PIC X(80) VALUE "REGION SALES AMT COMMISSION NET PROFIT". 01 REPORT-FOOTERS. 05 PAGE-FOOTER PIC X(80) VALUE ALL "-". 05 COMPANY-INFO PIC X(80) VALUE " ABC Corporation - Confidential". FILE SECTION. FD SALES-REPORT LABEL RECORDS ARE OMITTED LINAGE IS 66 LINES WITH FOOTING AT 60 LINES AT TOP 6 LINES AT BOTTOM 6. 01 SALES-REPORT-LINE PIC X(132). PROCEDURE DIVISION. CREATE-FORMATTED-REPORT. OPEN OUTPUT SALES-REPORT PERFORM WRITE-PAGE-HEADER PERFORM VARYING WS-REGION-IDX FROM 1 BY 1 UNTIL WS-REGION-IDX > WS-TOTAL-REGIONS PERFORM CHECK-PAGE-OVERFLOW PERFORM WRITE-REGION-DETAILS ADD 1 TO LINE-COUNT END-PERFORM PERFORM WRITE-REPORT-TOTALS PERFORM WRITE-PAGE-FOOTER CLOSE SALES-REPORT. CHECK-PAGE-OVERFLOW. IF LINE-COUNT >= USABLE-LINES PERFORM WRITE-PAGE-FOOTER PERFORM START-NEW-PAGE PERFORM WRITE-PAGE-HEADER END-IF. WRITE-PAGE-HEADER. WRITE SALES-REPORT-LINE FROM MAIN-TITLE AFTER ADVANCING PAGE WRITE SALES-REPORT-LINE FROM SUB-TITLE AFTER ADVANCING 2 LINES WRITE SALES-REPORT-LINE FROM COLUMN-HEADERS AFTER ADVANCING 3 LINES MOVE 6 TO LINE-COUNT. WRITE-PAGE-FOOTER. WRITE SALES-REPORT-LINE FROM PAGE-FOOTER AFTER ADVANCING TO FOOTING STRING "Page " CURRENT-PAGE " of Report" DELIMITED BY SIZE INTO WS-PAGE-NUMBER-LINE END-STRING WRITE SALES-REPORT-LINE FROM WS-PAGE-NUMBER-LINE AFTER ADVANCING 1 LINE WRITE SALES-REPORT-LINE FROM COMPANY-INFO AFTER ADVANCING 1 LINE.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105*> Multi-column report with precise bottom control DATA DIVISION. WORKING-STORAGE SECTION. 01 ADVANCED-PAGE-CONTROL. 05 PHYSICAL-PAGE-SIZE PIC 999 VALUE 132. 05 LOGICAL-PAGE-SIZE PIC 99 VALUE 60. 05 HEADER-LINES PIC 99 VALUE 8. 05 FOOTER-LINES PIC 99 VALUE 5. 05 DETAIL-LINES PIC 99 VALUE 47. 05 CURRENT-LINE PIC 99 VALUE ZERO. 01 MULTI-COLUMN-LAYOUT. 05 COLUMN-1-START PIC 99 VALUE 1. 05 COLUMN-2-START PIC 99 VALUE 45. 05 COLUMN-3-START PIC 99 VALUE 89. 05 COLUMN-WIDTH PIC 99 VALUE 40. 01 REPORT-SPACING. 05 SINGLE-SPACE PIC 9 VALUE 1. 05 DOUBLE-SPACE PIC 9 VALUE 2. 05 TRIPLE-SPACE PIC 9 VALUE 3. 01 FOOTER-ELEMENTS. 05 SEPARATOR-LINE PIC X(132) VALUE ALL "=". 05 TOTAL-LINE PIC X(132). 05 GRAND-TOTAL-LINE PIC X(132). 05 DATE-TIME-LINE PIC X(132). 05 CONFIDENTIAL-LINE PIC X(132) VALUE " CONFIDENTIAL - INTERNAL USE ONLY". FILE SECTION. FD MULTI-COLUMN-REPORT LABEL RECORDS ARE OMITTED LINAGE IS 60 LINES WITH FOOTING AT 55 LINES AT TOP 8 LINES AT BOTTOM 5. 01 MULTI-REPORT-LINE PIC X(132). PROCEDURE DIVISION. GENERATE-MULTI-COLUMN-REPORT. PERFORM INITIALIZE-REPORT-PROCESSING PERFORM PRINT-REPORT-HEADER PERFORM VARYING WS-PAGE-NUM FROM 1 BY 1 UNTIL END-OF-DATA PERFORM PROCESS-PAGE-DETAILS PERFORM CHECK-FOOTER-REQUIREMENTS IF NOT END-OF-DATA PERFORM ADVANCE-TO-NEXT-PAGE END-IF END-PERFORM PERFORM FINALIZE-REPORT-PROCESSING. PROCESS-PAGE-DETAILS. PERFORM VARYING CURRENT-LINE FROM 1 BY 1 UNTIL CURRENT-LINE > DETAIL-LINES OR END-OF-DATA PERFORM FORMAT-DETAIL-LINE PERFORM WRITE-DETAIL-WITH-SPACING IF CURRENT-LINE = DETAIL-LINES PERFORM PREPARE-PAGE-FOOTER END-IF END-PERFORM. CHECK-FOOTER-REQUIREMENTS. *> Calculate space needed for footers COMPUTE WS-SPACE-REMAINING = FOOTER-LINES - (LOGICAL-PAGE-SIZE - CURRENT-LINE) IF WS-SPACE-REMAINING <= 0 PERFORM WRITE-STANDARD-FOOTER ELSE PERFORM WRITE-COMPRESSED-FOOTER END-IF. WRITE-STANDARD-FOOTER. WRITE MULTI-REPORT-LINE FROM SEPARATOR-LINE AFTER ADVANCING TO FOOTING *> Format and write totals PERFORM FORMAT-PAGE-TOTALS WRITE MULTI-REPORT-LINE FROM TOTAL-LINE AFTER ADVANCING SINGLE-SPACE *> Add timestamp PERFORM GET-CURRENT-DATE-TIME WRITE MULTI-REPORT-LINE FROM DATE-TIME-LINE AFTER ADVANCING SINGLE-SPACE WRITE MULTI-REPORT-LINE FROM CONFIDENTIAL-LINE AFTER ADVANCING DOUBLE-SPACE. FORMAT-PAGE-TOTALS. STRING "Page Total: $" WS-PAGE-TOTAL " Running Total: $" WS-RUNNING-TOTAL " Page " WS-CURRENT-PAGE DELIMITED BY SIZE INTO TOTAL-LINE END-STRING.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114*> Dynamic page management with variable content DATA DIVISION. WORKING-STORAGE SECTION. 01 DYNAMIC-PAGE-CONTROL. 05 VARIABLE-CONTENT-FLAG PIC X VALUE 'N'. 88 VARIABLE-CONTENT VALUE 'Y'. 05 MINIMUM-FOOTER-SPACE PIC 99 VALUE 10. 05 PREFERRED-FOOTER-SPACE PIC 99 VALUE 15. 05 EMERGENCY-BREAK-LINE PIC 99 VALUE 50. 01 CONTENT-ANALYSIS. 05 DETAIL-COMPLEXITY PIC 9 VALUE 1. 88 SIMPLE-DETAILS VALUE 1. 88 COMPLEX-DETAILS VALUE 2. 88 VERY-COMPLEX-DETAILS VALUE 3. 05 FOOTER-REQUIREMENTS PIC 99 VALUE 5. 05 SPECIAL-NOTES-COUNT PIC 99 VALUE ZERO. 01 PAGE-OPTIMIZATION. 05 OPTIMAL-BREAK-POINT PIC 99. 05 CONTENT-DENSITY PIC 99V99 COMP-3. 05 READABILITY-FACTOR PIC 99V99 COMP-3. PROCEDURE DIVISION. OPTIMIZE-PAGE-LAYOUT. PERFORM ANALYZE-CONTENT-REQUIREMENTS PERFORM CALCULATE-OPTIMAL-LAYOUT PERFORM GENERATE-OPTIMIZED-PAGES. ANALYZE-CONTENT-REQUIREMENTS. *> Determine content complexity EVALUATE TRUE WHEN WS-DETAIL-FIELD-COUNT < 5 SET SIMPLE-DETAILS TO TRUE MOVE 5 TO FOOTER-REQUIREMENTS WHEN WS-DETAIL-FIELD-COUNT < 10 SET COMPLEX-DETAILS TO TRUE MOVE 8 TO FOOTER-REQUIREMENTS WHEN OTHER SET VERY-COMPLEX-DETAILS TO TRUE MOVE 12 TO FOOTER-REQUIREMENTS END-EVALUATE *> Check for special requirements IF WS-FOOTNOTE-COUNT > 0 ADD WS-FOOTNOTE-COUNT TO FOOTER-REQUIREMENTS END-IF IF WS-LEGAL-DISCLAIMERS > 0 ADD 3 TO FOOTER-REQUIREMENTS END-IF. CALCULATE-OPTIMAL-LAYOUT. *> Calculate best break point COMPUTE OPTIMAL-BREAK-POINT = LOGICAL-PAGE-SIZE - FOOTER-REQUIREMENTS - 2 *> Ensure minimum readability IF OPTIMAL-BREAK-POINT < EMERGENCY-BREAK-LINE MOVE EMERGENCY-BREAK-LINE TO OPTIMAL-BREAK-POINT PERFORM COMPRESS-FOOTER-CONTENT END-IF *> Calculate content density COMPUTE CONTENT-DENSITY = (OPTIMAL-BREAK-POINT - HEADER-LINES) / LOGICAL-PAGE-SIZE. GENERATE-OPTIMIZED-PAGES. PERFORM UNTIL END-OF-INPUT-DATA PERFORM RESET-PAGE-COUNTERS PERFORM WRITE-ADAPTIVE-HEADER PERFORM VARYING CURRENT-LINE FROM 1 BY 1 UNTIL CURRENT-LINE >= OPTIMAL-BREAK-POINT OR END-OF-INPUT-DATA OR SPECIAL-BREAK-REQUIRED PERFORM PROCESS-DETAIL-LINE PERFORM CHECK-SPECIAL-CONDITIONS END-PERFORM PERFORM WRITE-ADAPTIVE-FOOTER IF NOT END-OF-INPUT-DATA PERFORM ADVANCE-TO-NEW-PAGE END-IF END-PERFORM. CHECK-SPECIAL-CONDITIONS. *> Check if we need special page break IF WS-RECORD-TYPE = "SECTION-BREAK" SET SPECIAL-BREAK-REQUIRED TO TRUE PERFORM WRITE-SECTION-FOOTER END-IF *> Check for table overflow IF WS-TABLE-ROW-COUNT > WS-MAX-TABLE-ROWS SET SPECIAL-BREAK-REQUIRED TO TRUE PERFORM WRITE-TABLE-CONTINUATION-NOTE END-IF. WRITE-ADAPTIVE-FOOTER. *> Calculate available footer space COMPUTE WS-AVAILABLE-SPACE = LOGICAL-PAGE-SIZE - CURRENT-LINE - HEADER-LINES EVALUATE TRUE WHEN WS-AVAILABLE-SPACE >= PREFERRED-FOOTER-SPACE PERFORM WRITE-FULL-FOOTER WHEN WS-AVAILABLE-SPACE >= MINIMUM-FOOTER-SPACE PERFORM WRITE-STANDARD-FOOTER WHEN OTHER PERFORM WRITE-MINIMAL-FOOTER END-EVALUATE.
Use BOTTOM for consistent footer placement in financial statements, balance sheets, and accounting reports with totals and signatures.
Control page breaks in inventory reports to ensure product categories don't split across pages inappropriately.
Maintain proper footer spacing for legal disclaimers, signatures, and regulatory compliance information.
Ensure consistent layout in customer billing statements with proper space for payment instructions and contact info.
BOTTOM defines the bottom margin, while FOOTING specifies the line number where footings should begin. FOOTING must be within the BOTTOM margin area.
BOTTOM is typically defined at file definition time and remains constant. For dynamic control, use programmatic line counting and conditional logic.
Content that exceeds the BOTTOM margin may cause automatic page breaks or print into the margin area, depending on the system configuration.