MainframeMaster

COBOL Tutorial

COBOL BOTTOM Clause

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.

Understanding BOTTOM Clause

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.

Key Applications:

  • Report page layout and formatting
  • Footer placement and positioning
  • Page break control and management
  • White space optimization
  • Professional document presentation
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
ENVIRONMENT 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.

Page Layout Control

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
*> 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.

Advanced Report Formatting

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
*> 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.

Dynamic Page Management

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
*> 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.

Best Practices

BOTTOM Clause Guidelines:

  • Reserve adequate space for footers and page numbers
  • Consider printer margins and paper size constraints
  • Use consistent spacing throughout the report
  • Plan for variable content length and overflow
  • Test page layout with different data volumes
  • Implement proper page break logic
  • Include error handling for page overflow
  • Optimize for both screen and print display

Common Use Cases

Financial Reports

Use BOTTOM for consistent footer placement in financial statements, balance sheets, and accounting reports with totals and signatures.

Inventory Lists

Control page breaks in inventory reports to ensure product categories don't split across pages inappropriately.

Legal Documents

Maintain proper footer spacing for legal disclaimers, signatures, and regulatory compliance information.

Customer Statements

Ensure consistent layout in customer billing statements with proper space for payment instructions and contact info.

FAQ

Q: How does BOTTOM interact with FOOTING?

BOTTOM defines the bottom margin, while FOOTING specifies the line number where footings should begin. FOOTING must be within the BOTTOM margin area.

Q: Can BOTTOM be changed dynamically?

BOTTOM is typically defined at file definition time and remains constant. For dynamic control, use programmatic line counting and conditional logic.

Q: What happens if content exceeds the BOTTOM margin?

Content that exceeds the BOTTOM margin may cause automatic page breaks or print into the margin area, depending on the system configuration.