MainframeMaster

COBOL Tutorial

COBOL INDICATE Statement

The INDICATE statement represents a specialized report control mechanism within COBOL Report Writer environments, providing advanced formatting capabilities that enable precise line positioning, dynamic page management, and sophisticated control group generation. This statement embodies the principles of structured report formatting by supporting programmatic control over report sections, automatic line advancement, and conditional formatting while maintaining consistent output presentation, ensuring professional report quality, and facilitating complex business reporting requirements across enterprise applications demanding precise document formatting, multi-level control breaks, and comprehensive reporting solutions with optimal readability and structured data presentation.

INDICATE Statement Syntax

Basic INDICATE 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
*> Basic INDICATE syntax INDICATE data-name-1 [, data-name-2, ...] *> Report Writer context REPORT SECTION. RD SALES-REPORT CONTROLS ARE FINAL, REGION, SALESPERSON PAGE LIMIT IS 60 LINES HEADING 1 FIRST DETAIL 10 LAST DETAIL 50 FOOTING 55. 01 PAGE-HEADER TYPE IS PAGE HEADING. 05 LINE NUMBER IS 1. 10 COLUMN 30 PIC X(20) VALUE "SALES SUMMARY REPORT". 01 REGION-HEADER TYPE IS CONTROL HEADING REGION. 05 LINE NUMBER IS PLUS 2. 10 COLUMN 1 PIC X(8) VALUE "REGION: ". 10 COLUMN 10 PIC X(20) SOURCE REGION. 01 DETAIL-LINE TYPE IS DETAIL. 05 LINE NUMBER IS PLUS 1. 10 COLUMN 5 PIC X(15) SOURCE SALESPERSON. 10 COLUMN 25 PIC 9(6).99 SOURCE SALES-AMOUNT. *> Using INDICATE to force control groups PROCEDURE DIVISION. MAIN-PROCESSING. INITIATE SALES-REPORT *> Force region header generation INDICATE REGION *> Process normal detail records PERFORM READ-SALES-DATA PERFORM UNTIL EOF-FLAG = 'Y' GENERATE DETAIL-LINE PERFORM READ-SALES-DATA END-PERFORM *> Force final totals INDICATE FINAL TERMINATE SALES-REPORT.
Report Control
Line Positioning
Formatting

Comprehensive INDICATE Examples

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
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
IDENTIFICATION DIVISION. PROGRAM-ID. INDICATE-REPORT-DEMO. ENVIRONMENT DIVISION. INPUT-OUTPUT SECTION. FILE-CONTROL. SELECT SALES-FILE ASSIGN TO "SALES.DAT" ORGANIZATION IS LINE SEQUENTIAL. SELECT REPORT-FILE ASSIGN TO "REPORT.TXT" ORGANIZATION IS LINE SEQUENTIAL. DATA DIVISION. FILE SECTION. FD SALES-FILE. 01 SALES-RECORD. 05 SR-REGION PIC X(10). 05 SR-DISTRICT PIC X(8). 05 SR-SALESPERSON PIC X(20). 05 SR-PRODUCT PIC X(15). 05 SR-SALES-AMOUNT PIC 9(8)V99. 05 SR-COMMISSION PIC 9(6)V99. 05 SR-SALE-DATE PIC 9(8). FD REPORT-FILE. 01 REPORT-RECORD PIC X(132). WORKING-STORAGE SECTION. 01 WS-FLAGS. 05 WS-EOF-FLAG PIC X VALUE 'N'. 88 EOF-SALES VALUE 'Y'. 05 WS-FIRST-RECORD PIC X VALUE 'Y'. 88 FIRST-TIME VALUE 'Y'. 01 WS-CONTROL-FIELDS. 05 WS-PREV-REGION PIC X(10). 05 WS-PREV-DISTRICT PIC X(8). 05 WS-CURRENT-DATE PIC 9(8). 01 WS-TOTALS. 05 WS-DISTRICT-TOTAL PIC 9(10)V99 VALUE 0. 05 WS-REGION-TOTAL PIC 9(12)V99 VALUE 0. 05 WS-GRAND-TOTAL PIC 9(14)V99 VALUE 0. 05 WS-RECORD-COUNT PIC 9(6) VALUE 0. REPORT SECTION. RD SALES-SUMMARY-REPORT CONTROLS ARE FINAL, SR-REGION, SR-DISTRICT PAGE LIMIT IS 60 LINES HEADING 1 FIRST DETAIL 12 LAST DETAIL 50 FOOTING 55. *> Report page header 01 REPORT-HEADER TYPE IS REPORT HEADING. 05 LINE NUMBER IS 1. 10 COLUMN 1 PIC X(132) VALUE ALL "*". 05 LINE NUMBER IS PLUS 1. 10 COLUMN 50 PIC X(32) VALUE "COMPREHENSIVE SALES ANALYSIS". 05 LINE NUMBER IS PLUS 1. 10 COLUMN 1 PIC X(132) VALUE ALL "*". 05 LINE NUMBER IS PLUS 2. 10 COLUMN 1 PIC X(13) VALUE "REPORT DATE: ". 10 COLUMN 15 PIC 99/99/9999 SOURCE WS-CURRENT-DATE. *> Page header (appears on each page) 01 PAGE-HEADER TYPE IS PAGE HEADING. 05 LINE NUMBER IS 5. 10 COLUMN 1 PIC X(8) VALUE "REGION". 10 COLUMN 15 PIC X(8) VALUE "DISTRICT". 10 COLUMN 30 PIC X(12) VALUE "SALESPERSON". 10 COLUMN 50 PIC X(7) VALUE "PRODUCT". 10 COLUMN 65 PIC X(12) VALUE "SALES AMOUNT". 10 COLUMN 85 PIC X(10) VALUE "COMMISSION". 10 COLUMN 105 PIC X(9) VALUE "SALE DATE". 05 LINE NUMBER IS PLUS 1. 10 COLUMN 1 PIC X(132) VALUE ALL "-". *> Region control header 01 REGION-HEADER TYPE IS CONTROL HEADING SR-REGION. 05 LINE NUMBER IS PLUS 2. 10 COLUMN 1 PIC X(15) VALUE "REGION SUMMARY:". 10 COLUMN 17 PIC X(10) SOURCE SR-REGION. 10 COLUMN 35 PIC X(30) VALUE ALL "=". *> District control header 01 DISTRICT-HEADER TYPE IS CONTROL HEADING SR-DISTRICT. 05 LINE NUMBER IS PLUS 1. 10 COLUMN 5 PIC X(18) VALUE "DISTRICT BREAKDOWN:". 10 COLUMN 24 PIC X(8) SOURCE SR-DISTRICT. *> Detail line 01 SALES-DETAIL TYPE IS DETAIL. 05 LINE NUMBER IS PLUS 1. 10 COLUMN 1 PIC X(10) SOURCE SR-REGION. 10 COLUMN 15 PIC X(8) SOURCE SR-DISTRICT. 10 COLUMN 30 PIC X(20) SOURCE SR-SALESPERSON. 10 COLUMN 50 PIC X(15) SOURCE SR-PRODUCT. 10 COLUMN 65 PIC ZZ,ZZZ,ZZ9.99 SOURCE SR-SALES-AMOUNT. 10 COLUMN 85 PIC Z,ZZZ,ZZ9.99 SOURCE SR-COMMISSION. 10 COLUMN 105 PIC 99/99/9999 SOURCE SR-SALE-DATE. *> District control footer 01 DISTRICT-FOOTER TYPE IS CONTROL FOOTING SR-DISTRICT. 05 LINE NUMBER IS PLUS 1. 10 COLUMN 5 PIC X(20) VALUE "DISTRICT TOTAL:". 10 COLUMN 65 PIC ZZ,ZZZ,ZZ9.99 SUM SR-SALES-AMOUNT. 05 LINE NUMBER IS PLUS 1. 10 COLUMN 5 PIC X(132) VALUE ALL "-". *> Region control footer 01 REGION-FOOTER TYPE IS CONTROL FOOTING SR-REGION. 05 LINE NUMBER IS PLUS 1. 10 COLUMN 1 PIC X(15) VALUE "REGION TOTAL:". 10 COLUMN 65 PIC ZZZ,ZZZ,ZZ9.99 SUM SR-SALES-AMOUNT. 05 LINE NUMBER IS PLUS 2. 10 COLUMN 1 PIC X(60) VALUE ALL "=". *> Final report footer 01 FINAL-FOOTER TYPE IS CONTROL FOOTING FINAL. 05 LINE NUMBER IS PLUS 3. 10 COLUMN 1 PIC X(132) VALUE ALL "*". 05 LINE NUMBER IS PLUS 1. 10 COLUMN 1 PIC X(15) VALUE "GRAND TOTAL:". 10 COLUMN 65 PIC Z,ZZZ,ZZZ,ZZ9.99 SUM SR-SALES-AMOUNT. 05 LINE NUMBER IS PLUS 1. 10 COLUMN 1 PIC X(15) VALUE "TOTAL RECORDS:". 10 COLUMN 20 PIC ZZ,ZZ9 COUNT SR-SALES-AMOUNT. 05 LINE NUMBER IS PLUS 1. 10 COLUMN 1 PIC X(132) VALUE ALL "*". *> Page footer 01 PAGE-FOOTER TYPE IS PAGE FOOTING. 05 LINE NUMBER IS 58. 10 COLUMN 60 PIC X(5) VALUE "PAGE ". 10 COLUMN 66 PIC ZZ9 SOURCE PAGE-COUNTER. PROCEDURE DIVISION. MAIN-PROCESSING. PERFORM INITIALIZE-PROCESSING PERFORM PROCESS-SALES-DATA PERFORM FINALIZE-PROCESSING STOP RUN. INITIALIZE-PROCESSING. DISPLAY "=== INDICATE STATEMENT DEMONSTRATION ===" OPEN INPUT SALES-FILE OPEN OUTPUT REPORT-FILE *> Get current date ACCEPT WS-CURRENT-DATE FROM DATE YYYYMMDD *> Initialize report INITIATE SALES-SUMMARY-REPORT *> Force initial page header using INDICATE DISPLAY "Forcing initial report header generation..." INDICATE FINAL DISPLAY "Report initialized successfully" DISPLAY SPACES. PROCESS-SALES-DATA. DISPLAY "=== PROCESSING SALES DATA WITH INDICATE ===" PERFORM READ-SALES-RECORD PERFORM UNTIL EOF-SALES ADD 1 TO WS-RECORD-COUNT *> Check for control breaks and use INDICATE IF FIRST-TIME MOVE SR-REGION TO WS-PREV-REGION MOVE SR-DISTRICT TO WS-PREV-DISTRICT SET FIRST-TIME TO FALSE *> Force initial region header DISPLAY "Forcing region header for: " SR-REGION INDICATE SR-REGION *> Force initial district header DISPLAY "Forcing district header for: " SR-DISTRICT INDICATE SR-DISTRICT ELSE *> Check for region change IF SR-REGION NOT = WS-PREV-REGION DISPLAY "Region change detected: " WS-PREV-REGION " -> " SR-REGION *> Force region footer for previous region MOVE WS-PREV-REGION TO SR-REGION INDICATE SR-REGION *> Reset to current region and force header MOVE SALES-RECORD TO SALES-RECORD INDICATE SR-REGION MOVE SR-REGION TO WS-PREV-REGION MOVE SR-DISTRICT TO WS-PREV-DISTRICT ELSE *> Check for district change within same region IF SR-DISTRICT NOT = WS-PREV-DISTRICT DISPLAY "District change detected: " WS-PREV-DISTRICT " -> " SR-DISTRICT *> Force district footer for previous district MOVE WS-PREV-DISTRICT TO SR-DISTRICT INDICATE SR-DISTRICT *> Reset to current district and force header MOVE SALES-RECORD TO SALES-RECORD INDICATE SR-DISTRICT MOVE SR-DISTRICT TO WS-PREV-DISTRICT END-IF END-IF END-IF *> Generate detail line GENERATE SALES-DETAIL *> Update totals manually (for demonstration) ADD SR-SALES-AMOUNT TO WS-DISTRICT-TOTAL ADD SR-SALES-AMOUNT TO WS-REGION-TOTAL ADD SR-SALES-AMOUNT TO WS-GRAND-TOTAL PERFORM READ-SALES-RECORD END-PERFORM DISPLAY "Processed " WS-RECORD-COUNT " sales records" DISPLAY "Grand total: $" WS-GRAND-TOTAL DISPLAY SPACES. READ-SALES-RECORD. READ SALES-FILE AT END SET EOF-SALES TO TRUE END-READ. FINALIZE-PROCESSING. DISPLAY "=== FINALIZING REPORT WITH INDICATE ===" *> Force final control group generation DISPLAY "Forcing final totals generation..." INDICATE FINAL *> Terminate report TERMINATE SALES-SUMMARY-REPORT CLOSE SALES-FILE CLOSE REPORT-FILE DISPLAY "Report generation completed" DISPLAY "Output written to REPORT.TXT" DISPLAY SPACES. *> Advanced INDICATE usage examples ADVANCED-INDICATE-PROCESSING. DISPLAY "=== ADVANCED INDICATE TECHNIQUES ===" *> Conditional INDICATE based on business rules IF WS-RECORD-COUNT > 1000 DISPLAY "Large dataset - forcing page break" INDICATE SR-REGION END-IF *> Multiple INDICATE statements for complex formatting IF SR-SALES-AMOUNT > 100000 DISPLAY "High-value sale - forcing special formatting" INDICATE SR-DISTRICT GENERATE SALES-DETAIL INDICATE SR-DISTRICT END-IF. DEMONSTRATE-INDICATE-SCENARIOS. DISPLAY "=== INDICATE USAGE SCENARIOS ===" *> Scenario 1: Force section breaks for readability DISPLAY "Scenario 1: Forcing section breaks" INDICATE SR-REGION *> Scenario 2: Generate summary at specific intervals IF FUNCTION MOD(WS-RECORD-COUNT, 100) = 0 DISPLAY "Every 100 records - generating interim summary" INDICATE SR-DISTRICT END-IF *> Scenario 3: Handle special formatting requirements IF SR-PRODUCT = "PREMIUM-PRODUCT" DISPLAY "Premium product - special formatting" INDICATE SR-DISTRICT GENERATE SALES-DETAIL INDICATE SR-DISTRICT END-IF *> Scenario 4: Error condition handling IF SR-SALES-AMOUNT = 0 DISPLAY "Zero sales amount - forcing attention marker" INDICATE SR-DISTRICT END-IF. MONTHLY-REPORT-PROCESSING. *> Example of INDICATE in monthly reporting DISPLAY "=== MONTHLY REPORT PROCESSING ===" *> Process monthly data with forced breaks PERFORM VARYING WS-MONTH FROM 1 BY 1 UNTIL WS-MONTH > 12 DISPLAY "Processing month " WS-MONTH *> Force month header INDICATE MONTH-CONTROL *> Process month's data PERFORM PROCESS-MONTHLY-SALES *> Force month footer INDICATE MONTH-CONTROL *> Force quarterly breaks IF FUNCTION MOD(WS-MONTH, 3) = 0 DISPLAY "End of quarter - forcing quarterly summary" INDICATE QUARTER-CONTROL END-IF END-PERFORM. CUSTOM-FORMATTING-CONTROL. *> Custom formatting using INDICATE DISPLAY "=== CUSTOM FORMATTING CONTROL ===" *> Dynamic header generation IF WS-RECORD-COUNT = 1 INDICATE SPECIAL-HEADER END-IF *> Conditional footer generation IF END-OF-BATCH INDICATE BATCH-FOOTER END-IF *> Page break control IF LINES-REMAINING < 5 INDICATE PAGE-BREAK END-IF. ERROR-HANDLING-WITH-INDICATE. *> Error handling using INDICATE DISPLAY "=== ERROR HANDLING WITH INDICATE ===" IF INVALID-RECORD DISPLAY "Invalid record detected - forcing error section" INDICATE ERROR-HEADER GENERATE ERROR-DETAIL INDICATE ERROR-FOOTER END-IF IF CONTROL-TOTAL-MISMATCH DISPLAY "Control total mismatch - forcing reconciliation" INDICATE RECONCILIATION-SECTION END-IF.

INDICATE Use Cases

Control Break Processing
  • • Force control group generation
  • • Handle data sequence changes
  • • Generate intermediate summaries
  • • Create section breaks
Report Formatting
  • • Force page breaks
  • • Generate headers/footers
  • • Control line spacing
  • • Special formatting sections

Interactive Tutorial

Hands-On Exercise: Report Control
Practice using INDICATE for report formatting and control breaks

Exercise 1: Basic Control Breaks

cobol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
RD EMPLOYEE-REPORT CONTROLS ARE FINAL, DEPARTMENT PAGE LIMIT IS 55 LINES. 01 DEPT-HEADER TYPE IS CONTROL HEADING DEPARTMENT. 05 LINE PLUS 2. 10 COLUMN 1 PIC X(12) VALUE "DEPARTMENT: ". 10 COLUMN 15 PIC X(15) SOURCE DEPARTMENT. PROCEDURE DIVISION. INITIATE EMPLOYEE-REPORT *> Force department header INDICATE DEPARTMENT *> Process employee records... TERMINATE EMPLOYEE-REPORT.

Exercise 2: Conditional Formatting

cobol
1
2
3
4
5
6
7
8
9
10
11
*> Force special sections based on conditions IF SALES-AMOUNT > 50000 INDICATE HIGH-VALUE-SALES GENERATE SPECIAL-DETAIL INDICATE HIGH-VALUE-SALES END-IF *> Force page breaks at logical points IF CUSTOMER-TYPE-CHANGE INDICATE CUSTOMER-TYPE END-IF.

Best Practices

Knowledge Check

Test Your Understanding

Question 1: Purpose

What is the main purpose of the INDICATE statement?

Answer: INDICATE forces the generation of control groups in Report Writer, allowing programmatic control over when headers, footers, and control breaks are generated outside of normal data-driven processing.

Question 2: Usage

When would you use INDICATE in a report?

Answer: Use INDICATE when you need to force control breaks, generate summary sections at specific points, create page breaks, or handle special formatting requirements that don't follow normal data sequence.