MainframeMaster

COBOL Tutorial

COBOL CLASS

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.

Understanding CLASS Conditions

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.

Standard Class Types:

  • ALPHABETIC - Contains only letters A-Z and spaces
  • ALPHABETIC-LOWER - Contains only lowercase letters a-z and spaces
  • ALPHABETIC-UPPER - Contains only uppercase letters A-Z and spaces
  • NUMERIC - Contains only digits 0-9 and optional sign
  • ALPHANUMERIC - Contains any valid character combination
  • Custom classes - User-defined character sets for specialized validation
cobol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
*> 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.

Custom Class Definitions

cobol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
*> 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.

Best Practices and Guidelines

CLASS Usage Guidelines:

  • Define custom classes in SPECIAL-NAMES for reusable validation logic
  • Use appropriate class tests for data type validation and input verification
  • Combine class conditions with other validation rules for comprehensive checks
  • Document custom class definitions clearly for maintenance and team understanding
  • Test class conditions with edge cases and boundary values
  • Consider performance implications of complex class validation in high-volume processing
  • Use class conditions early in processing pipelines to catch invalid data quickly
  • Implement proper error handling and user feedback for failed class validations

Comprehensive FAQ

Q: What's the difference between ALPHABETIC and ALPHABETIC-UPPER?

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.

Q: Can I define overlapping custom classes?

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.

Q: How do class conditions handle spaces and special characters?

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.

Q: Are class conditions case-sensitive?

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.

Q: Can I use class conditions with REDEFINES or OCCURS clauses?

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.

Q: How do I validate international characters or Unicode?

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.

Interactive Quiz

Test Your CLASS Knowledge

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