The INITIAL clause represents a fundamental program state management mechanism within COBOL programming environments, providing automatic data initialization capabilities that ensure consistent program behavior, predictable execution states, and reliable subprogram functionality. This clause embodies the principles of clean program execution by supporting automatic data reset, memory state management, and program reentrancy while maintaining data integrity, ensuring repeatable results, and facilitating robust application architectures across enterprise systems requiring reliable program execution, consistent state management, and predictable behavior patterns with optimal resource utilization and comprehensive program lifecycle control.
123456789101112131415161718192021222324252627282930313233343536373839404142*> Basic INITIAL clause syntax IDENTIFICATION DIVISION. PROGRAM-ID. program-name IS INITIAL PROGRAM. *> Example of INITIAL program IDENTIFICATION DIVISION. PROGRAM-ID. CALCULATE-INTEREST IS INITIAL PROGRAM. ENVIRONMENT DIVISION. DATA DIVISION. WORKING-STORAGE SECTION. 01 WS-COUNTER PIC 9(3) VALUE 0. 01 WS-TOTAL PIC 9(8)V99 VALUE 0. 01 WS-CALCULATION-FLAG PIC X VALUE 'N'. PROCEDURE DIVISION. MAIN-PROCESSING. *> This program is initialized fresh on each call DISPLAY "Starting fresh calculation..." DISPLAY "Counter starts at: " WS-COUNTER DISPLAY "Total starts at: " WS-TOTAL *> Program logic here GOBACK. *> Calling program example IDENTIFICATION DIVISION. PROGRAM-ID. MAIN-PROGRAM. DATA DIVISION. WORKING-STORAGE SECTION. 01 WS-CALL-COUNT PIC 9(2) VALUE 0. PROCEDURE DIVISION. MAIN-PROCESSING. PERFORM 3 TIMES ADD 1 TO WS-CALL-COUNT DISPLAY "Call number: " WS-CALL-COUNT CALL "CALCULATE-INTEREST" END-PERFORM STOP RUN.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418*> =============================================== *> MAIN CALLING PROGRAM *> =============================================== IDENTIFICATION DIVISION. PROGRAM-ID. INITIAL-DEMO-MAIN. DATA DIVISION. WORKING-STORAGE SECTION. 01 WS-MAIN-COUNTERS. 05 WS-TOTAL-CALLS PIC 9(3) VALUE 0. 05 WS-SESSION-NUMBER PIC 9(2) VALUE 0. 01 WS-PARAMETERS. 05 WS-PRINCIPAL PIC 9(8)V99. 05 WS-RATE PIC 9V9999. 05 WS-RESULT PIC 9(10)V99. PROCEDURE DIVISION. MAIN-PROCESSING. DISPLAY "=== INITIAL CLAUSE DEMONSTRATION ===" DISPLAY "Testing INITIAL vs NON-INITIAL programs" DISPLAY SPACES PERFORM TEST-INITIAL-PROGRAM PERFORM TEST-NON-INITIAL-PROGRAM STOP RUN. TEST-INITIAL-PROGRAM. DISPLAY "=== TESTING INITIAL PROGRAM ===" PERFORM VARYING WS-SESSION-NUMBER FROM 1 BY 1 UNTIL WS-SESSION-NUMBER > 3 DISPLAY "Session " WS-SESSION-NUMBER ":" MOVE 10000.00 TO WS-PRINCIPAL MOVE 0.05 TO WS-RATE CALL "INITIAL-CALCULATOR" USING WS-PRINCIPAL WS-RATE WS-RESULT DISPLAY " Result: $" WS-RESULT ADD 1 TO WS-TOTAL-CALLS END-PERFORM DISPLAY "Total calls to INITIAL program: " WS-TOTAL-CALLS DISPLAY SPACES. TEST-NON-INITIAL-PROGRAM. DISPLAY "=== TESTING NON-INITIAL PROGRAM ===" MOVE 0 TO WS-SESSION-NUMBER PERFORM VARYING WS-SESSION-NUMBER FROM 1 BY 1 UNTIL WS-SESSION-NUMBER > 3 DISPLAY "Session " WS-SESSION-NUMBER ":" MOVE 10000.00 TO WS-PRINCIPAL MOVE 0.05 TO WS-RATE CALL "REGULAR-CALCULATOR" USING WS-PRINCIPAL WS-RATE WS-RESULT DISPLAY " Result: $" WS-RESULT ADD 1 TO WS-TOTAL-CALLS END-PERFORM DISPLAY "Total calls to REGULAR program: " WS-TOTAL-CALLS DISPLAY SPACES. *> =============================================== *> INITIAL SUBPROGRAM *> =============================================== IDENTIFICATION DIVISION. PROGRAM-ID. INITIAL-CALCULATOR IS INITIAL PROGRAM. DATA DIVISION. WORKING-STORAGE SECTION. *> These values are reset on each program call 01 WS-INTERNAL-COUNTERS. 05 WS-CALCULATION-COUNT PIC 9(3) VALUE 0. 05 WS-ITERATION-COUNT PIC 9(4) VALUE 0. 05 WS-TOTAL-PROCESSED PIC 9(8)V99 VALUE 0. 01 WS-CALCULATION-DATA. 05 WS-COMPOUND-FACTOR PIC 9V99999 VALUE 1.0. 05 WS-MONTHLY-RATE PIC 9V99999 VALUE 0. 05 WS-INTERMEDIATE-RESULT PIC 9(10)V99 VALUE 0. 01 WS-STATUS-FLAGS. 05 WS-FIRST-CALCULATION PIC X VALUE 'Y'. 88 FIRST-TIME VALUE 'Y'. 88 NOT-FIRST-TIME VALUE 'N'. 05 WS-ERROR-FLAG PIC X VALUE 'N'. 88 CALCULATION-ERROR VALUE 'Y'. 88 NO-ERROR VALUE 'N'. LINKAGE SECTION. 01 LS-PRINCIPAL PIC 9(8)V99. 01 LS-ANNUAL-RATE PIC 9V9999. 01 LS-CALCULATED-RESULT PIC 9(10)V99. PROCEDURE DIVISION USING LS-PRINCIPAL LS-ANNUAL-RATE LS-CALCULATED-RESULT. INITIAL-PROGRAM-MAIN. DISPLAY " INITIAL PROGRAM - Starting fresh calculation" DISPLAY " Calculation count starts at: " WS-CALCULATION-COUNT DISPLAY " Total processed starts at: $" WS-TOTAL-PROCESSED PERFORM VALIDATE-INPUT IF NO-ERROR PERFORM CALCULATE-COMPOUND-INTEREST PERFORM UPDATE-STATISTICS PERFORM DISPLAY-INTERNAL-STATE ELSE MOVE 0 TO LS-CALCULATED-RESULT END-IF GOBACK. VALIDATE-INPUT. SET NO-ERROR TO TRUE IF LS-PRINCIPAL <= 0 DISPLAY " Error: Principal must be positive" SET CALCULATION-ERROR TO TRUE END-IF IF LS-ANNUAL-RATE <= 0 OR LS-ANNUAL-RATE > 1 DISPLAY " Error: Rate must be between 0 and 1" SET CALCULATION-ERROR TO TRUE END-IF. CALCULATE-COMPOUND-INTEREST. *> Simple compound interest calculation ADD 1 TO WS-CALCULATION-COUNT IF FIRST-TIME DISPLAY " This is the first calculation in this instance" SET NOT-FIRST-TIME TO TRUE END-IF COMPUTE WS-MONTHLY-RATE = LS-ANNUAL-RATE / 12 COMPUTE WS-COMPOUND-FACTOR = 1 + WS-MONTHLY-RATE *> Calculate for 12 months MOVE LS-PRINCIPAL TO WS-INTERMEDIATE-RESULT PERFORM VARYING WS-ITERATION-COUNT FROM 1 BY 1 UNTIL WS-ITERATION-COUNT > 12 COMPUTE WS-INTERMEDIATE-RESULT = WS-INTERMEDIATE-RESULT * WS-COMPOUND-FACTOR END-PERFORM MOVE WS-INTERMEDIATE-RESULT TO LS-CALCULATED-RESULT. UPDATE-STATISTICS. ADD LS-PRINCIPAL TO WS-TOTAL-PROCESSED DISPLAY " Calculation #" WS-CALCULATION-COUNT " completed" DISPLAY " Running total processed: $" WS-TOTAL-PROCESSED. DISPLAY-INTERNAL-STATE. DISPLAY " Internal state:" DISPLAY " Calculations performed: " WS-CALCULATION-COUNT DISPLAY " Total amount processed: $" WS-TOTAL-PROCESSED DISPLAY " Compound factor: " WS-COMPOUND-FACTOR. *> =============================================== *> NON-INITIAL SUBPROGRAM (FOR COMPARISON) *> =============================================== IDENTIFICATION DIVISION. PROGRAM-ID. REGULAR-CALCULATOR. DATA DIVISION. WORKING-STORAGE SECTION. *> These values persist between program calls 01 WS-INTERNAL-COUNTERS. 05 WS-CALCULATION-COUNT PIC 9(3) VALUE 0. 05 WS-ITERATION-COUNT PIC 9(4) VALUE 0. 05 WS-TOTAL-PROCESSED PIC 9(8)V99 VALUE 0. 01 WS-CALCULATION-DATA. 05 WS-COMPOUND-FACTOR PIC 9V99999 VALUE 1.0. 05 WS-MONTHLY-RATE PIC 9V99999 VALUE 0. 05 WS-INTERMEDIATE-RESULT PIC 9(10)V99 VALUE 0. 01 WS-STATUS-FLAGS. 05 WS-FIRST-CALCULATION PIC X VALUE 'Y'. 88 FIRST-TIME VALUE 'Y'. 88 NOT-FIRST-TIME VALUE 'N'. 05 WS-ERROR-FLAG PIC X VALUE 'N'. 88 CALCULATION-ERROR VALUE 'Y'. 88 NO-ERROR VALUE 'N'. LINKAGE SECTION. 01 LS-PRINCIPAL PIC 9(8)V99. 01 LS-ANNUAL-RATE PIC 9V9999. 01 LS-CALCULATED-RESULT PIC 9(10)V99. PROCEDURE DIVISION USING LS-PRINCIPAL LS-ANNUAL-RATE LS-CALCULATED-RESULT. REGULAR-PROGRAM-MAIN. DISPLAY " REGULAR PROGRAM - Using persistent data" DISPLAY " Calculation count continues from: " WS-CALCULATION-COUNT DISPLAY " Total processed continues from: $" WS-TOTAL-PROCESSED PERFORM VALIDATE-INPUT IF NO-ERROR PERFORM CALCULATE-COMPOUND-INTEREST PERFORM UPDATE-STATISTICS PERFORM DISPLAY-INTERNAL-STATE ELSE MOVE 0 TO LS-CALCULATED-RESULT END-IF GOBACK. VALIDATE-INPUT. SET NO-ERROR TO TRUE IF LS-PRINCIPAL <= 0 DISPLAY " Error: Principal must be positive" SET CALCULATION-ERROR TO TRUE END-IF IF LS-ANNUAL-RATE <= 0 OR LS-ANNUAL-RATE > 1 DISPLAY " Error: Rate must be between 0 and 1" SET CALCULATION-ERROR TO TRUE END-IF. CALCULATE-COMPOUND-INTEREST. ADD 1 TO WS-CALCULATION-COUNT IF FIRST-TIME DISPLAY " This is the first calculation ever" SET NOT-FIRST-TIME TO TRUE ELSE DISPLAY " This is calculation #" WS-CALCULATION-COUNT END-IF COMPUTE WS-MONTHLY-RATE = LS-ANNUAL-RATE / 12 COMPUTE WS-COMPOUND-FACTOR = 1 + WS-MONTHLY-RATE MOVE LS-PRINCIPAL TO WS-INTERMEDIATE-RESULT PERFORM VARYING WS-ITERATION-COUNT FROM 1 BY 1 UNTIL WS-ITERATION-COUNT > 12 COMPUTE WS-INTERMEDIATE-RESULT = WS-INTERMEDIATE-RESULT * WS-COMPOUND-FACTOR END-PERFORM MOVE WS-INTERMEDIATE-RESULT TO LS-CALCULATED-RESULT. UPDATE-STATISTICS. ADD LS-PRINCIPAL TO WS-TOTAL-PROCESSED DISPLAY " Cumulative calculation #" WS-CALCULATION-COUNT " completed" DISPLAY " Cumulative total processed: $" WS-TOTAL-PROCESSED. DISPLAY-INTERNAL-STATE. DISPLAY " Persistent state:" DISPLAY " Total calculations: " WS-CALCULATION-COUNT DISPLAY " Cumulative amount: $" WS-TOTAL-PROCESSED DISPLAY " Last compound factor: " WS-COMPOUND-FACTOR. *> =============================================== *> ADVANCED INITIAL PROGRAM EXAMPLES *> =============================================== IDENTIFICATION DIVISION. PROGRAM-ID. DATA-VALIDATOR IS INITIAL PROGRAM. DATA DIVISION. WORKING-STORAGE SECTION. 01 WS-VALIDATION-WORKSPACE. 05 WS-ERROR-COUNT PIC 9(3) VALUE 0. 05 WS-WARNING-COUNT PIC 9(3) VALUE 0. 05 WS-RECORDS-PROCESSED PIC 9(6) VALUE 0. 05 WS-VALIDATION-LEVEL PIC 9 VALUE 1. 01 WS-ERROR-MESSAGES. 05 WS-ERROR-TABLE OCCURS 50 TIMES. 10 WS-ERROR-CODE PIC X(5). 10 WS-ERROR-MESSAGE PIC X(50). 10 WS-ERROR-SEVERITY PIC X(7). 01 WS-VALIDATION-FLAGS. 05 WS-STRICT-MODE PIC X VALUE 'N'. 88 STRICT-VALIDATION VALUE 'Y'. 88 NORMAL-VALIDATION VALUE 'N'. 05 WS-INITIALIZED PIC X VALUE 'N'. 88 VALIDATOR-READY VALUE 'Y'. 88 NOT-INITIALIZED VALUE 'N'. LINKAGE SECTION. 01 LS-INPUT-RECORD PIC X(100). 01 LS-VALIDATION-RESULT PIC X(10). 01 LS-ERROR-DETAILS PIC X(200). PROCEDURE DIVISION USING LS-INPUT-RECORD LS-VALIDATION-RESULT LS-ERROR-DETAILS. VALIDATOR-MAIN. DISPLAY " DATA VALIDATOR - Fresh instance started" DISPLAY " Error count reset to: " WS-ERROR-COUNT DISPLAY " Records processed reset to: " WS-RECORDS-PROCESSED PERFORM INITIALIZE-VALIDATOR PERFORM VALIDATE-RECORD PERFORM FINALIZE-VALIDATION GOBACK. INITIALIZE-VALIDATOR. *> This runs fresh every time due to INITIAL DISPLAY " Initializing validator (fresh each time)..." MOVE 1 TO WS-VALIDATION-LEVEL SET NORMAL-VALIDATION TO TRUE SET VALIDATOR-READY TO TRUE *> Initialize error table PERFORM VARYING WS-ERROR-COUNT FROM 1 BY 1 UNTIL WS-ERROR-COUNT > 50 MOVE SPACES TO WS-ERROR-TABLE(WS-ERROR-COUNT) END-PERFORM MOVE 0 TO WS-ERROR-COUNT. VALIDATE-RECORD. ADD 1 TO WS-RECORDS-PROCESSED *> Perform various validations IF LS-INPUT-RECORD = SPACES PERFORM ADD-ERROR END-IF IF LS-INPUT-RECORD(1:1) NOT ALPHABETIC PERFORM ADD-WARNING END-IF *> Set result based on validation IF WS-ERROR-COUNT = 0 MOVE "VALID" TO LS-VALIDATION-RESULT ELSE MOVE "INVALID" TO LS-VALIDATION-RESULT END-IF. ADD-ERROR. ADD 1 TO WS-ERROR-COUNT MOVE "E001" TO WS-ERROR-CODE(WS-ERROR-COUNT) MOVE "Record is blank" TO WS-ERROR-MESSAGE(WS-ERROR-COUNT) MOVE "ERROR" TO WS-ERROR-SEVERITY(WS-ERROR-COUNT). ADD-WARNING. ADD 1 TO WS-WARNING-COUNT ADD 1 TO WS-ERROR-COUNT MOVE "W001" TO WS-ERROR-CODE(WS-ERROR-COUNT) MOVE "First character should be alphabetic" TO WS-ERROR-MESSAGE(WS-ERROR-COUNT) MOVE "WARNING" TO WS-ERROR-SEVERITY(WS-ERROR-COUNT). FINALIZE-VALIDATION. STRING "Errors: " WS-ERROR-COUNT " Warnings: " WS-WARNING-COUNT " Records: " WS-RECORDS-PROCESSED DELIMITED BY SIZE INTO LS-ERROR-DETAILS DISPLAY " Validation complete - Errors: " WS-ERROR-COUNT DISPLAY " This instance processed: " WS-RECORDS-PROCESSED " records". *> =============================================== *> UTILITY INITIAL PROGRAM FOR CONFIGURATION *> =============================================== IDENTIFICATION DIVISION. PROGRAM-ID. CONFIG-MANAGER IS INITIAL PROGRAM. DATA DIVISION. WORKING-STORAGE SECTION. 01 WS-CONFIG-DATA. 05 WS-CONFIG-LOADED PIC X VALUE 'N'. 88 CONFIG-AVAILABLE VALUE 'Y'. 88 CONFIG-NOT-LOADED VALUE 'N'. 05 WS-CONFIG-VERSION PIC X(10) VALUE SPACES. 05 WS-CONFIG-TIMESTAMP PIC X(20) VALUE SPACES. 01 WS-DEFAULT-SETTINGS. 05 WS-TIMEOUT-VALUE PIC 9(4) VALUE 30. 05 WS-RETRY-COUNT PIC 9(2) VALUE 3. 05 WS-DEBUG-MODE PIC X VALUE 'N'. 05 WS-LOG-LEVEL PIC 9 VALUE 2. LINKAGE SECTION. 01 LS-CONFIG-REQUEST PIC X(20). 01 LS-CONFIG-VALUE PIC X(50). 01 LS-STATUS-CODE PIC 9(2). PROCEDURE DIVISION USING LS-CONFIG-REQUEST LS-CONFIG-VALUE LS-STATUS-CODE. CONFIG-MANAGER-MAIN. DISPLAY " CONFIG MANAGER - Fresh configuration instance" DISPLAY " Loading default settings..." PERFORM LOAD-DEFAULT-CONFIG PERFORM PROCESS-CONFIG-REQUEST GOBACK. LOAD-DEFAULT-CONFIG. *> Always loads fresh defaults due to INITIAL DISPLAY " Loading fresh default configuration" MOVE "1.0.0" TO WS-CONFIG-VERSION ACCEPT WS-CONFIG-TIMESTAMP FROM TIME SET CONFIG-AVAILABLE TO TRUE DISPLAY " Default timeout: " WS-TIMEOUT-VALUE " seconds" DISPLAY " Default retries: " WS-RETRY-COUNT. PROCESS-CONFIG-REQUEST. EVALUATE LS-CONFIG-REQUEST WHEN "TIMEOUT" MOVE WS-TIMEOUT-VALUE TO LS-CONFIG-VALUE MOVE 0 TO LS-STATUS-CODE WHEN "RETRY-COUNT" MOVE WS-RETRY-COUNT TO LS-CONFIG-VALUE MOVE 0 TO LS-STATUS-CODE WHEN "VERSION" MOVE WS-CONFIG-VERSION TO LS-CONFIG-VALUE MOVE 0 TO LS-STATUS-CODE WHEN OTHER MOVE "UNKNOWN-SETTING" TO LS-CONFIG-VALUE MOVE 1 TO LS-STATUS-CODE END-EVALUATE.
What happens to Working-Storage data in an INITIAL program?
Answer: All Working-Storage data items are reset to their initial values (VALUE clauses or default values) each time the program is called, ensuring a fresh start on every invocation.
When is it important to use the INITIAL clause?
Answer: Use INITIAL when you need predictable starting states, when programs are called multiple times with different data, for reentrant programs, or when residual values from previous calls could cause problems.