The CLASS clause in COBOL provides powerful data classification and validation capabilities, enabling developers to define custom character classes, perform data type validation, and implement sophisticated data quality checks. This clause is essential for input validation, data cleansing operations, character set verification, and business rule enforcement in enterprise applications where data integrity and type safety are paramount for maintaining system reliability and ensuring compliance with business requirements and regulatory standards.
CLASS conditions allow you to test whether data items belong to specific character classes such as ALPHABETIC, NUMERIC, ALPHANUMERIC, or custom-defined classes. These conditions are crucial for data validation, input verification, and ensuring data conforms to expected formats and business rules.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129*> Basic CLASS condition usage for data validation DATA DIVISION. WORKING-STORAGE SECTION. 01 INPUT-VALIDATION-DATA. 05 CUSTOMER-NAME PIC X(30). 05 CUSTOMER-ID PIC X(10). 05 PHONE-NUMBER PIC X(15). 05 EMAIL-ADDRESS PIC X(50). 05 POSTAL-CODE PIC X(10). 01 VALIDATION-RESULTS. 05 NAME-STATUS PIC X(10). 05 ID-STATUS PIC X(10). 05 PHONE-STATUS PIC X(10). 05 EMAIL-STATUS PIC X(10). 05 POSTAL-STATUS PIC X(10). 05 OVERALL-STATUS PIC X(10). 01 VALIDATION-COUNTERS. 05 TOTAL-FIELDS PIC 9(2) VALUE 5. 05 VALID-FIELDS PIC 9(2) VALUE ZERO. 05 INVALID-FIELDS PIC 9(2) VALUE ZERO. PROCEDURE DIVISION. BASIC-CLASS-VALIDATION. PERFORM INITIALIZE-VALIDATION PERFORM VALIDATE-CUSTOMER-DATA PERFORM CALCULATE-VALIDATION-SUMMARY PERFORM DISPLAY-VALIDATION-RESULTS. INITIALIZE-VALIDATION. MOVE "John Doe" TO CUSTOMER-NAME MOVE "CUST123456" TO CUSTOMER-ID MOVE "555-123-4567" TO PHONE-NUMBER MOVE "john@email.com" TO EMAIL-ADDRESS MOVE "12345" TO POSTAL-CODE MOVE ZERO TO VALID-FIELDS INVALID-FIELDS. VALIDATE-CUSTOMER-DATA. *> Validate customer name (should be alphabetic with spaces) IF CUSTOMER-NAME IS ALPHABETIC MOVE "VALID" TO NAME-STATUS ADD 1 TO VALID-FIELDS ELSE MOVE "INVALID" TO NAME-STATUS ADD 1 TO INVALID-FIELDS DISPLAY "Name validation failed: " CUSTOMER-NAME END-IF *> Validate customer ID (should be alphanumeric) IF CUSTOMER-ID IS ALPHANUMERIC MOVE "VALID" TO ID-STATUS ADD 1 TO VALID-FIELDS ELSE MOVE "INVALID" TO ID-STATUS ADD 1 TO INVALID-FIELDS DISPLAY "ID validation failed: " CUSTOMER-ID END-IF *> Validate postal code (should be numeric) IF POSTAL-CODE IS NUMERIC MOVE "VALID" TO POSTAL-STATUS ADD 1 TO VALID-FIELDS ELSE MOVE "INVALID" TO POSTAL-STATUS ADD 1 TO INVALID-FIELDS DISPLAY "Postal code validation failed: " POSTAL-CODE END-IF *> Phone and email require custom validation PERFORM VALIDATE-PHONE-NUMBER PERFORM VALIDATE-EMAIL-ADDRESS. VALIDATE-PHONE-NUMBER. *> Custom validation for phone number format MOVE "VALID" TO PHONE-STATUS *> Check basic format requirements IF PHONE-NUMBER(4:1) NOT = "-" OR PHONE-NUMBER(8:1) NOT = "-" MOVE "INVALID" TO PHONE-STATUS ADD 1 TO INVALID-FIELDS DISPLAY "Phone format error: missing dashes" ELSE *> Check if area code and numbers are numeric IF PHONE-NUMBER(1:3) IS NOT NUMERIC OR PHONE-NUMBER(5:3) IS NOT NUMERIC OR PHONE-NUMBER(9:4) IS NOT NUMERIC MOVE "INVALID" TO PHONE-STATUS ADD 1 TO INVALID-FIELDS DISPLAY "Phone format error: non-numeric digits" ELSE ADD 1 TO VALID-FIELDS END-IF END-IF. VALIDATE-EMAIL-ADDRESS. *> Basic email validation using class conditions MOVE "VALID" TO EMAIL-STATUS *> Check for @ symbol presence MOVE ZERO TO WS-AT-COUNT INSPECT EMAIL-ADDRESS TALLYING WS-AT-COUNT FOR ALL "@" IF WS-AT-COUNT NOT = 1 MOVE "INVALID" TO EMAIL-STATUS ADD 1 TO INVALID-FIELDS DISPLAY "Email error: invalid @ symbol count" ELSE ADD 1 TO VALID-FIELDS END-IF. CALCULATE-VALIDATION-SUMMARY. IF INVALID-FIELDS = ZERO MOVE "PASS" TO OVERALL-STATUS ELSE MOVE "FAIL" TO OVERALL-STATUS END-IF. DISPLAY-VALIDATION-RESULTS. DISPLAY "=== Validation Results ===" DISPLAY "Customer Name: " NAME-STATUS DISPLAY "Customer ID: " ID-STATUS DISPLAY "Phone Number: " PHONE-STATUS DISPLAY "Email Address: " EMAIL-STATUS DISPLAY "Postal Code: " POSTAL-STATUS DISPLAY "Overall Status: " OVERALL-STATUS DISPLAY "Valid Fields: " VALID-FIELDS " of " TOTAL-FIELDS.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245*> Custom class definitions for specialized validation ENVIRONMENT DIVISION. CONFIGURATION SECTION. SPECIAL-NAMES. CLASS VOWELS IS "AEIOUaeiou" CLASS CONSONANTS IS "BCDFGHJKLMNPQRSTVWXYZbcdfghjklmnpqrstvwxyz" CLASS DIGITS IS "0123456789" CLASS HEXADECIMAL IS "0123456789ABCDEFabcdef" CLASS PHONE-CHARS IS "0123456789()-. " CLASS EMAIL-CHARS IS "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789@.-_" CLASS CURRENCY-CHARS IS "0123456789.,$" CLASS PASSWORD-SPECIAL IS "!@#$%^&*()_+-=[]{}|;:,.<>?". DATA DIVISION. WORKING-STORAGE SECTION. 01 CUSTOM-CLASS-TESTING. 05 TEST-STRING PIC X(50). 05 VOWEL-COUNT PIC 9(3) VALUE ZERO. 05 CONSONANT-COUNT PIC 9(3) VALUE ZERO. 05 DIGIT-COUNT PIC 9(3) VALUE ZERO. 05 SPECIAL-COUNT PIC 9(3) VALUE ZERO. 01 ADVANCED-VALIDATION. 05 PASSWORD-INPUT PIC X(20). 05 HEX-COLOR-CODE PIC X(7). 05 CURRENCY-AMOUNT PIC X(15). 05 PHONE-INPUT PIC X(20). 05 EMAIL-INPUT PIC X(50). 01 VALIDATION-CRITERIA. 05 MIN-PASSWORD-LENGTH PIC 9(2) VALUE 8. 05 MIN-VOWELS PIC 9(2) VALUE 1. 05 MIN-CONSONANTS PIC 9(2) VALUE 3. 05 MIN-DIGITS PIC 9(2) VALUE 1. 05 MIN-SPECIAL-CHARS PIC 9(2) VALUE 1. 01 VALIDATION-FLAGS. 05 PASSWORD-STRONG PIC X VALUE 'N'. 88 STRONG-PASSWORD VALUE 'Y'. 05 HEX-VALID PIC X VALUE 'N'. 88 VALID-HEX VALUE 'Y'. 05 CURRENCY-VALID PIC X VALUE 'N'. 88 VALID-CURRENCY VALUE 'Y'. 05 PHONE-VALID PIC X VALUE 'N'. 88 VALID-PHONE VALUE 'Y'. 05 EMAIL-VALID PIC X VALUE 'N'. 88 VALID-EMAIL VALUE 'Y'. PROCEDURE DIVISION. CUSTOM-CLASS-VALIDATION. PERFORM INITIALIZE-CUSTOM-TESTING PERFORM ANALYZE-TEXT-COMPOSITION PERFORM VALIDATE-COMPLEX-FORMATS PERFORM DISPLAY-CUSTOM-RESULTS. INITIALIZE-CUSTOM-TESTING. MOVE "Hello World 123!" TO TEST-STRING MOVE "MyP@ssw0rd123!" TO PASSWORD-INPUT MOVE "#FF5733" TO HEX-COLOR-CODE MOVE "$1,234.56" TO CURRENCY-AMOUNT MOVE "(555) 123-4567" TO PHONE-INPUT MOVE "user@domain.com" TO EMAIL-INPUT MOVE ZERO TO VOWEL-COUNT CONSONANT-COUNT DIGIT-COUNT SPECIAL-COUNT. ANALYZE-TEXT-COMPOSITION. *> Count different character types using custom classes PERFORM VARYING WS-POS FROM 1 BY 1 UNTIL WS-POS > FUNCTION LENGTH(TEST-STRING) MOVE TEST-STRING(WS-POS:1) TO WS-CHAR IF WS-CHAR IS VOWELS ADD 1 TO VOWEL-COUNT ELSE IF WS-CHAR IS CONSONANTS ADD 1 TO CONSONANT-COUNT ELSE IF WS-CHAR IS DIGITS ADD 1 TO DIGIT-COUNT ELSE ADD 1 TO SPECIAL-COUNT END-IF END-PERFORM DISPLAY "Text Analysis for: " TEST-STRING DISPLAY "Vowels: " VOWEL-COUNT DISPLAY "Consonants: " CONSONANT-COUNT DISPLAY "Digits: " DIGIT-COUNT DISPLAY "Special Characters: " SPECIAL-COUNT. VALIDATE-COMPLEX-FORMATS. PERFORM VALIDATE-PASSWORD-STRENGTH PERFORM VALIDATE-HEX-COLOR PERFORM VALIDATE-CURRENCY-FORMAT PERFORM VALIDATE-PHONE-FORMAT PERFORM VALIDATE-EMAIL-FORMAT. VALIDATE-PASSWORD-STRENGTH. MOVE 'Y' TO PASSWORD-STRONG MOVE ZERO TO VOWEL-COUNT CONSONANT-COUNT DIGIT-COUNT SPECIAL-COUNT *> Check minimum length IF FUNCTION LENGTH(FUNCTION TRIM(PASSWORD-INPUT)) < MIN-PASSWORD-LENGTH MOVE 'N' TO PASSWORD-STRONG DISPLAY "Password too short (minimum " MIN-PASSWORD-LENGTH " characters)" END-IF *> Analyze password composition PERFORM VARYING WS-POS FROM 1 BY 1 UNTIL WS-POS > FUNCTION LENGTH(PASSWORD-INPUT) MOVE PASSWORD-INPUT(WS-POS:1) TO WS-CHAR IF WS-CHAR IS VOWELS ADD 1 TO VOWEL-COUNT ELSE IF WS-CHAR IS CONSONANTS ADD 1 TO CONSONANT-COUNT ELSE IF WS-CHAR IS DIGITS ADD 1 TO DIGIT-COUNT ELSE IF WS-CHAR IS PASSWORD-SPECIAL ADD 1 TO SPECIAL-COUNT END-IF END-PERFORM *> Check composition requirements IF VOWEL-COUNT < MIN-VOWELS MOVE 'N' TO PASSWORD-STRONG DISPLAY "Password needs more vowels" END-IF IF CONSONANT-COUNT < MIN-CONSONANTS MOVE 'N' TO PASSWORD-STRONG DISPLAY "Password needs more consonants" END-IF IF DIGIT-COUNT < MIN-DIGITS MOVE 'N' TO PASSWORD-STRONG DISPLAY "Password needs more digits" END-IF IF SPECIAL-COUNT < MIN-SPECIAL-CHARS MOVE 'N' TO PASSWORD-STRONG DISPLAY "Password needs more special characters" END-IF. VALIDATE-HEX-COLOR. MOVE 'Y' TO HEX-VALID *> Check if starts with # IF HEX-COLOR-CODE(1:1) NOT = "#" MOVE 'N' TO HEX-VALID DISPLAY "Hex color must start with #" ELSE *> Check if remaining characters are hexadecimal PERFORM VARYING WS-POS FROM 2 BY 1 UNTIL WS-POS > 7 MOVE HEX-COLOR-CODE(WS-POS:1) TO WS-CHAR IF WS-CHAR IS NOT HEXADECIMAL MOVE 'N' TO HEX-VALID DISPLAY "Invalid hex character: " WS-CHAR EXIT PERFORM END-IF END-PERFORM END-IF. VALIDATE-CURRENCY-FORMAT. MOVE 'Y' TO CURRENCY-VALID *> Check if all characters are valid for currency PERFORM VARYING WS-POS FROM 1 BY 1 UNTIL WS-POS > FUNCTION LENGTH(CURRENCY-AMOUNT) MOVE CURRENCY-AMOUNT(WS-POS:1) TO WS-CHAR IF WS-CHAR IS NOT CURRENCY-CHARS MOVE 'N' TO CURRENCY-VALID DISPLAY "Invalid currency character: " WS-CHAR EXIT PERFORM END-IF END-PERFORM. VALIDATE-PHONE-FORMAT. MOVE 'Y' TO PHONE-VALID *> Check if all characters are valid for phone numbers PERFORM VARYING WS-POS FROM 1 BY 1 UNTIL WS-POS > FUNCTION LENGTH(PHONE-INPUT) MOVE PHONE-INPUT(WS-POS:1) TO WS-CHAR IF WS-CHAR IS NOT PHONE-CHARS MOVE 'N' TO PHONE-VALID DISPLAY "Invalid phone character: " WS-CHAR EXIT PERFORM END-IF END-PERFORM. VALIDATE-EMAIL-FORMAT. MOVE 'Y' TO EMAIL-VALID *> Check if all characters are valid for email PERFORM VARYING WS-POS FROM 1 BY 1 UNTIL WS-POS > FUNCTION LENGTH(EMAIL-INPUT) MOVE EMAIL-INPUT(WS-POS:1) TO WS-CHAR IF WS-CHAR IS NOT EMAIL-CHARS MOVE 'N' TO EMAIL-VALID DISPLAY "Invalid email character: " WS-CHAR EXIT PERFORM END-IF END-PERFORM. DISPLAY-CUSTOM-RESULTS. DISPLAY "=== Custom Class Validation Results ===" IF STRONG-PASSWORD DISPLAY "Password Strength: STRONG" ELSE DISPLAY "Password Strength: WEAK" END-IF IF VALID-HEX DISPLAY "Hex Color Code: VALID" ELSE DISPLAY "Hex Color Code: INVALID" END-IF IF VALID-CURRENCY DISPLAY "Currency Format: VALID" ELSE DISPLAY "Currency Format: INVALID" END-IF IF VALID-PHONE DISPLAY "Phone Format: VALID" ELSE DISPLAY "Phone Format: INVALID" END-IF IF VALID-EMAIL DISPLAY "Email Format: VALID" ELSE DISPLAY "Email Format: INVALID" END-IF.
ALPHABETIC accepts both uppercase and lowercase letters plus spaces, while ALPHABETIC-UPPER only accepts uppercase letters A-Z and spaces. ALPHABETIC-LOWER only accepts lowercase letters a-z and spaces. Use the specific variants when you need to enforce case requirements.
Yes, custom classes can have overlapping character sets. For example, you could define both VOWELS and LETTERS classes where VOWELS is a subset of LETTERS. This allows for hierarchical validation where data can be tested against multiple class criteria.
Standard ALPHABETIC classes include spaces as valid characters. NUMERIC classes typically include digits and optional signs. For special characters, you must define custom classes. Empty or space-only fields may pass ALPHABETIC tests but fail business logic validation.
Yes, class conditions are case-sensitive unless you specifically include both cases in your custom class definition. If you need case-insensitive validation, either convert data to a consistent case first or include both uppercase and lowercase characters in your custom class definition.
Class conditions work with any data item, including those defined with REDEFINES or elements of OCCURS arrays. You can test individual array elements or use loops to validate entire arrays. However, you cannot apply a class condition to an entire array in a single test.
Standard COBOL class conditions work with the character set defined by your system. For Unicode or international characters, you may need to use NATIONAL data types and corresponding class definitions, or implement custom validation logic using character codes and ranges appropriate for your target character sets.
1. Which class condition would validate a field containing "Hello World"?
2. Where do you define custom classes in COBOL?
3. What would "12345" be classified as?
Answers: 1-B, 2-C, 3-C