The END-CALL statement represents a fundamental component of structured modular programming in COBOL, serving as an explicit scope terminator that clearly defines the boundaries of CALL statement blocks. This statement embodies modern programming principles by providing unambiguous termination points for subprogram invocation operations, enabling sophisticated error handling for call failures and resource management, and supporting the development of robust, maintainable enterprise applications that leverage modular architecture patterns for code reusability and system scalability.
In contemporary enterprise COBOL development, END-CALL plays a vital role in creating sophisticated modular applications that must handle complex subprogram interactions, parameter passing scenarios, and error conditions that may arise during program execution. By providing explicit termination for CALL blocks, this statement enables developers to implement comprehensive modular programming logic while maintaining code clarity and ensuring that subprogram invocations are properly bounded and controlled within the application's execution flow.
The END-CALL statement implements a sophisticated scope management system specifically designed for subprogram invocation operations. This architecture addresses the complexity inherent in modern modular programming scenarios where CALL statements must manage parameter passing, return value handling, exception conditions, and resource cleanup operations. The explicit termination provided by END-CALL ensures that all these operations are properly contained within defined boundaries.
The architectural design of END-CALL reflects the evolution of COBOL toward structured programming paradigms that emphasize modularity, reusability, and error prevention in subprogram interactions. When used with conditional phrases like ON EXCEPTION and ON OVERFLOW, END-CALL creates a comprehensive framework for handling both successful subprogram calls and error conditions that may arise during program execution or resource allocation.
END-CALL also plays a crucial role in compiler optimization and call stack management. Modern COBOL compilers can perform more sophisticated analysis when subprogram call blocks are explicitly terminated, leading to better error detection during compilation, more efficient runtime code generation, and improved memory management. This capability is particularly important in enterprise environments where performance and resource utilization are critical requirements.
END-CALL enables the implementation of sophisticated modular programming patterns that are essential for modern enterprise applications. These patterns include service-oriented architectures with comprehensive error handling, batch processing with modular components and failure recovery, and complex multi-tier applications that require precise control over subprogram interactions and resource management.
The use of END-CALL in conjunction with conditional phrases creates powerful modular processing frameworks that can handle various call failure conditions, parameter validation scenarios, and resource allocation issues while maintaining application stability and providing meaningful feedback about subprogram execution results. This capability is particularly valuable in applications that must integrate multiple subsystems or external services.
Modern enterprise applications often implement layered modular architectures where END-CALL statements work in conjunction with service frameworks, parameter validation systems, and error handling engines to create comprehensive modular solutions that meet the complex requirements of contemporary business systems while maintaining code reusability and system maintainability.
The basic implementation of END-CALL follows a consistent pattern where it serves as the explicit terminator for CALL statement blocks. This pattern is particularly important when CALL statements include conditional processing or when they are nested within other constructs.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140IDENTIFICATION DIVISION. PROGRAM-ID. END-CALL-BASIC. DATA DIVISION. WORKING-STORAGE SECTION. 01 EMPLOYEE-PROCESSING. 05 EMPLOYEE-ID PIC X(10). 05 EMPLOYEE-NAME PIC X(30). 05 EMPLOYEE-SALARY PIC 9(7)V99. 05 EMPLOYEE-DEPARTMENT PIC X(10). 01 CALCULATION-RESULTS. 05 GROSS-PAY PIC 9(9)V99. 05 NET-PAY PIC 9(9)V99. 05 TAX-AMOUNT PIC 9(7)V99. 05 DEDUCTION-AMOUNT PIC 9(7)V99. 01 CALL-STATUS-FLAGS. 05 CALL-SUCCESSFUL-FLAG PIC X VALUE 'N'. 88 CALL-SUCCESSFUL VALUE 'Y'. 88 CALL-FAILED VALUE 'N'. 05 VALIDATION-FLAG PIC X VALUE 'N'. 88 VALIDATION-PASSED VALUE 'Y'. 88 VALIDATION-FAILED VALUE 'N'. 01 ERROR-HANDLING. 05 ERROR-MESSAGE PIC X(80). 05 ERROR-CODE PIC 9(4). 05 RETRY-COUNT PIC 9(2) VALUE 0. 05 MAX-RETRIES PIC 9(2) VALUE 3. 01 SUBPROGRAM-PARAMETERS. 05 CALC-EMPLOYEE-ID PIC X(10). 05 CALC-SALARY PIC 9(7)V99. 05 CALC-GROSS-PAY PIC 9(9)V99. 05 CALC-NET-PAY PIC 9(9)V99. 05 CALC-RETURN-CODE PIC 9(2). PROCEDURE DIVISION. MAIN-PROCESSING. PERFORM INITIALIZE-PROGRAM PERFORM PROCESS-EMPLOYEE-PAYROLL PERFORM DISPLAY-RESULTS STOP RUN. INITIALIZE-PROGRAM. MOVE 'EMP001' TO EMPLOYEE-ID MOVE 'JOHN SMITH' TO EMPLOYEE-NAME MOVE 5000.00 TO EMPLOYEE-SALARY MOVE 'FINANCE' TO EMPLOYEE-DEPARTMENT MOVE 'N' TO CALL-SUCCESSFUL-FLAG MOVE 'N' TO VALIDATION-FLAG MOVE SPACES TO ERROR-MESSAGE MOVE 0 TO ERROR-CODE, RETRY-COUNT. PROCESS-EMPLOYEE-PAYROLL. PERFORM VALIDATE-EMPLOYEE-DATA IF VALIDATION-PASSED PERFORM CALCULATE-PAYROLL PERFORM VALIDATE-CALCULATIONS ELSE DISPLAY 'Employee data validation failed' END-IF. VALIDATE-EMPLOYEE-DATA. *> Call validation subprogram with error handling MOVE EMPLOYEE-ID TO CALC-EMPLOYEE-ID MOVE EMPLOYEE-SALARY TO CALC-SALARY CALL 'VALIDATE-EMPLOYEE' USING CALC-EMPLOYEE-ID, CALC-SALARY, CALC-RETURN-CODE ON EXCEPTION MOVE 'Error calling validation subprogram' TO ERROR-MESSAGE MOVE 1001 TO ERROR-CODE SET CALL-FAILED TO TRUE DISPLAY ERROR-MESSAGE NOT ON EXCEPTION IF CALC-RETURN-CODE = 0 SET VALIDATION-PASSED TO TRUE SET CALL-SUCCESSFUL TO TRUE DISPLAY 'Employee validation successful' ELSE SET VALIDATION-FAILED TO TRUE DISPLAY 'Employee validation failed with code: ' CALC-RETURN-CODE END-IF END-CALL. CALCULATE-PAYROLL. *> Call payroll calculation subprogram MOVE EMPLOYEE-ID TO CALC-EMPLOYEE-ID MOVE EMPLOYEE-SALARY TO CALC-SALARY CALL 'CALCULATE-PAYROLL' USING CALC-EMPLOYEE-ID, CALC-SALARY, CALC-GROSS-PAY, CALC-NET-PAY, CALC-RETURN-CODE ON EXCEPTION MOVE 'Error calling payroll calculation subprogram' TO ERROR-MESSAGE MOVE 1002 TO ERROR-CODE SET CALL-FAILED TO TRUE DISPLAY ERROR-MESSAGE NOT ON EXCEPTION IF CALC-RETURN-CODE = 0 MOVE CALC-GROSS-PAY TO GROSS-PAY MOVE CALC-NET-PAY TO NET-PAY SET CALL-SUCCESSFUL TO TRUE DISPLAY 'Payroll calculation successful' ELSE DISPLAY 'Payroll calculation failed with code: ' CALC-RETURN-CODE END-IF END-CALL. VALIDATE-CALCULATIONS. *> Call calculation validation subprogram CALL 'VALIDATE-CALCULATIONS' USING GROSS-PAY, NET-PAY, CALC-RETURN-CODE ON EXCEPTION MOVE 'Error calling calculation validation subprogram' TO ERROR-MESSAGE MOVE 1003 TO ERROR-CODE SET CALL-FAILED TO TRUE DISPLAY ERROR-MESSAGE NOT ON EXCEPTION IF CALC-RETURN-CODE = 0 DISPLAY 'Calculation validation successful' ELSE DISPLAY 'Calculation validation failed with code: ' CALC-RETURN-CODE END-IF END-CALL. DISPLAY-RESULTS. IF CALL-SUCCESSFUL AND VALIDATION-PASSED DISPLAY 'Employee Processing Results:' DISPLAY 'Employee ID: ' EMPLOYEE-ID DISPLAY 'Employee Name: ' EMPLOYEE-NAME DISPLAY 'Base Salary: ' EMPLOYEE-SALARY DISPLAY 'Gross Pay: ' GROSS-PAY DISPLAY 'Net Pay: ' NET-PAY ELSE DISPLAY 'Processing failed - Error: ' ERROR-MESSAGE DISPLAY 'Error Code: ' ERROR-CODE END-IF.
Advanced END-CALL patterns involve complex nested structures, sophisticated error handling, and integration with other COBOL constructs to create comprehensive modular processing solutions.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288IDENTIFICATION DIVISION. PROGRAM-ID. ADVANCED-END-CALL. DATA DIVISION. WORKING-STORAGE SECTION. 01 TRANSACTION-PROCESSING. 05 TRANSACTION-ID PIC X(15). 05 TRANSACTION-TYPE PIC X(10). 05 TRANSACTION-AMOUNT PIC 9(11)V99. 05 ACCOUNT-NUMBER PIC X(20). 05 CUSTOMER-ID PIC X(15). 01 PROCESSING-CONTROLS. 05 TRANSACTION-COUNT PIC 9(7). 05 CURRENT-TRANSACTION PIC 9(7). 05 SUCCESSFUL-COUNT PIC 9(7). 05 ERROR-COUNT PIC 9(7). 01 CALL-MANAGEMENT. 05 ACTIVE-CALLS PIC 9(3). 05 MAX-CONCURRENT-CALLS PIC 9(3) VALUE 10. 05 CALL-TIMEOUT PIC 9(5) VALUE 30. 05 RETRY-ATTEMPTS PIC 9(2). 05 MAX-RETRY-ATTEMPTS PIC 9(2) VALUE 3. 01 SUBPROGRAM-INTERFACES. 05 VALIDATION-INTERFACE. 10 VAL-TRANSACTION-ID PIC X(15). 10 VAL-ACCOUNT-NUMBER PIC X(20). 10 VAL-CUSTOMER-ID PIC X(15). 10 VAL-RETURN-CODE PIC 9(2). 10 VAL-ERROR-MESSAGE PIC X(80). 05 PROCESSING-INTERFACE. 10 PROC-TRANSACTION-ID PIC X(15). 10 PROC-TRANSACTION-TYPE PIC X(10). 10 PROC-AMOUNT PIC 9(11)V99. 10 PROC-ACCOUNT-NUMBER PIC X(20). 10 PROC-RETURN-CODE PIC 9(2). 10 PROC-ERROR-MESSAGE PIC X(80). 05 AUDIT-INTERFACE. 10 AUDIT-TRANSACTION-ID PIC X(15). 10 AUDIT-USER-ID PIC X(10). 10 AUDIT-TIMESTAMP PIC X(26). 10 AUDIT-ACTION PIC X(20). 10 AUDIT-RETURN-CODE PIC 9(2). 01 ERROR-MANAGEMENT. 05 CRITICAL-ERROR-FLAG PIC X VALUE 'N'. 88 CRITICAL-ERROR VALUE 'Y'. 05 RECOVERABLE-ERROR-FLAG PIC X VALUE 'N'. 88 RECOVERABLE-ERROR VALUE 'Y'. 05 SYSTEM-ERROR-FLAG PIC X VALUE 'N'. 88 SYSTEM-ERROR VALUE 'Y'. PROCEDURE DIVISION. MAIN-PROCESSING. PERFORM INITIALIZE-TRANSACTION-SYSTEM PERFORM PROCESS-TRANSACTION-BATCH PERFORM FINALIZE-TRANSACTION-SYSTEM STOP RUN. INITIALIZE-TRANSACTION-SYSTEM. MOVE 1000 TO TRANSACTION-COUNT MOVE 0 TO CURRENT-TRANSACTION, SUCCESSFUL-COUNT, ERROR-COUNT MOVE 0 TO ACTIVE-CALLS, RETRY-ATTEMPTS MOVE 'N' TO CRITICAL-ERROR-FLAG, RECOVERABLE-ERROR-FLAG, SYSTEM-ERROR-FLAG *> Initialize system components CALL 'INIT-TRANSACTION-SYSTEM' USING TRANSACTION-COUNT, MAX-CONCURRENT-CALLS, CALL-TIMEOUT ON EXCEPTION DISPLAY 'Critical error initializing transaction system' SET CRITICAL-ERROR TO TRUE PERFORM EMERGENCY-SHUTDOWN NOT ON EXCEPTION DISPLAY 'Transaction system initialized successfully' END-CALL. PROCESS-TRANSACTION-BATCH. PERFORM VARYING CURRENT-TRANSACTION FROM 1 BY 1 UNTIL CURRENT-TRANSACTION > TRANSACTION-COUNT OR CRITICAL-ERROR PERFORM GENERATE-TRANSACTION-DATA PERFORM VALIDATE-TRANSACTION IF NOT CRITICAL-ERROR AND NOT SYSTEM-ERROR PERFORM PROCESS-INDIVIDUAL-TRANSACTION PERFORM AUDIT-TRANSACTION END-IF PERFORM HANDLE-TRANSACTION-ERRORS END-PERFORM. GENERATE-TRANSACTION-DATA. *> Generate test transaction data STRING 'TXN' DELIMITED BY SIZE CURRENT-TRANSACTION DELIMITED BY SIZE INTO TRANSACTION-ID END-STRING EVALUATE FUNCTION MOD(CURRENT-TRANSACTION, 4) WHEN 0 MOVE 'DEPOSIT' TO TRANSACTION-TYPE MOVE 1000.00 TO TRANSACTION-AMOUNT WHEN 1 MOVE 'WITHDRAWAL' TO TRANSACTION-TYPE MOVE 500.00 TO TRANSACTION-AMOUNT WHEN 2 MOVE 'TRANSFER' TO TRANSACTION-TYPE MOVE 750.00 TO TRANSACTION-AMOUNT WHEN 3 MOVE 'PAYMENT' TO TRANSACTION-TYPE MOVE 250.00 TO TRANSACTION-AMOUNT END-EVALUATE STRING 'ACCT' DELIMITED BY SIZE CURRENT-TRANSACTION DELIMITED BY SIZE INTO ACCOUNT-NUMBER END-STRING STRING 'CUST' DELIMITED BY SIZE CURRENT-TRANSACTION DELIMITED BY SIZE INTO CUSTOMER-ID END-STRING. VALIDATE-TRANSACTION. MOVE TRANSACTION-ID TO VAL-TRANSACTION-ID MOVE ACCOUNT-NUMBER TO VAL-ACCOUNT-NUMBER MOVE CUSTOMER-ID TO VAL-CUSTOMER-ID PERFORM UNTIL VAL-RETURN-CODE = 0 OR RETRY-ATTEMPTS >= MAX-RETRY-ATTEMPTS CALL 'VALIDATE-TRANSACTION' USING VALIDATION-INTERFACE ON EXCEPTION ADD 1 TO RETRY-ATTEMPTS IF RETRY-ATTEMPTS >= MAX-RETRY-ATTEMPTS DISPLAY 'Validation service unavailable for transaction: ' TRANSACTION-ID SET SYSTEM-ERROR TO TRUE ADD 1 TO ERROR-COUNT ELSE DISPLAY 'Retrying validation for transaction: ' TRANSACTION-ID PERFORM WAIT-AND-RETRY END-IF NOT ON EXCEPTION EVALUATE VAL-RETURN-CODE WHEN 0 DISPLAY 'Transaction validation successful: ' TRANSACTION-ID WHEN 1 DISPLAY 'Invalid account number: ' ACCOUNT-NUMBER SET RECOVERABLE-ERROR TO TRUE ADD 1 TO ERROR-COUNT WHEN 2 DISPLAY 'Invalid customer ID: ' CUSTOMER-ID SET RECOVERABLE-ERROR TO TRUE ADD 1 TO ERROR-COUNT WHEN 3 DISPLAY 'Transaction ID format error: ' TRANSACTION-ID SET RECOVERABLE-ERROR TO TRUE ADD 1 TO ERROR-COUNT WHEN OTHER DISPLAY 'Unknown validation error: ' VAL-ERROR-MESSAGE SET SYSTEM-ERROR TO TRUE ADD 1 TO ERROR-COUNT END-EVALUATE END-CALL END-PERFORM MOVE 0 TO RETRY-ATTEMPTS. PROCESS-INDIVIDUAL-TRANSACTION. IF VAL-RETURN-CODE = 0 MOVE TRANSACTION-ID TO PROC-TRANSACTION-ID MOVE TRANSACTION-TYPE TO PROC-TRANSACTION-TYPE MOVE TRANSACTION-AMOUNT TO PROC-AMOUNT MOVE ACCOUNT-NUMBER TO PROC-ACCOUNT-NUMBER CALL 'PROCESS-TRANSACTION' USING PROCESSING-INTERFACE ON EXCEPTION DISPLAY 'Processing service unavailable for transaction: ' TRANSACTION-ID SET SYSTEM-ERROR TO TRUE ADD 1 TO ERROR-COUNT NOT ON EXCEPTION EVALUATE PROC-RETURN-CODE WHEN 0 ADD 1 TO SUCCESSFUL-COUNT DISPLAY 'Transaction processed successfully: ' TRANSACTION-ID WHEN 1 DISPLAY 'Insufficient funds: ' TRANSACTION-ID SET RECOVERABLE-ERROR TO TRUE ADD 1 TO ERROR-COUNT WHEN 2 DISPLAY 'Account locked: ' TRANSACTION-ID SET RECOVERABLE-ERROR TO TRUE ADD 1 TO ERROR-COUNT WHEN 3 DISPLAY 'Daily limit exceeded: ' TRANSACTION-ID SET RECOVERABLE-ERROR TO TRUE ADD 1 TO ERROR-COUNT WHEN OTHER DISPLAY 'Processing error: ' PROC-ERROR-MESSAGE SET SYSTEM-ERROR TO TRUE ADD 1 TO ERROR-COUNT END-EVALUATE END-CALL END-IF. AUDIT-TRANSACTION. MOVE TRANSACTION-ID TO AUDIT-TRANSACTION-ID MOVE 'SYSTEM' TO AUDIT-USER-ID MOVE FUNCTION CURRENT-DATE TO AUDIT-TIMESTAMP IF PROC-RETURN-CODE = 0 MOVE 'TRANSACTION-PROCESSED' TO AUDIT-ACTION ELSE MOVE 'TRANSACTION-FAILED' TO AUDIT-ACTION END-IF CALL 'AUDIT-TRANSACTION' USING AUDIT-INTERFACE ON EXCEPTION DISPLAY 'Audit service unavailable - continuing processing' *> Audit failures are not critical for transaction processing NOT ON EXCEPTION IF AUDIT-RETURN-CODE = 0 DISPLAY 'Transaction audited: ' TRANSACTION-ID ELSE DISPLAY 'Audit failed for transaction: ' TRANSACTION-ID END-IF END-CALL. HANDLE-TRANSACTION-ERRORS. IF CRITICAL-ERROR DISPLAY 'Critical error detected - stopping processing' PERFORM EMERGENCY-SHUTDOWN ELSE IF SYSTEM-ERROR DISPLAY 'System error detected - attempting recovery' PERFORM ATTEMPT-SYSTEM-RECOVERY END-IF IF RECOVERABLE-ERROR DISPLAY 'Recoverable error - continuing with next transaction' MOVE 'N' TO RECOVERABLE-ERROR-FLAG END-IF END-IF. WAIT-AND-RETRY. *> Simple delay mechanism COMPUTE RETRY-ATTEMPTS = RETRY-ATTEMPTS + 1 DISPLAY 'Waiting before retry attempt: ' RETRY-ATTEMPTS. ATTEMPT-SYSTEM-RECOVERY. CALL 'SYSTEM-RECOVERY' ON EXCEPTION DISPLAY 'System recovery failed - setting critical error' SET CRITICAL-ERROR TO TRUE NOT ON EXCEPTION DISPLAY 'System recovery successful' MOVE 'N' TO SYSTEM-ERROR-FLAG END-CALL. EMERGENCY-SHUTDOWN. CALL 'EMERGENCY-SHUTDOWN' ON EXCEPTION DISPLAY 'Emergency shutdown failed' NOT ON EXCEPTION DISPLAY 'Emergency shutdown completed' END-CALL. FINALIZE-TRANSACTION-SYSTEM. CALL 'FINALIZE-TRANSACTION-SYSTEM' USING SUCCESSFUL-COUNT, ERROR-COUNT ON EXCEPTION DISPLAY 'Error finalizing transaction system' NOT ON EXCEPTION DISPLAY 'Transaction system finalized successfully' END-CALL DISPLAY 'Processing Summary:' DISPLAY 'Total Transactions: ' TRANSACTION-COUNT DISPLAY 'Successful: ' SUCCESSFUL-COUNT DISPLAY 'Errors: ' ERROR-COUNT.
Complete the following code with proper END-CALL statements:
123456789101112131415161718192021CALL 'CALCULATE-TAX' USING GROSS-PAY, TAX-RATE, TAX-AMOUNT, RETURN-CODE ON EXCEPTION DISPLAY 'Error calling tax calculation subprogram' MOVE 'Y' TO ERROR-FLAG NOT ON EXCEPTION IF RETURN-CODE = 0 DISPLAY 'Tax calculated successfully: ' TAX-AMOUNT ELSE DISPLAY 'Tax calculation failed with code: ' RETURN-CODE END-IF *> Add END-CALL here CALL 'VALIDATE-EMPLOYEE' USING EMPLOYEE-ID, EMPLOYEE-DATA, VALIDATION-RESULT ON EXCEPTION DISPLAY 'Validation service unavailable' MOVE 'Y' TO ERROR-FLAG NOT ON EXCEPTION DISPLAY 'Employee validation completed' *> Add END-CALL here
Add appropriate END-CALL statements to this nested structure:
123456789101112131415161718PERFORM VARYING COUNTER FROM 1 BY 1 UNTIL COUNTER > 10 CALL 'PROCESS-RECORD' USING RECORD-ID(COUNTER), PROCESS-FLAG ON EXCEPTION DISPLAY 'Error processing record: ' COUNTER ADD 1 TO ERROR-COUNT NOT ON EXCEPTION IF PROCESS-FLAG = 'Y' CALL 'AUDIT-RECORD' USING RECORD-ID(COUNTER), AUDIT-RESULT ON EXCEPTION DISPLAY 'Audit failed for record: ' COUNTER NOT ON EXCEPTION ADD 1 TO PROCESSED-COUNT *> Add END-CALL here END-IF *> Add END-CALL here END-PERFORM