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.
12345678910111213141516171819202122232425262728293031323334353637383940414243444546*> 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.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361IDENTIFICATION 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.
123456789101112131415161718RD 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.
1234567891011*> 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.
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.
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.