The END-EVALUATE clause marks the end of an EVALUATE statement block. It is a required terminator that ensures proper structure and prevents compilation errors in COBOL programs.
END-EVALUATE marks the end of the EVALUATE block structure.
The END-EVALUATE clause follows specific syntax patterns and is required to properly terminate EVALUATE statement blocks.
1234567891011121314151617181920212223242526272829* Basic END-EVALUATE syntax EVALUATE condition WHEN value1 statements... WHEN value2 statements... WHEN OTHER statements... END-EVALUATE * Simple example EVALUATE WS-STATUS WHEN "A" DISPLAY "Active" WHEN "I" DISPLAY "Inactive" WHEN OTHER DISPLAY "Unknown" END-EVALUATE * With multiple conditions EVALUATE TRUE WHEN WS-AGE < 18 DISPLAY "Minor" WHEN WS-AGE >= 18 AND WS-AGE < 65 DISPLAY "Adult" WHEN WS-AGE >= 65 DISPLAY "Senior" END-EVALUATE
END-EVALUATE is required to terminate every EVALUATE statement block.
Feature | EVALUATE | IF |
---|---|---|
Start | EVALUATE | IF |
Conditions | WHEN clauses | ELSE IF |
Default | WHEN OTHER | ELSE |
End | END-EVALUATE | END-IF |
Use case | Multi-way branching | Simple conditions |
12345678910111213141516171819202122232425262728293031* Nested EVALUATE with proper END-EVALUATE EVALUATE WS-CATEGORY WHEN "A" EVALUATE WS-SUBTYPE WHEN "X" DISPLAY "Category A, Subtype X" WHEN "Y" DISPLAY "Category A, Subtype Y" WHEN OTHER DISPLAY "Category A, Unknown subtype" END-EVALUATE * Inner EVALUATE WHEN "B" DISPLAY "Category B" WHEN OTHER DISPLAY "Unknown category" END-EVALUATE * Outer EVALUATE * With comments for clarity EVALUATE WS-STATUS WHEN "ACTIVE" PERFORM PROCESS-ACTIVE WHEN "PENDING" EVALUATE WS-PRIORITY WHEN "HIGH" PERFORM PROCESS-HIGH-PRIORITY WHEN "LOW" PERFORM PROCESS-LOW-PRIORITY END-EVALUATE * Priority EVALUATE WHEN OTHER PERFORM PROCESS-UNKNOWN END-EVALUATE * Status EVALUATE
Each EVALUATE must have its own END-EVALUATE terminator.
These examples demonstrate how to use the END-EVALUATE clause effectively in different conditional logic scenarios.
1234567891011121314151617181920212223242526272829303132IDENTIFICATION DIVISION. PROGRAM-ID. BASIC-EVALUATE-EXAMPLE. DATA DIVISION. WORKING-STORAGE SECTION. 01 WS-STATUS PIC X(10). 01 WS-MESSAGE PIC X(50). PROCEDURE DIVISION. MAIN-PROCESS. * Set status for testing MOVE "ACTIVE" TO WS-STATUS * Evaluate status with proper END-EVALUATE EVALUATE WS-STATUS WHEN "ACTIVE" MOVE "System is active and running" TO WS-MESSAGE DISPLAY WS-MESSAGE WHEN "INACTIVE" MOVE "System is inactive" TO WS-MESSAGE DISPLAY WS-MESSAGE WHEN "ERROR" MOVE "System error detected" TO WS-MESSAGE DISPLAY WS-MESSAGE WHEN OTHER MOVE "Unknown system status" TO WS-MESSAGE DISPLAY WS-MESSAGE END-EVALUATE * Continue with program logic DISPLAY "Processing complete" STOP RUN.
Basic EVALUATE structure with proper END-EVALUATE termination.
1234567891011121314151617181920212223242526272829303132333435363738394041424344IDENTIFICATION DIVISION. PROGRAM-ID. COMPLEX-EVALUATE-EXAMPLE. DATA DIVISION. WORKING-STORAGE SECTION. 01 WS-AGE PIC 9(3). 01 WS-INCOME PIC 9(8). 01 WS-CATEGORY PIC X(20). PROCEDURE DIVISION. MAIN-PROCESS. * Set test values MOVE 25 TO WS-AGE MOVE 50000 TO WS-INCOME * Complex evaluation with multiple conditions EVALUATE TRUE WHEN WS-AGE < 18 MOVE "Minor" TO WS-CATEGORY WHEN WS-AGE >= 18 AND WS-AGE < 25 IF WS-INCOME < 30000 MOVE "Young Adult - Low Income" TO WS-CATEGORY ELSE MOVE "Young Adult - High Income" TO WS-CATEGORY END-IF WHEN WS-AGE >= 25 AND WS-AGE < 65 EVALUATE WS-INCOME WHEN 0 THRU 30000 MOVE "Working Adult - Low Income" TO WS-CATEGORY WHEN 30001 THRU 75000 MOVE "Working Adult - Middle Income" TO WS-CATEGORY WHEN 75001 THRU 999999 MOVE "Working Adult - High Income" TO WS-CATEGORY WHEN OTHER MOVE "Working Adult - Very High Income" TO WS-CATEGORY END-EVALUATE * Income evaluation WHEN WS-AGE >= 65 MOVE "Senior" TO WS-CATEGORY WHEN OTHER MOVE "Unknown Category" TO WS-CATEGORY END-EVALUATE * Age evaluation DISPLAY "Category: " WS-CATEGORY STOP RUN.
Complex nested EVALUATE with proper END-EVALUATE termination for each level.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657IDENTIFICATION DIVISION. PROGRAM-ID. ERROR-HANDLING-EVALUATE. DATA DIVISION. WORKING-STORAGE SECTION. 01 WS-ERROR-CODE PIC X(2). 01 WS-ERROR-MESSAGE PIC X(100). 01 WS-ACTION PIC X(20). PROCEDURE DIVISION. MAIN-PROCESS. * Simulate different error codes MOVE "01" TO WS-ERROR-CODE * Handle errors with EVALUATE EVALUATE WS-ERROR-CODE WHEN "01" MOVE "File not found - Check file path" TO WS-ERROR-MESSAGE MOVE "RETRY" TO WS-ACTION WHEN "02" MOVE "Invalid data format - Verify input" TO WS-ERROR-MESSAGE MOVE "VALIDATE" TO WS-ACTION WHEN "03" MOVE "Permission denied - Check access rights" TO WS-ERROR-MESSAGE MOVE "CONTACT_ADMIN" TO WS-ACTION WHEN "04" MOVE "Network timeout - Check connection" TO WS-ERROR-MESSAGE MOVE "RETRY" TO WS-ACTION WHEN "05" MOVE "Memory allocation failed - System overloaded" TO WS-ERROR-MESSAGE MOVE "WAIT" TO WS-ACTION WHEN OTHER MOVE "Unknown error - Contact system administrator" TO WS-ERROR-MESSAGE MOVE "CONTACT_SUPPORT" TO WS-ACTION END-EVALUATE * Process the error DISPLAY "Error: " WS-ERROR-MESSAGE DISPLAY "Action: " WS-ACTION * Take action based on error type EVALUATE WS-ACTION WHEN "RETRY" DISPLAY "Attempting to retry operation" WHEN "VALIDATE" DISPLAY "Validating input data" WHEN "CONTACT_ADMIN" DISPLAY "Contacting system administrator" WHEN "WAIT" DISPLAY "Waiting for system resources" WHEN "CONTACT_SUPPORT" DISPLAY "Contacting technical support" WHEN OTHER DISPLAY "Taking default action" END-EVALUATE STOP RUN.
Error handling using nested EVALUATE statements with proper END-EVALUATE termination.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263IDENTIFICATION DIVISION. PROGRAM-ID. MENU-SYSTEM-EVALUATE. DATA DIVISION. WORKING-STORAGE SECTION. 01 WS-MENU-CHOICE PIC 9(1). 01 WS-CONTINUE PIC X(1) VALUE "Y". PROCEDURE DIVISION. MAIN-PROCESS. PERFORM UNTIL WS-CONTINUE = "N" * Display menu DISPLAY "=== MENU SYSTEM ===" DISPLAY "1. Add Record" DISPLAY "2. Update Record" DISPLAY "3. Delete Record" DISPLAY "4. View Records" DISPLAY "5. Exit" DISPLAY "Enter choice (1-5): " ACCEPT WS-MENU-CHOICE * Process menu choice with EVALUATE EVALUATE WS-MENU-CHOICE WHEN 1 DISPLAY "Adding new record..." PERFORM ADD-RECORD WHEN 2 DISPLAY "Updating record..." PERFORM UPDATE-RECORD WHEN 3 DISPLAY "Deleting record..." PERFORM DELETE-RECORD WHEN 4 DISPLAY "Viewing records..." PERFORM VIEW-RECORDS WHEN 5 DISPLAY "Exiting program..." MOVE "N" TO WS-CONTINUE WHEN OTHER DISPLAY "Invalid choice. Please try again." END-EVALUATE * Ask if user wants to continue IF WS-CONTINUE = "Y" DISPLAY "Continue? (Y/N): " ACCEPT WS-CONTINUE END-IF END-PERFORM STOP RUN. ADD-RECORD. DISPLAY "Record added successfully". UPDATE-RECORD. DISPLAY "Record updated successfully". DELETE-RECORD. DISPLAY "Record deleted successfully". VIEW-RECORDS. DISPLAY "Records displayed successfully".
Menu system using EVALUATE with proper END-EVALUATE termination.
Understanding best practices ensures proper EVALUATE block structure and program flow.
Pitfall | Problem | Solution |
---|---|---|
Missing END-EVALUATE | Compilation error | Always include END-EVALUATE |
Mismatched nesting | Logic errors | Use proper indentation and comments |
Missing WHEN OTHER | Unexpected behavior | Include WHEN OTHER clause |
Poor structure | Hard to maintain | Use consistent formatting |
Complex nesting | Difficult to debug | Limit nesting depth |
12345678910111213141516171819202122232425* Good structure with comments EVALUATE WS-STATUS WHEN "ACTIVE" PERFORM PROCESS-ACTIVE WHEN "INACTIVE" PERFORM PROCESS-INACTIVE WHEN OTHER PERFORM PROCESS-UNKNOWN END-EVALUATE * Status evaluation * Nested structure with clear marking EVALUATE WS-CATEGORY WHEN "A" EVALUATE WS-SUBTYPE WHEN "X" PERFORM PROCESS-AX WHEN "Y" PERFORM PROCESS-AY END-EVALUATE * Subtype evaluation WHEN "B" PERFORM PROCESS-B END-EVALUATE * Category evaluation * Avoid excessive nesting * Use separate procedures instead of deep nesting
Proper structure and commenting make EVALUATE blocks easier to understand and maintain.
Usage | Syntax | Example |
---|---|---|
Basic termination | EVALUATE...END-EVALUATE | EVALUATE WS-VALUE WHEN 1...END-EVALUATE |
With WHEN OTHER | EVALUATE...WHEN OTHER...END-EVALUATE | EVALUATE WS-STATUS WHEN "A"...WHEN OTHER...END-EVALUATE |
Nested structure | EVALUATE...EVALUATE...END-EVALUATE...END-EVALUATE | EVALUATE A...EVALUATE B...END-EVALUATE...END-EVALUATE |
Multiple WHEN | EVALUATE...WHEN...WHEN...END-EVALUATE | EVALUATE WS-CHOICE WHEN 1...WHEN 2...END-EVALUATE |
With comments | END-EVALUATE * Comment | END-EVALUATE * Status evaluation |
1. What is the primary purpose of the END-EVALUATE clause in COBOL?
2. Which statement does END-EVALUATE terminate?
3. What happens if you forget to include END-EVALUATE?
4. Can you nest EVALUATE statements?
5. What comes after END-EVALUATE?
EVALUATE statement for multi-way conditional logic.
WHEN clause for conditional execution in EVALUATE.
IF statement for simple conditional logic.
Conditional execution and control flow in COBOL.
Program structure and organization in COBOL.