MainframeMaster

COBOL Tutorial

COBOL ADVANCING Clause

The ADVANCING clause represents one of COBOL's most essential and sophisticated output formatting mechanisms, serving as the primary tool for controlling line spacing, page management, and precise report formatting in business applications. Far more than a simple line control directive, the ADVANCING clause embodies COBOL's comprehensive approach to output presentation by providing precise control over vertical positioning, page breaks, line advancement, and complex formatting patterns that enable applications to generate professional-quality reports and documents while maintaining the precision and consistency characteristics that make COBOL ideal for enterprise reporting environments requiring sophisticated output formatting capabilities.

In enterprise computing environments, the ADVANCING clause serves as a critical foundation for advanced report generation, enabling developers to create sophisticated business applications that handle complex formatting requirements, multi-page reports, detailed financial statements, and professional document layouts. Its capabilities extend far beyond simple line spacing to encompass sophisticated page management, conditional formatting, dynamic spacing control, and integration with modern printing systems that are essential for applications requiring professional-quality output and comprehensive document formatting capabilities.

ADVANCING Clause Syntax and Usage

Basic ADVANCING Syntax

cobol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
*> Basic line advancement WRITE REPORT-LINE AFTER ADVANCING 1 LINE. *> Multiple line advancement WRITE REPORT-LINE AFTER ADVANCING 3 LINES. *> Page advancement WRITE REPORT-LINE AFTER ADVANCING PAGE. *> No advancement WRITE REPORT-LINE AFTER ADVANCING 0 LINES. *> Before advancing (less common) WRITE REPORT-LINE BEFORE ADVANCING 2 LINES.

Basic ADVANCING syntax for controlling line spacing and page breaks in output.

ADVANCING with Variables

cobol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
*> Using variables for dynamic spacing 01 WS-LINE-SPACING PIC 9(2) VALUE 1. 01 WS-PAGE-BREAK PIC X(5) VALUE "PAGE". *> Variable line advancement WRITE REPORT-LINE AFTER ADVANCING WS-LINE-SPACING LINES. *> Conditional spacing IF DETAIL-TYPE = "HEADER" MOVE 2 TO WS-LINE-SPACING ELSE MOVE 1 TO WS-LINE-SPACING END-IF. WRITE REPORT-LINE AFTER ADVANCING WS-LINE-SPACING LINES. *> Page break using variable WRITE REPORT-LINE AFTER ADVANCING WS-PAGE-BREAK.

ADVANCING with variables enables dynamic spacing control based on runtime conditions.

ADVANCING in Report Generation

cobol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
*> Report header with page break WRITE REPORT-HEADER AFTER ADVANCING PAGE. *> Column headers with spacing WRITE COLUMN-HEADERS AFTER ADVANCING 2 LINES. *> Detail lines with single spacing WRITE DETAIL-LINE AFTER ADVANCING 1 LINE. *> Summary section with extra spacing WRITE SUMMARY-LINE AFTER ADVANCING 3 LINES. *> Footer at bottom of page WRITE PAGE-FOOTER BEFORE ADVANCING PAGE.

ADVANCING in report generation provides precise control over document layout and formatting.

Comprehensive Example

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
IDENTIFICATION DIVISION. PROGRAM-ID. ADVANCING-DEMO. ENVIRONMENT DIVISION. INPUT-OUTPUT SECTION. FILE-CONTROL. SELECT CUSTOMER-FILE ASSIGN TO "CUSTOMERS.DAT" ORGANIZATION IS SEQUENTIAL FILE STATUS IS WS-CUST-STATUS. SELECT REPORT-FILE ASSIGN TO "CUSTOMER-REPORT.TXT" ORGANIZATION IS LINE SEQUENTIAL FILE STATUS IS WS-REPORT-STATUS. DATA DIVISION. FILE SECTION. FD CUSTOMER-FILE. 01 CUSTOMER-RECORD. 05 CUST-ID PIC X(10). 05 CUST-NAME PIC X(30). 05 CUST-BALANCE PIC S9(8)V99. 05 CUST-REGION PIC X(10). 05 CUST-STATUS PIC X(10). FD REPORT-FILE. 01 REPORT-RECORD PIC X(132). WORKING-STORAGE SECTION. *> File status variables 01 WS-CUST-STATUS PIC X(2). 88 CUST-SUCCESS VALUE "00". 88 CUST-EOF VALUE "10". 01 WS-REPORT-STATUS PIC X(2). 88 REPORT-SUCCESS VALUE "00". *> Report formatting variables 01 REPORT-LINES. 05 REPORT-HEADER. 10 FILLER PIC X(45) VALUE SPACES. 10 FILLER PIC X(42) VALUE "CUSTOMER BALANCE REPORT". 10 FILLER PIC X(45) VALUE SPACES. 05 PAGE-HEADER. 10 FILLER PIC X(10) VALUE "PAGE: ". 10 PAGE-NUMBER PIC ZZ9. 10 FILLER PIC X(50) VALUE SPACES. 10 FILLER PIC X(10) VALUE "DATE: ". 10 CURRENT-DATE PIC X(10). 10 FILLER PIC X(39) VALUE SPACES. 05 COLUMN-HEADERS. 10 FILLER PIC X(12) VALUE "CUSTOMER ID". 10 FILLER PIC X(32) VALUE "CUSTOMER NAME". 10 FILLER PIC X(15) VALUE "BALANCE". 10 FILLER PIC X(12) VALUE "REGION". 10 FILLER PIC X(12) VALUE "STATUS". 10 FILLER PIC X(49) VALUE SPACES. 05 UNDERLINE. 10 FILLER PIC X(11) VALUE ALL "-". 10 FILLER PIC X(1) VALUE SPACE. 10 FILLER PIC X(30) VALUE ALL "-". 10 FILLER PIC X(1) VALUE SPACE. 10 FILLER PIC X(13) VALUE ALL "-". 10 FILLER PIC X(1) VALUE SPACE. 10 FILLER PIC X(10) VALUE ALL "-". 10 FILLER PIC X(1) VALUE SPACE. 10 FILLER PIC X(10) VALUE ALL "-". 10 FILLER PIC X(54) VALUE SPACES. 05 DETAIL-LINE. 10 DL-CUST-ID PIC X(11). 10 FILLER PIC X(1) VALUE SPACE. 10 DL-CUST-NAME PIC X(30). 10 FILLER PIC X(1) VALUE SPACE. 10 DL-BALANCE PIC $$,$$$,$$9.99. 10 FILLER PIC X(1) VALUE SPACE. 10 DL-REGION PIC X(10). 10 FILLER PIC X(1) VALUE SPACE. 10 DL-STATUS PIC X(10). 10 FILLER PIC X(56) VALUE SPACES. 05 REGION-SUMMARY. 10 FILLER PIC X(15) VALUE "REGION TOTAL: ". 10 RS-REGION PIC X(10). 10 FILLER PIC X(5) VALUE SPACES. 10 RS-COUNT PIC ZZ,ZZ9. 10 FILLER PIC X(10) VALUE " customers". 10 FILLER PIC X(5) VALUE SPACES. 10 RS-TOTAL PIC $$$,$$$,$$9.99. 10 FILLER PIC X(57) VALUE SPACES. 05 GRAND-SUMMARY. 10 FILLER PIC X(15) VALUE "GRAND TOTAL: ". 10 FILLER PIC X(15) VALUE SPACES. 10 GS-COUNT PIC ZZ,ZZ9. 10 FILLER PIC X(10) VALUE " customers". 10 FILLER PIC X(5) VALUE SPACES. 10 GS-TOTAL PIC $$$,$$$,$$9.99. 10 FILLER PIC X(57) VALUE SPACES. *> Control variables 01 CONTROL-VARIABLES. 05 WS-PAGE-NUMBER PIC 9(3) VALUE 1. 05 WS-LINES-ON-PAGE PIC 9(3) VALUE 0. 05 WS-MAX-LINES PIC 9(3) VALUE 50. 05 WS-CURRENT-REGION PIC X(10) VALUE SPACES. 05 WS-PREV-REGION PIC X(10) VALUE SPACES. *> Counters and totals 01 ACCUMULATOR-FIELDS. 05 WS-CUSTOMER-COUNT PIC 9(6) VALUE 0. 05 WS-GRAND-TOTAL PIC S9(10)V99 VALUE 0. 05 WS-REGION-COUNT PIC 9(6) VALUE 0. 05 WS-REGION-TOTAL PIC S9(10)V99 VALUE 0. *> Spacing control 01 SPACING-CONTROL. 05 WS-NORMAL-SPACING PIC 9(1) VALUE 1. 05 WS-DOUBLE-SPACING PIC 9(1) VALUE 2. 05 WS-TRIPLE-SPACING PIC 9(1) VALUE 3. PROCEDURE DIVISION. MAIN-PROCESSING. DISPLAY "=== ADVANCING Clause Demonstration ===". DISPLAY " ". PERFORM INITIALIZE-REPORT PERFORM PROCESS-CUSTOMERS PERFORM FINALIZE-REPORT DISPLAY " ". DISPLAY "Report generation completed successfully". STOP RUN. INITIALIZE-REPORT. DISPLAY "1. Initializing Report Generation:". DISPLAY " ===============================". *> Open files OPEN INPUT CUSTOMER-FILE. IF NOT CUST-SUCCESS DISPLAY " ERROR: Could not open customer file" STOP RUN END-IF. OPEN OUTPUT REPORT-FILE. IF NOT REPORT-SUCCESS DISPLAY " ERROR: Could not open report file" STOP RUN END-IF. *> Write report header with page break ACCEPT CURRENT-DATE FROM DATE YYYYMMDD. MOVE WS-PAGE-NUMBER TO PAGE-NUMBER. WRITE REPORT-RECORD FROM REPORT-HEADER AFTER ADVANCING PAGE. ADD 1 TO WS-LINES-ON-PAGE. WRITE REPORT-RECORD FROM PAGE-HEADER AFTER ADVANCING WS-DOUBLE-SPACING. ADD 2 TO WS-LINES-ON-PAGE. WRITE REPORT-RECORD FROM COLUMN-HEADERS AFTER ADVANCING WS-TRIPLE-SPACING. ADD 3 TO WS-LINES-ON-PAGE. WRITE REPORT-RECORD FROM UNDERLINE AFTER ADVANCING WS-NORMAL-SPACING. ADD 1 TO WS-LINES-ON-PAGE. DISPLAY " Report initialized with headers". DISPLAY " ". PROCESS-CUSTOMERS. DISPLAY "2. Processing Customer Records:". DISPLAY " =============================". PERFORM UNTIL CUST-EOF READ CUSTOMER-FILE IF CUST-SUCCESS PERFORM PROCESS-CUSTOMER-RECORD END-IF END-PERFORM. *> Print final region summary if needed IF WS-REGION-COUNT > 0 PERFORM PRINT-REGION-SUMMARY END-IF. DISPLAY " Customer processing completed". DISPLAY " Total customers processed: " WS-CUSTOMER-COUNT. DISPLAY " ". PROCESS-CUSTOMER-RECORD. *> Check for region break MOVE CUST-REGION TO WS-CURRENT-REGION. IF WS-PREV-REGION NOT = SPACES AND WS-CURRENT-REGION NOT = WS-PREV-REGION PERFORM PRINT-REGION-SUMMARY PERFORM CHECK-PAGE-BREAK END-IF. *> Check if page break needed PERFORM CHECK-PAGE-BREAK. *> Format and print detail line MOVE CUST-ID TO DL-CUST-ID. MOVE CUST-NAME TO DL-CUST-NAME. MOVE CUST-BALANCE TO DL-BALANCE. MOVE CUST-REGION TO DL-REGION. MOVE CUST-STATUS TO DL-STATUS. WRITE REPORT-RECORD FROM DETAIL-LINE AFTER ADVANCING WS-NORMAL-SPACING. ADD 1 TO WS-LINES-ON-PAGE. *> Update accumulators ADD 1 TO WS-CUSTOMER-COUNT WS-REGION-COUNT. ADD CUST-BALANCE TO WS-GRAND-TOTAL WS-REGION-TOTAL. MOVE WS-CURRENT-REGION TO WS-PREV-REGION. PRINT-REGION-SUMMARY. *> Print region summary with extra spacing MOVE WS-PREV-REGION TO RS-REGION. MOVE WS-REGION-COUNT TO RS-COUNT. MOVE WS-REGION-TOTAL TO RS-TOTAL. WRITE REPORT-RECORD FROM REGION-SUMMARY AFTER ADVANCING WS-DOUBLE-SPACING. ADD 2 TO WS-LINES-ON-PAGE. *> Reset region accumulators MOVE 0 TO WS-REGION-COUNT WS-REGION-TOTAL. CHECK-PAGE-BREAK. *> Check if we need a new page IF WS-LINES-ON-PAGE >= WS-MAX-LINES PERFORM START-NEW-PAGE END-IF. START-NEW-PAGE. *> Start new page with headers ADD 1 TO WS-PAGE-NUMBER. MOVE WS-PAGE-NUMBER TO PAGE-NUMBER. WRITE REPORT-RECORD FROM REPORT-HEADER AFTER ADVANCING PAGE. WRITE REPORT-RECORD FROM PAGE-HEADER AFTER ADVANCING WS-DOUBLE-SPACING. WRITE REPORT-RECORD FROM COLUMN-HEADERS AFTER ADVANCING WS-TRIPLE-SPACING. WRITE REPORT-RECORD FROM UNDERLINE AFTER ADVANCING WS-NORMAL-SPACING. MOVE 7 TO WS-LINES-ON-PAGE. FINALIZE-REPORT. DISPLAY "3. Finalizing Report:". DISPLAY " ===================". *> Print grand summary with extra spacing MOVE WS-CUSTOMER-COUNT TO GS-COUNT. MOVE WS-GRAND-TOTAL TO GS-TOTAL. WRITE REPORT-RECORD FROM GRAND-SUMMARY AFTER ADVANCING WS-TRIPLE-SPACING. *> Print end of report marker MOVE ALL "=" TO REPORT-RECORD. WRITE REPORT-RECORD AFTER ADVANCING WS-DOUBLE-SPACING. *> Close files CLOSE CUSTOMER-FILE REPORT-FILE. DISPLAY " Report finalized successfully". DISPLAY " Total pages: " WS-PAGE-NUMBER.

Best Practices and Guidelines

Recommended Practices

  • Use AFTER ADVANCING for consistent line control
  • Implement page break logic for multi-page reports
  • Use variables for dynamic spacing control
  • Maintain consistent spacing patterns throughout reports
  • Use PAGE advancement for clear page separation
  • Plan line counting to prevent page overflow
  • Test output formatting with different line lengths
  • Document spacing conventions for maintenance

Common Pitfalls

  • Inconsistent line spacing affecting report readability
  • Not tracking line counts leading to page overflow
  • Forgetting to reset line counters after page breaks
  • Using BEFORE ADVANCING incorrectly in some systems
  • Not handling variable spacing based on content type
  • Poor page break placement breaking logical sections
  • Not testing output with different page sizes
  • Hardcoding spacing values instead of using variables

Related COBOL Concepts

  • WRITE - Output statement that uses ADVANCING clause
  • AFTER/BEFORE - Timing qualifiers for advancement
  • PAGE - Page break specification
  • LINES - Line count specification for advancement
  • LINE SEQUENTIAL - File organization for text output
  • FD - File description for output files
  • LINAGE - Page size and margin control
  • REPORT WRITER - Advanced report generation features