MainframeMaster

COBOL Tutorial

COBOL END-OF-PAGE (EOP)

The END-OF-PAGE condition, also known as EOP, represents a fundamental component of report generation and formatted output processing in COBOL. This condition is automatically triggered when the LINAGE mechanism detects that the current page has reached its defined capacity, enabling sophisticated page break handling, report formatting, and structured document generation. END-OF-PAGE embodies modern report processing principles by providing automatic pagination control, enabling complex report layouts, and supporting the development of professional-quality business reports and documents.

In contemporary enterprise COBOL development, END-OF-PAGE plays a vital role in creating sophisticated reporting systems that must handle complex formatting requirements, multi-section reports, and professional document layouts. The automatic detection of page boundaries enables developers to implement comprehensive report generation logic while maintaining consistent formatting and ensuring that reports meet business presentation standards and regulatory requirements.

Understanding END-OF-PAGE Architecture

The END-OF-PAGE condition implements sophisticated page management for report generation operations. This architecture works in conjunction with the LINAGE clause to automatically detect when a page has reached its capacity, triggering page break processing, header and footer generation, and continuation of report content on new pages. The automatic nature of END-OF-PAGE detection ensures consistent report formatting without manual page counting.

The architectural design of END-OF-PAGE reflects the evolution of COBOL toward sophisticated report generation capabilities that emphasize professional formatting, consistent layouts, and automated pagination. When combined with LINAGE specifications, END-OF-PAGE creates a comprehensive framework for handling complex report structures including headers, footers, body sections, and page transitions.

END-OF-PAGE also plays a crucial role in memory management and output buffering. Modern COBOL implementations can optimize report generation when page boundaries are automatically managed, leading to more efficient output processing and better resource utilization in high-volume report generation scenarios.

Report Generation Patterns

END-OF-PAGE enables the implementation of sophisticated report generation patterns that are essential for enterprise business applications. These patterns include multi-section reports with automatic pagination, financial statements with complex formatting requirements, and regulatory reports that must meet specific layout and presentation standards.

The automatic triggering of END-OF-PAGE conditions creates powerful report processing frameworks that can handle various formatting scenarios, page break requirements, and content continuation while maintaining professional presentation standards and ensuring consistent document layout across different report types and business requirements.

Basic END-OF-PAGE Usage

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
IDENTIFICATION DIVISION. PROGRAM-ID. END-OF-PAGE-DEMO. ENVIRONMENT DIVISION. INPUT-OUTPUT SECTION. FILE-CONTROL. SELECT EMPLOYEE-FILE ASSIGN TO 'EMPLOYEES.DAT' ORGANIZATION IS SEQUENTIAL ACCESS MODE IS SEQUENTIAL. SELECT REPORT-FILE ASSIGN TO 'EMPLOYEE-REPORT.TXT' ORGANIZATION IS SEQUENTIAL ACCESS MODE IS SEQUENTIAL. DATA DIVISION. FILE SECTION. FD EMPLOYEE-FILE. 01 EMPLOYEE-RECORD. 05 EMPLOYEE-ID PIC X(10). 05 EMPLOYEE-NAME PIC X(30). 05 EMPLOYEE-DEPARTMENT PIC X(15). 05 EMPLOYEE-SALARY PIC 9(7)V99. FD REPORT-FILE LINAGE IS 50 LINES WITH FOOTING AT 45 LINES AT TOP 5 LINES AT BOTTOM 3. 01 REPORT-LINE PIC X(132). WORKING-STORAGE SECTION. 01 REPORT-CONTROLS. 05 PAGE-NUMBER PIC 9(3) VALUE 1. 05 LINE-COUNT PIC 9(3) VALUE 0. 05 EMPLOYEE-COUNT PIC 9(5) VALUE 0. 05 TOTAL-SALARY PIC 9(11)V99 VALUE 0. 01 REPORT-HEADERS. 05 MAIN-HEADER. 10 FILLER PIC X(50) VALUE SPACES. 10 FILLER PIC X(32) VALUE 'EMPLOYEE SALARY REPORT'. 10 FILLER PIC X(50) VALUE SPACES. 05 PAGE-HEADER. 10 FILLER PIC X(10) VALUE 'PAGE: '. 10 PAGE-NUM-OUT PIC ZZ9. 10 FILLER PIC X(119) VALUE SPACES. 05 COLUMN-HEADER. 10 FILLER PIC X(12) VALUE 'EMPLOYEE ID'. 10 FILLER PIC X(32) VALUE 'EMPLOYEE NAME'. 10 FILLER PIC X(17) VALUE 'DEPARTMENT'. 10 FILLER PIC X(15) VALUE 'SALARY'. 10 FILLER PIC X(56) VALUE SPACES. 01 DETAIL-LINE. 05 DETAIL-EMP-ID PIC X(12). 05 DETAIL-EMP-NAME PIC X(32). 05 DETAIL-DEPARTMENT PIC X(17). 05 DETAIL-SALARY PIC $$$,$$$,$$9.99. 05 FILLER PIC X(56) VALUE SPACES. 01 FOOTER-LINE. 05 FILLER PIC X(20) VALUE 'TOTAL EMPLOYEES: '. 05 FOOTER-COUNT PIC ZZ,ZZ9. 05 FILLER PIC X(10) VALUE SPACES. 05 FILLER PIC X(15) VALUE 'TOTAL SALARY: '. 05 FOOTER-TOTAL PIC $$$,$$$,$$$,$$9.99. 05 FILLER PIC X(60) VALUE SPACES. PROCEDURE DIVISION. MAIN-PROCESSING. OPEN INPUT EMPLOYEE-FILE OPEN OUTPUT REPORT-FILE PERFORM WRITE-REPORT-HEADERS PERFORM PROCESS-EMPLOYEE-RECORDS PERFORM WRITE-REPORT-TOTALS CLOSE EMPLOYEE-FILE CLOSE REPORT-FILE DISPLAY 'Report generation completed' DISPLAY 'Total pages: ' PAGE-NUMBER DISPLAY 'Total employees: ' EMPLOYEE-COUNT STOP RUN. WRITE-REPORT-HEADERS. MOVE MAIN-HEADER TO REPORT-LINE WRITE REPORT-LINE AT END-OF-PAGE PERFORM PAGE-BREAK-PROCESSING END-WRITE MOVE PAGE-NUMBER TO PAGE-NUM-OUT MOVE PAGE-HEADER TO REPORT-LINE WRITE REPORT-LINE AT END-OF-PAGE PERFORM PAGE-BREAK-PROCESSING END-WRITE MOVE SPACES TO REPORT-LINE WRITE REPORT-LINE AT END-OF-PAGE PERFORM PAGE-BREAK-PROCESSING END-WRITE MOVE COLUMN-HEADER TO REPORT-LINE WRITE REPORT-LINE AT END-OF-PAGE PERFORM PAGE-BREAK-PROCESSING END-WRITE MOVE ALL '-' TO REPORT-LINE WRITE REPORT-LINE AT END-OF-PAGE PERFORM PAGE-BREAK-PROCESSING END-WRITE. PROCESS-EMPLOYEE-RECORDS. READ EMPLOYEE-FILE AT END DISPLAY 'All employee records processed' NOT AT END PERFORM UNTIL EMPLOYEE-FILE AT END PERFORM WRITE-EMPLOYEE-DETAIL READ EMPLOYEE-FILE AT END CONTINUE END-READ END-PERFORM END-READ. WRITE-EMPLOYEE-DETAIL. ADD 1 TO EMPLOYEE-COUNT ADD EMPLOYEE-SALARY TO TOTAL-SALARY MOVE EMPLOYEE-ID TO DETAIL-EMP-ID MOVE EMPLOYEE-NAME TO DETAIL-EMP-NAME MOVE EMPLOYEE-DEPARTMENT TO DETAIL-DEPARTMENT MOVE EMPLOYEE-SALARY TO DETAIL-SALARY MOVE DETAIL-LINE TO REPORT-LINE WRITE REPORT-LINE AT END-OF-PAGE PERFORM PAGE-BREAK-PROCESSING PERFORM WRITE-REPORT-HEADERS END-WRITE. PAGE-BREAK-PROCESSING. *> This paragraph is executed when END-OF-PAGE condition occurs DISPLAY 'Page ' PAGE-NUMBER ' completed' ADD 1 TO PAGE-NUMBER *> Write page footer if needed MOVE SPACES TO REPORT-LINE WRITE REPORT-LINE AFTER ADVANCING PAGE DISPLAY 'Starting page ' PAGE-NUMBER. WRITE-REPORT-TOTALS. *> Write summary totals at end of report MOVE SPACES TO REPORT-LINE WRITE REPORT-LINE AT END-OF-PAGE PERFORM PAGE-BREAK-PROCESSING END-WRITE MOVE ALL '=' TO REPORT-LINE WRITE REPORT-LINE AT END-OF-PAGE PERFORM PAGE-BREAK-PROCESSING END-WRITE MOVE EMPLOYEE-COUNT TO FOOTER-COUNT MOVE TOTAL-SALARY TO FOOTER-TOTAL MOVE FOOTER-LINE TO REPORT-LINE WRITE REPORT-LINE AT END-OF-PAGE PERFORM PAGE-BREAK-PROCESSING END-WRITE.

Advanced END-OF-PAGE Patterns

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
IDENTIFICATION DIVISION. PROGRAM-ID. ADVANCED-END-OF-PAGE. ENVIRONMENT DIVISION. INPUT-OUTPUT SECTION. FILE-CONTROL. SELECT SALES-FILE ASSIGN TO 'SALES.DAT' ORGANIZATION IS SEQUENTIAL. SELECT DETAILED-REPORT ASSIGN TO 'DETAILED-SALES.RPT' ORGANIZATION IS SEQUENTIAL. SELECT SUMMARY-REPORT ASSIGN TO 'SUMMARY-SALES.RPT' ORGANIZATION IS SEQUENTIAL. DATA DIVISION. FILE SECTION. FD SALES-FILE. 01 SALES-RECORD. 05 SALE-DATE PIC X(10). 05 SALESPERSON-ID PIC X(10). 05 SALESPERSON-NAME PIC X(30). 05 CUSTOMER-ID PIC X(15). 05 PRODUCT-CODE PIC X(10). 05 QUANTITY-SOLD PIC 9(5). 05 UNIT-PRICE PIC 9(7)V99. 05 SALE-AMOUNT PIC 9(9)V99. 05 COMMISSION-RATE PIC V999. FD DETAILED-REPORT LINAGE IS 60 LINES WITH FOOTING AT 55 LINES AT TOP 8 LINES AT BOTTOM 5. 01 DETAIL-REPORT-LINE PIC X(150). FD SUMMARY-REPORT LINAGE IS 45 LINES WITH FOOTING AT 40 LINES AT TOP 6 LINES AT BOTTOM 4. 01 SUMMARY-REPORT-LINE PIC X(120). WORKING-STORAGE SECTION. 01 REPORT-CONTROLS. 05 DETAIL-PAGE-NUMBER PIC 9(4) VALUE 1. 05 SUMMARY-PAGE-NUMBER PIC 9(4) VALUE 1. 05 CURRENT-SALESPERSON PIC X(10) VALUE SPACES. 05 SALESPERSON-TOTAL PIC 9(11)V99 VALUE 0. 05 GRAND-TOTAL PIC 9(13)V99 VALUE 0. 05 RECORD-COUNT PIC 9(7) VALUE 0. 01 CONTROL-BREAK-FLAGS. 05 FIRST-RECORD-FLAG PIC X VALUE 'Y'. 88 FIRST-RECORD VALUE 'Y'. 05 SALESPERSON-BREAK-FLAG PIC X VALUE 'N'. 88 SALESPERSON-BREAK VALUE 'Y'. 01 DETAILED-REPORT-FORMATS. 05 DETAIL-MAIN-HEADER. 10 FILLER PIC X(60) VALUE SPACES. 10 FILLER PIC X(30) VALUE 'DETAILED SALES REPORT'. 10 FILLER PIC X(60) VALUE SPACES. 05 DETAIL-PAGE-HEADER. 10 FILLER PIC X(10) VALUE 'PAGE: '. 10 DETAIL-PAGE-NUM PIC ZZZ9. 10 FILLER PIC X(50) VALUE SPACES. 10 FILLER PIC X(15) VALUE 'REPORT DATE: '. 10 DETAIL-REPORT-DATE PIC X(10). 10 FILLER PIC X(61) VALUE SPACES. 05 DETAIL-COLUMN-HEADER1. 10 FILLER PIC X(12) VALUE 'SALE DATE'. 10 FILLER PIC X(12) VALUE 'SALES ID'. 10 FILLER PIC X(32) VALUE 'SALESPERSON NAME'. 10 FILLER PIC X(17) VALUE 'CUSTOMER ID'. 10 FILLER PIC X(12) VALUE 'PRODUCT'. 10 FILLER PIC X(10) VALUE 'QUANTITY'. 10 FILLER PIC X(15) VALUE 'UNIT PRICE'. 10 FILLER PIC X(15) VALUE 'SALE AMOUNT'. 10 FILLER PIC X(25) VALUE SPACES. 05 DETAIL-SALES-LINE. 10 DETAIL-SALE-DATE PIC X(12). 10 DETAIL-SALES-ID PIC X(12). 10 DETAIL-SALES-NAME PIC X(32). 10 DETAIL-CUSTOMER PIC X(17). 10 DETAIL-PRODUCT PIC X(12). 10 DETAIL-QUANTITY PIC ZZ,ZZ9. 10 FILLER PIC X(4) VALUE SPACES. 10 DETAIL-UNIT-PRICE PIC $$$,$$9.99. 10 FILLER PIC X(1) VALUE SPACES. 10 DETAIL-SALE-AMT PIC $$$,$$$,$$9.99. 10 FILLER PIC X(10) VALUE SPACES. 05 DETAIL-SUBTOTAL-LINE. 10 FILLER PIC X(70) VALUE SPACES. 10 FILLER PIC X(20) VALUE 'SUBTOTAL FOR: '. 10 SUBTOTAL-SALESPERSON PIC X(30). 10 SUBTOTAL-AMOUNT PIC $$$,$$$,$$$,$$9.99. 10 FILLER PIC X(15) VALUE SPACES. 01 SUMMARY-REPORT-FORMATS. 05 SUMMARY-MAIN-HEADER. 10 FILLER PIC X(45) VALUE SPACES. 10 FILLER PIC X(30) VALUE 'SALES SUMMARY REPORT'. 10 FILLER PIC X(45) VALUE SPACES. 05 SUMMARY-SALESPERSON-LINE. 10 SUMMARY-SALES-NAME PIC X(35). 10 SUMMARY-RECORD-COUNT PIC ZZ,ZZ9. 10 FILLER PIC X(10) VALUE SPACES. 10 SUMMARY-SALES-TOTAL PIC $$$,$$$,$$$,$$9.99. 10 FILLER PIC X(50) VALUE SPACES. PROCEDURE DIVISION. MAIN-PROCESSING. OPEN INPUT SALES-FILE OPEN OUTPUT DETAILED-REPORT OPEN OUTPUT SUMMARY-REPORT MOVE FUNCTION CURRENT-DATE(1:8) TO DETAIL-REPORT-DATE PERFORM WRITE-DETAILED-HEADERS PERFORM WRITE-SUMMARY-HEADERS PERFORM PROCESS-SALES-RECORDS PERFORM WRITE-FINAL-TOTALS CLOSE SALES-FILE CLOSE DETAILED-REPORT CLOSE SUMMARY-REPORT DISPLAY 'Multi-report generation completed' DISPLAY 'Detail report pages: ' DETAIL-PAGE-NUMBER DISPLAY 'Summary report pages: ' SUMMARY-PAGE-NUMBER STOP RUN. WRITE-DETAILED-HEADERS. MOVE DETAIL-MAIN-HEADER TO DETAIL-REPORT-LINE WRITE DETAIL-REPORT-LINE AT END-OF-PAGE PERFORM DETAIL-PAGE-BREAK END-WRITE MOVE DETAIL-PAGE-NUMBER TO DETAIL-PAGE-NUM MOVE DETAIL-PAGE-HEADER TO DETAIL-REPORT-LINE WRITE DETAIL-REPORT-LINE AT END-OF-PAGE PERFORM DETAIL-PAGE-BREAK END-WRITE MOVE SPACES TO DETAIL-REPORT-LINE WRITE DETAIL-REPORT-LINE AT END-OF-PAGE PERFORM DETAIL-PAGE-BREAK END-WRITE MOVE DETAIL-COLUMN-HEADER1 TO DETAIL-REPORT-LINE WRITE DETAIL-REPORT-LINE AT END-OF-PAGE PERFORM DETAIL-PAGE-BREAK END-WRITE MOVE ALL '=' TO DETAIL-REPORT-LINE WRITE DETAIL-REPORT-LINE AT END-OF-PAGE PERFORM DETAIL-PAGE-BREAK END-WRITE. WRITE-SUMMARY-HEADERS. MOVE SUMMARY-MAIN-HEADER TO SUMMARY-REPORT-LINE WRITE SUMMARY-REPORT-LINE AT END-OF-PAGE PERFORM SUMMARY-PAGE-BREAK END-WRITE MOVE SPACES TO SUMMARY-REPORT-LINE WRITE SUMMARY-REPORT-LINE AT END-OF-PAGE PERFORM SUMMARY-PAGE-BREAK END-WRITE. PROCESS-SALES-RECORDS. READ SALES-FILE AT END IF NOT FIRST-RECORD PERFORM WRITE-SALESPERSON-SUBTOTAL END-IF NOT AT END PERFORM UNTIL SALES-FILE AT END PERFORM CHECK-CONTROL-BREAK PERFORM WRITE-SALES-DETAIL PERFORM ACCUMULATE-TOTALS READ SALES-FILE AT END PERFORM WRITE-SALESPERSON-SUBTOTAL END-READ END-PERFORM END-READ. CHECK-CONTROL-BREAK. IF FIRST-RECORD MOVE SALESPERSON-ID TO CURRENT-SALESPERSON SET FIRST-RECORD TO FALSE ELSE IF SALESPERSON-ID NOT = CURRENT-SALESPERSON PERFORM WRITE-SALESPERSON-SUBTOTAL PERFORM WRITE-SUMMARY-LINE MOVE SALESPERSON-ID TO CURRENT-SALESPERSON MOVE 0 TO SALESPERSON-TOTAL END-IF END-IF. WRITE-SALES-DETAIL. MOVE SALE-DATE TO DETAIL-SALE-DATE MOVE SALESPERSON-ID TO DETAIL-SALES-ID MOVE SALESPERSON-NAME TO DETAIL-SALES-NAME MOVE CUSTOMER-ID TO DETAIL-CUSTOMER MOVE PRODUCT-CODE TO DETAIL-PRODUCT MOVE QUANTITY-SOLD TO DETAIL-QUANTITY MOVE UNIT-PRICE TO DETAIL-UNIT-PRICE MOVE SALE-AMOUNT TO DETAIL-SALE-AMT MOVE DETAIL-SALES-LINE TO DETAIL-REPORT-LINE WRITE DETAIL-REPORT-LINE AT END-OF-PAGE PERFORM DETAIL-PAGE-BREAK PERFORM WRITE-DETAILED-HEADERS END-WRITE. WRITE-SALESPERSON-SUBTOTAL. MOVE SPACES TO DETAIL-REPORT-LINE WRITE DETAIL-REPORT-LINE AT END-OF-PAGE PERFORM DETAIL-PAGE-BREAK PERFORM WRITE-DETAILED-HEADERS END-WRITE MOVE CURRENT-SALESPERSON TO SUBTOTAL-SALESPERSON MOVE SALESPERSON-TOTAL TO SUBTOTAL-AMOUNT MOVE DETAIL-SUBTOTAL-LINE TO DETAIL-REPORT-LINE WRITE DETAIL-REPORT-LINE AT END-OF-PAGE PERFORM DETAIL-PAGE-BREAK PERFORM WRITE-DETAILED-HEADERS END-WRITE MOVE ALL '-' TO DETAIL-REPORT-LINE WRITE DETAIL-REPORT-LINE AT END-OF-PAGE PERFORM DETAIL-PAGE-BREAK PERFORM WRITE-DETAILED-HEADERS END-WRITE. WRITE-SUMMARY-LINE. MOVE SALESPERSON-NAME TO SUMMARY-SALES-NAME MOVE RECORD-COUNT TO SUMMARY-RECORD-COUNT MOVE SALESPERSON-TOTAL TO SUMMARY-SALES-TOTAL MOVE SUMMARY-SALESPERSON-LINE TO SUMMARY-REPORT-LINE WRITE SUMMARY-REPORT-LINE AT END-OF-PAGE PERFORM SUMMARY-PAGE-BREAK PERFORM WRITE-SUMMARY-HEADERS END-WRITE. ACCUMULATE-TOTALS. ADD 1 TO RECORD-COUNT ADD SALE-AMOUNT TO SALESPERSON-TOTAL ADD SALE-AMOUNT TO GRAND-TOTAL. DETAIL-PAGE-BREAK. DISPLAY 'Detail report page ' DETAIL-PAGE-NUMBER ' completed' ADD 1 TO DETAIL-PAGE-NUMBER. SUMMARY-PAGE-BREAK. DISPLAY 'Summary report page ' SUMMARY-PAGE-NUMBER ' completed' ADD 1 TO SUMMARY-PAGE-NUMBER. WRITE-FINAL-TOTALS. *> Write grand total to summary report MOVE SPACES TO SUMMARY-REPORT-LINE WRITE SUMMARY-REPORT-LINE AT END-OF-PAGE PERFORM SUMMARY-PAGE-BREAK END-WRITE MOVE ALL '=' TO SUMMARY-REPORT-LINE WRITE SUMMARY-REPORT-LINE AT END-OF-PAGE PERFORM SUMMARY-PAGE-BREAK END-WRITE STRING 'GRAND TOTAL: ' DELIMITED BY SIZE GRAND-TOTAL DELIMITED BY SIZE INTO SUMMARY-REPORT-LINE END-STRING WRITE SUMMARY-REPORT-LINE AT END-OF-PAGE PERFORM SUMMARY-PAGE-BREAK END-WRITE.

Best Practices and FAQ

Best Practices
  • • Define appropriate LINAGE specifications
  • • Handle page breaks consistently
  • • Implement proper header/footer logic
  • • Use meaningful page numbering
  • • Test with various data volumes
Common Mistakes
  • • Incorrect LINAGE calculations
  • • Missing page break handling
  • • Poor header/footer placement
  • • Inconsistent formatting
  • • Not testing edge cases