MainframeMaster

COBOL Tutorial

Data Validation Techniques in COBOL

Progress0 of 0 lessons

Input Data Validation Methods

Data validation is a critical component of any COBOL application. It ensures that input data meets the required format, type, and business rules before processing. Proper validation helps prevent errors, system crashes, and data integrity issues.

Validation Strategy

  • Validate data as early as possible in the processing flow
  • Implement multiple layers of validation (field level, record level, cross-record)
  • Provide clear error messages that identify the specific validation failure
  • Log validation errors for analysis and reporting
  • Establish consistent error handling procedures

Common Validation Techniques

cobol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
* Using condition names (88-level items) 01 TRANSACTION-TYPE PIC X. 88 VALID-TRANS-TYPE VALUE "A" "D" "U" "I". IF NOT VALID-TRANS-TYPE PERFORM INVALID-TRANS-TYPE-ERROR EXIT PARAGRAPH END-IF. * Using class conditions IF NOT INPUT-AMOUNT IS NUMERIC PERFORM INVALID-AMOUNT-ERROR EXIT PARAGRAPH END-IF. * Using relational conditions IF INPUT-QUANTITY <= ZERO OR INPUT-QUANTITY > 9999 PERFORM INVALID-QUANTITY-ERROR EXIT PARAGRAPH END-IF.

These basic techniques can be combined to create comprehensive validation logic.

Comprehensive Field 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
VALIDATE-CUSTOMER-RECORD. PERFORM VALIDATE-CUSTOMER-ID. IF VALID-DATA PERFORM VALIDATE-CUSTOMER-NAME END-IF. IF VALID-DATA PERFORM VALIDATE-CUSTOMER-ADDRESS END-IF. IF VALID-DATA PERFORM VALIDATE-CUSTOMER-PHONE END-IF. EXIT. VALIDATE-CUSTOMER-ID. IF CUSTOMER-ID IS NOT NUMERIC MOVE "Customer ID must be numeric" TO ERROR-MESSAGE MOVE "CUSTOMER-ID" TO ERROR-FIELD MOVE "E001" TO ERROR-CODE MOVE "N" TO VALID-DATA EXIT PARAGRAPH END-IF. IF CUSTOMER-ID < 100000 OR CUSTOMER-ID > 999999 MOVE "Customer ID must be 6 digits" TO ERROR-MESSAGE MOVE "CUSTOMER-ID" TO ERROR-FIELD MOVE "E002" TO ERROR-CODE MOVE "N" TO VALID-DATA EXIT PARAGRAPH END-IF. MOVE "Y" TO VALID-DATA. EXIT.

A modular approach with dedicated validation routines for each field helps maintain organization and readability.

Required Fields Validation

cobol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
VALIDATE-REQUIRED-FIELDS. IF CUSTOMER-NAME = SPACES MOVE "Customer name is required" TO ERROR-MESSAGE MOVE "CUSTOMER-NAME" TO ERROR-FIELD MOVE "E010" TO ERROR-CODE MOVE "N" TO VALID-DATA EXIT PARAGRAPH END-IF. IF CUSTOMER-ADDRESS = SPACES MOVE "Customer address is required" TO ERROR-MESSAGE MOVE "CUSTOMER-ADDRESS" TO ERROR-FIELD MOVE "E011" TO ERROR-CODE MOVE "N" TO VALID-DATA EXIT PARAGRAPH END-IF. MOVE "Y" TO VALID-DATA. EXIT.

Checking for required fields ensures that all necessary data is provided before processing.

Numeric Data Validation

Numeric data validation is essential for financial and calculation-intensive COBOL applications. It ensures that numeric fields contain valid digits, are within acceptable ranges, and follow required formats.

Class Condition Checks

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
* Basic numeric check IF INPUT-AMOUNT IS NOT NUMERIC MOVE "Amount must contain only numeric digits" TO ERROR-MESSAGE MOVE "N" TO VALID-DATA END-IF. * Checking for sign IF INPUT-BALANCE IS NOT NUMERIC MOVE "Balance must be numeric" TO ERROR-MESSAGE ELSE IF INPUT-BALANCE IS NEGATIVE AND ACCOUNT-TYPE = "S" MOVE "Savings account cannot have negative balance" TO ERROR-MESSAGE MOVE "N" TO VALID-DATA END-IF END-IF. * Other class conditions IF INPUT-NAME IS NOT ALPHABETIC MOVE "Name must contain only letters" TO ERROR-MESSAGE MOVE "N" TO VALID-DATA END-IF. IF INPUT-CODE IS NOT ALPHANUMERIC MOVE "Code must be alphanumeric" TO ERROR-MESSAGE MOVE "N" TO VALID-DATA END-IF.

COBOL provides built-in class conditions to check the type of data in a field.

Range Validation for Numeric Fields

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
* Simple range check IF INTEREST-RATE < 0.01 OR INTEREST-RATE > 30.00 MOVE "Interest rate must be between 0.01 and 30.00" TO ERROR-MESSAGE MOVE "N" TO VALID-DATA END-IF. * Using 88-level conditions for ranges 01 STUDENT-GRADE PIC 999V9. 88 VALID-GRADE VALUE 0 THRU 100. 88 PASSING-GRADE VALUE 60 THRU 100. 88 FAILING-GRADE VALUE 0 THRU 59.9. IF NOT VALID-GRADE MOVE "Grade must be between 0 and 100" TO ERROR-MESSAGE MOVE "N" TO VALID-DATA END-IF. * Complex checks based on other fields EVALUATE TRUE WHEN ACCOUNT-TYPE = "S" AND WITHDRAWAL-AMOUNT > CURRENT-BALANCE MOVE "Insufficient funds in savings account" TO ERROR-MESSAGE MOVE "N" TO VALID-DATA WHEN ACCOUNT-TYPE = "C" AND WITHDRAWAL-AMOUNT > (CURRENT-BALANCE + OVERDRAFT-LIMIT) MOVE "Amount exceeds available funds and overdraft" TO ERROR-MESSAGE MOVE "N" TO VALID-DATA END-EVALUATE.

Range checks ensure that numeric values fall within acceptable business limits.

Decimal and Scale 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
* Check for proper decimal alignment 01 NUMERIC-WORK-AREAS. 05 DECIMAL-CHECK PIC 9(5)V99. 05 DECIMAL-STRING REDEFINES DECIMAL-CHECK PIC X(7). 05 DECIMAL-PARTS. 10 WHOLE-PART PIC X(5). 10 DECIMAL-POINT PIC X VALUE ".". 10 FRAC-PART PIC X(2). VALIDATE-DECIMAL-FORMAT. MOVE INPUT-AMOUNT TO DECIMAL-CHECK MOVE DECIMAL-CHECK TO DECIMAL-PARTS IF DECIMAL-STRING IS NOT NUMERIC MOVE "Amount must be numeric" TO ERROR-MESSAGE MOVE "N" TO VALID-DATA ELSE IF FRAC-PART = "00" OR FRAC-PART = "50" CONTINUE ELSE MOVE "Cents must be either .00 or .50" TO ERROR-MESSAGE MOVE "N" TO VALID-DATA END-IF END-IF.

Some business rules require validating the decimal portion of numeric values.

Mathematical 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
* Check digit validation (simplified example) VALIDATE-ACCOUNT-NUMBER. MOVE ZERO TO CHECKSUM MOVE ZERO TO POSITION PERFORM VARYING POSITION FROM 1 BY 1 UNTIL POSITION > 9 COMPUTE DIGIT = FUNCTION NUMVAL(ACCOUNT-NUMBER(POSITION:1)) COMPUTE WEIGHT = 10 - POSITION COMPUTE CHECKSUM = CHECKSUM + (DIGIT * WEIGHT) END-PERFORM COMPUTE EXPECTED-CHECK-DIGIT = FUNCTION MOD(CHECKSUM 11) COMPUTE ACTUAL-CHECK-DIGIT = FUNCTION NUMVAL(ACCOUNT-NUMBER(10:1)) IF EXPECTED-CHECK-DIGIT NOT = ACTUAL-CHECK-DIGIT MOVE "Invalid account number (check digit failed)" TO ERROR-MESSAGE MOVE "N" TO VALID-DATA END-IF. * Total verification IF ORDER-TOTAL NOT = SUBTOTAL + TAX-AMOUNT - DISCOUNT-AMOUNT MOVE "Order total does not match calculated amount" TO ERROR-MESSAGE MOVE "N" TO VALID-DATA END-IF.

Mathematical validation can include check digits, cross-field calculations, and total verification.

Date and Code Validation

Date validation is one of the most common and important validation tasks in COBOL applications. Improper date validation can lead to processing errors, incorrect calculations, and even system failures.

Basic Date Format 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
* Validate date in YYYYMMDD format 01 WS-DATE PIC X(8). 01 WS-DATE-PARTS REDEFINES WS-DATE. 05 WS-YEAR PIC X(4). 05 WS-MONTH PIC X(2). 05 WS-DAY PIC X(2). VALIDATE-DATE-FORMAT. MOVE INPUT-DATE TO WS-DATE * Check if all parts are numeric IF WS-DATE IS NOT NUMERIC MOVE "Date must contain only digits" TO ERROR-MESSAGE MOVE "N" TO VALID-DATA EXIT PARAGRAPH END-IF * Check month range IF WS-MONTH < "01" OR WS-MONTH > "12" MOVE "Month must be between 01 and 12" TO ERROR-MESSAGE MOVE "N" TO VALID-DATA EXIT PARAGRAPH END-IF * Check day range (simplified) IF WS-DAY < "01" OR WS-DAY > "31" MOVE "Day must be between 01 and 31" TO ERROR-MESSAGE MOVE "N" TO VALID-DATA EXIT PARAGRAPH END-IF * More detailed validation for days per month would go here MOVE "Y" TO VALID-DATA. EXIT.

Basic date validation checks that the format is correct and the components are within valid ranges.

Comprehensive Date 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
01 DATE-VALIDATION-AREAS. 05 WS-DATE PIC X(8). 05 WS-DATE-NUM PIC 9(8). 05 WS-DATE-PARTS REDEFINES WS-DATE-NUM. 10 WS-YEAR PIC 9(4). 10 WS-MONTH PIC 9(2). 10 WS-DAY PIC 9(2). 05 WS-DAYS-IN-MONTH PIC 9(2) VALUE ZEROS. 05 WS-DATE-INTEGER PIC 9(8) VALUE ZEROS. VALIDATE-DATE. MOVE INPUT-DATE TO WS-DATE * Check if all parts are numeric IF WS-DATE IS NOT NUMERIC MOVE "Date must contain only digits" TO ERROR-MESSAGE MOVE "N" TO VALID-DATA EXIT PARAGRAPH END-IF MOVE WS-DATE TO WS-DATE-NUM * Check year range for business requirements IF WS-YEAR < 1900 OR WS-YEAR > 2100 MOVE "Year must be between 1900 and 2100" TO ERROR-MESSAGE MOVE "N" TO VALID-DATA EXIT PARAGRAPH END-IF * Check month range IF WS-MONTH < 1 OR WS-MONTH > 12 MOVE "Month must be between 01 and 12" TO ERROR-MESSAGE MOVE "N" TO VALID-DATA EXIT PARAGRAPH END-IF * Determine days in month (simplified) EVALUATE WS-MONTH WHEN 1 WHEN 3 WHEN 5 WHEN 7 WHEN 8 WHEN 10 WHEN 12 MOVE 31 TO WS-DAYS-IN-MONTH WHEN 4 WHEN 6 WHEN 9 WHEN 11 MOVE 30 TO WS-DAYS-IN-MONTH WHEN 2 COMPUTE WS-DAYS-IN-MONTH = 28 + ((WS-YEAR FUNCTION MOD 4 = 0) AND NOT (WS-YEAR FUNCTION MOD 100 = 0) OR (WS-YEAR FUNCTION MOD 400 = 0)) END-EVALUATE * Check day range IF WS-DAY < 1 OR WS-DAY > WS-DAYS-IN-MONTH MOVE "Day is not valid for the specified month and year" TO ERROR-MESSAGE MOVE "N" TO VALID-DATA EXIT PARAGRAPH END-IF * For more advanced validation, convert to integer date * and check if conversion works COMPUTE WS-DATE-INTEGER = FUNCTION INTEGER-OF-DATE(WS-DATE-NUM) IF WS-DATE-INTEGER = 0 MOVE "Invalid date format" TO ERROR-MESSAGE MOVE "N" TO VALID-DATA EXIT PARAGRAPH END-IF MOVE "Y" TO VALID-DATA. EXIT.

Comprehensive date validation includes checking for leap years and using built-in functions to verify date validity.

Code and ID 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
* Validate product code format (example: ABC-12345) VALIDATE-PRODUCT-CODE. IF PRODUCT-CODE(1:3) IS NOT ALPHABETIC MOVE "Product code must start with 3 letters" TO ERROR-MESSAGE MOVE "N" TO VALID-DATA EXIT PARAGRAPH END-IF IF PRODUCT-CODE(4:1) NOT = "-" MOVE "Product code must have hyphen at position 4" TO ERROR-MESSAGE MOVE "N" TO VALID-DATA EXIT PARAGRAPH END-IF IF PRODUCT-CODE(5:5) IS NOT NUMERIC MOVE "Product code must end with 5 digits" TO ERROR-MESSAGE MOVE "N" TO VALID-DATA EXIT PARAGRAPH END-IF PERFORM CHECK-PRODUCT-EXISTS IF PRODUCT-EXISTS = "N" MOVE "Product code not found in product master" TO ERROR-MESSAGE MOVE "N" TO VALID-DATA EXIT PARAGRAPH END-IF MOVE "Y" TO VALID-DATA. EXIT. * Validate social security number (XXX-XX-XXXX) VALIDATE-SSN. IF SSN-INPUT(4:1) NOT = "-" OR SSN-INPUT(7:1) NOT = "-" MOVE "SSN must be in format XXX-XX-XXXX" TO ERROR-MESSAGE MOVE "N" TO VALID-DATA EXIT PARAGRAPH END-IF IF SSN-PART1 IS NOT NUMERIC OR SSN-PART2 IS NOT NUMERIC OR SSN-PART3 IS NOT NUMERIC MOVE "SSN must contain only digits and hyphens" TO ERROR-MESSAGE MOVE "N" TO VALID-DATA EXIT PARAGRAPH END-IF IF SSN-PART1 = "000" OR SSN-PART2 = "00" OR SSN-PART3 = "0000" MOVE "SSN cannot have all zeros in any part" TO ERROR-MESSAGE MOVE "N" TO VALID-DATA EXIT PARAGRAPH END-IF MOVE "Y" TO VALID-DATA. EXIT.

Code validation often involves checking specific formats and patterns required by business rules.

Range Checking Techniques

Range checking ensures that data values fall within acceptable limits defined by business rules. It is a fundamental aspect of data validation in COBOL applications.

Simple Range Checks

cobol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
* Basic numeric range check IF QUANTITY < 1 OR QUANTITY > 999 MOVE "Quantity must be between 1 and 999" TO ERROR-MESSAGE MOVE "N" TO VALID-DATA END-IF. * Date range check IF ORDER-DATE < CURRENT-DATE - 30 MOVE "Order date cannot be more than 30 days in the past" TO ERROR-MESSAGE MOVE "N" TO VALID-DATA END-IF. IF DELIVERY-DATE < CURRENT-DATE MOVE "Delivery date cannot be in the past" TO ERROR-MESSAGE MOVE "N" TO VALID-DATA END-IF.

Simple range checks compare values against minimum and maximum bounds.

Using 88-Level Items for Ranges

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
01 STUDENT-AGE PIC 999. 88 VALID-STUDENT-AGE VALUE 18 THRU 65. 88 MINOR-STUDENT VALUE 18 THRU 20. 88 ADULT-STUDENT VALUE 21 THRU 65. 01 PRODUCT-QUANTITY PIC 9(5). 88 VALID-QUANTITY VALUE 1 THRU 10000. 88 SMALL-ORDER VALUE 1 THRU 10. 88 MEDIUM-ORDER VALUE 11 THRU 100. 88 LARGE-ORDER VALUE 101 THRU 1000. 88 BULK-ORDER VALUE 1001 THRU 10000. * Using the 88-level items in validation IF NOT VALID-STUDENT-AGE MOVE "Student age must be between 18 and 65" TO ERROR-MESSAGE MOVE "N" TO VALID-DATA END-IF. IF NOT VALID-QUANTITY MOVE "Quantity must be between 1 and 10000" TO ERROR-MESSAGE MOVE "N" TO VALID-DATA END-IF. * Additional processing based on range categories IF SMALL-ORDER MOVE 0 TO DISCOUNT-PERCENT ELSE IF MEDIUM-ORDER MOVE 5 TO DISCOUNT-PERCENT ELSE IF LARGE-ORDER MOVE 10 TO DISCOUNT-PERCENT ELSE IF BULK-ORDER MOVE 15 TO DISCOUNT-PERCENT END-IF.

88-level items provide a readable way to define and check ranges with descriptive names.

Dynamic Range 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
* Validating against dynamically determined limits 01 CREDIT-LIMIT-TABLE. 05 CREDIT-LIMITS OCCURS 5 TIMES INDEXED BY CL-IDX. 10 CUSTOMER-TYPE PIC X. 10 MIN-CREDIT-SCORE PIC 9(3). 10 MAX-CREDIT-AMT PIC 9(7)V99. * Initialize the table (would typically be loaded from a file) INITIALIZE-CREDIT-LIMITS. MOVE "R" TO CUSTOMER-TYPE (1) MOVE 500 TO MIN-CREDIT-SCORE (1) MOVE 5000.00 TO MAX-CREDIT-AMT (1) MOVE "P" TO CUSTOMER-TYPE (2) MOVE 600 TO MIN-CREDIT-SCORE (2) MOVE 10000.00 TO MAX-CREDIT-AMT (2) MOVE "G" TO CUSTOMER-TYPE (3) MOVE 550 TO MIN-CREDIT-SCORE (3) MOVE 15000.00 TO MAX-CREDIT-AMT (3) MOVE "C" TO CUSTOMER-TYPE (4) MOVE 700 TO MIN-CREDIT-SCORE (4) MOVE 25000.00 TO MAX-CREDIT-AMT (4) MOVE "V" TO CUSTOMER-TYPE (5) MOVE 750 TO MIN-CREDIT-SCORE (5) MOVE 50000.00 TO MAX-CREDIT-AMT (5) EXIT. * Validate loan amount against dynamic limits VALIDATE-LOAN-AMOUNT. SET CL-IDX TO 1 SEARCH CREDIT-LIMITS AT END MOVE "Invalid customer type" TO ERROR-MESSAGE MOVE "N" TO VALID-DATA WHEN CUSTOMER-TYPE (CL-IDX) = INPUT-CUSTOMER-TYPE IF INPUT-CREDIT-SCORE < MIN-CREDIT-SCORE (CL-IDX) MOVE "Credit score too low for this customer type" TO ERROR-MESSAGE MOVE "N" TO VALID-DATA ELSE IF INPUT-LOAN-AMOUNT > MAX-CREDIT-AMT (CL-IDX) MOVE "Loan amount exceeds maximum for this customer" TO ERROR-MESSAGE MOVE "N" TO VALID-DATA ELSE MOVE "Y" TO VALID-DATA END-IF END-IF END-SEARCH EXIT.

Dynamic range validation uses tables or conditional logic to determine appropriate limits based on other data values.

Cross-Field Range 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
* Ensuring that one value is less than or equal to another IF ORDER-QUANTITY > INVENTORY-QUANTITY MOVE "Order quantity exceeds available inventory" TO ERROR-MESSAGE MOVE "N" TO VALID-DATA END-IF. * Validating date ranges IF END-DATE < START-DATE MOVE "End date cannot be earlier than start date" TO ERROR-MESSAGE MOVE "N" TO VALID-DATA END-IF. IF END-DATE > START-DATE + 365 MOVE "Date range cannot exceed one year" TO ERROR-MESSAGE MOVE "N" TO VALID-DATA END-IF. * Validating financial boundaries IF PAYMENT-AMOUNT > INVOICE-AMOUNT * 1.10 MOVE "Payment cannot exceed invoice amount by more than 10%" TO ERROR-MESSAGE MOVE "N" TO VALID-DATA END-IF. IF DISCOUNT-AMOUNT > INVOICE-AMOUNT * 0.25 MOVE "Discount cannot exceed 25% of invoice amount" TO ERROR-MESSAGE MOVE "N" TO VALID-DATA END-IF.

Cross-field validation ensures that relationships between multiple fields are logically consistent.

Error Handling for Invalid Data

Proper error handling is a critical component of data validation. It ensures that validation failures are reported clearly, consistently, and in a way that facilitates resolution.

Centralized Error Handling

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
01 ERROR-HANDLING-FIELDS. 05 ERROR-SWITCH PIC X VALUE "N". 88 ERROR-FOUND VALUE "Y". 88 NO-ERROR VALUE "N". 05 ERROR-MESSAGE PIC X(80) VALUE SPACES. 05 ERROR-CODE PIC X(4) VALUE SPACES. 05 ERROR-FIELD PIC X(30) VALUE SPACES. 05 ERROR-TABLE. 10 ERROR-ENTRY OCCURS 50 TIMES INDEXED BY ERR-IDX. 15 ERR-CODE PIC X(4). 15 ERR-FIELD PIC X(30). 15 ERR-MESSAGE PIC X(80). 05 ERROR-COUNT PIC 9(2) VALUE ZERO. HANDLE-VALIDATION-ERROR. SET ERROR-FOUND TO TRUE ADD 1 TO ERROR-COUNT MOVE ERROR-CODE TO ERR-CODE (ERROR-COUNT) MOVE ERROR-FIELD TO ERR-FIELD (ERROR-COUNT) MOVE ERROR-MESSAGE TO ERR-MESSAGE (ERROR-COUNT) * Write to error log WRITE ERROR-LOG-RECORD FROM ERROR-HANDLING-FIELDS * For interactive programs, display error DISPLAY ERROR-MESSAGE EXIT. LOG-ALL-ERRORS. IF NO-ERROR EXIT PARAGRAPH END-IF PERFORM VARYING ERR-IDX FROM 1 BY 1 UNTIL ERR-IDX > ERROR-COUNT WRITE ERROR-REPORT-LINE FROM ERR-ENTRY (ERR-IDX) END-PERFORM EXIT.

A centralized error handling approach provides consistency and makes errors easier to track and resolve.

Error Processing Strategy

  • Detect errors as early as possible in the processing flow
  • Provide specific, actionable error messages
  • Include error codes for easy reference and categorization
  • Identify the specific field or record that failed validation
  • Collect multiple errors before stopping processing when possible
  • Log errors for analysis and reporting
  • Follow consistent error handling procedures across the application

Batch Processing Error Handling

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
01 PROCESSING-SWITCHES. 05 END-OF-FILE-SW PIC X VALUE "N". 88 END-OF-FILE VALUE "Y". 05 VALID-RECORD-SW PIC X VALUE "Y". 88 VALID-RECORD VALUE "Y". 88 INVALID-RECORD VALUE "N". PROCESS-INPUT-FILE. OPEN INPUT INPUT-FILE OUTPUT VALID-OUTPUT-FILE OUTPUT ERROR-FILE READ INPUT-FILE AT END SET END-OF-FILE TO TRUE END-READ PERFORM UNTIL END-OF-FILE MOVE "Y" TO VALID-RECORD-SW INITIALIZE ERROR-COUNT PERFORM VALIDATE-INPUT-RECORD IF VALID-RECORD WRITE VALID-OUTPUT-RECORD FROM INPUT-RECORD ELSE MOVE INPUT-RECORD TO ERROR-RECORD MOVE ERROR-COUNT TO ERROR-RECORD-COUNT WRITE ERROR-OUTPUT-RECORD FROM ERROR-RECORD END-IF READ INPUT-FILE AT END SET END-OF-FILE TO TRUE END-READ END-PERFORM CLOSE INPUT-FILE VALID-OUTPUT-FILE ERROR-FILE EXIT. VALIDATE-INPUT-RECORD. PERFORM VALIDATE-CUSTOMER-ID PERFORM VALIDATE-TRANSACTION-DATE PERFORM VALIDATE-TRANSACTION-AMOUNT PERFORM VALIDATE-TRANSACTION-TYPE EXIT. VALIDATE-CUSTOMER-ID. IF CUSTOMER-ID IS NOT NUMERIC MOVE "E001" TO ERROR-CODE MOVE "CUSTOMER-ID" TO ERROR-FIELD MOVE "Customer ID must be numeric" TO ERROR-MESSAGE PERFORM HANDLE-VALIDATION-ERROR SET INVALID-RECORD TO TRUE END-IF EXIT.

Batch programs often collect all validation errors before rejecting a record, writing invalid records to an error file for later correction.

Error Severity Levels

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
01 ERROR-LEVELS. 05 INFO-LEVEL PIC X VALUE "I". 05 WARNING-LEVEL PIC X VALUE "W". 05 ERROR-LEVEL PIC X VALUE "E". 05 CRITICAL-LEVEL PIC X VALUE "C". 01 ERROR-RECORD. 05 ERR-SEVERITY PIC X. 05 ERR-CODE PIC X(4). 05 ERR-FIELD PIC X(30). 05 ERR-MESSAGE PIC X(80). 05 ERR-TIMESTAMP PIC X(26). RECORD-ERROR. MOVE FUNCTION CURRENT-DATE TO ERR-TIMESTAMP WRITE ERROR-LOG-RECORD FROM ERROR-RECORD * For critical errors, terminate processing IF ERR-SEVERITY = CRITICAL-LEVEL DISPLAY "CRITICAL ERROR: " ERR-CODE " - " ERR-MESSAGE MOVE 16 TO RETURN-CODE STOP RUN END-IF * For regular errors, mark record as invalid IF ERR-SEVERITY = ERROR-LEVEL SET INVALID-RECORD TO TRUE END-IF EXIT.

Using error severity levels helps determine the appropriate response to different types of validation failures.

Reporting Validation Errors

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
01 ERROR-STATISTICS. 05 TOTAL-RECORDS-READ PIC 9(7) VALUE ZERO. 05 VALID-RECORD-COUNT PIC 9(7) VALUE ZERO. 05 ERROR-RECORD-COUNT PIC 9(7) VALUE ZERO. 05 ERROR-COUNTS. 10 FORMAT-ERRORS PIC 9(5) VALUE ZERO. 10 RANGE-ERRORS PIC 9(5) VALUE ZERO. 10 LOGIC-ERRORS PIC 9(5) VALUE ZERO. 10 MISSING-ERRORS PIC 9(5) VALUE ZERO. PRINT-VALIDATION-REPORT. MOVE SPACES TO REPORT-LINE MOVE "VALIDATION REPORT" TO RL-TITLE WRITE REPORT-RECORD FROM REPORT-LINE MOVE SPACES TO REPORT-LINE MOVE "Total Records Processed:" TO RL-LABEL MOVE TOTAL-RECORDS-READ TO RL-COUNT WRITE REPORT-RECORD FROM REPORT-LINE MOVE "Valid Records:" TO RL-LABEL MOVE VALID-RECORD-COUNT TO RL-COUNT WRITE REPORT-RECORD FROM REPORT-LINE MOVE "Records with Errors:" TO RL-LABEL MOVE ERROR-RECORD-COUNT TO RL-COUNT WRITE REPORT-RECORD FROM REPORT-LINE MOVE SPACES TO REPORT-LINE MOVE "ERROR BREAKDOWN" TO RL-TITLE WRITE REPORT-RECORD FROM REPORT-LINE MOVE "Format Errors:" TO RL-LABEL MOVE FORMAT-ERRORS TO RL-COUNT WRITE REPORT-RECORD FROM REPORT-LINE MOVE "Range Errors:" TO RL-LABEL MOVE RANGE-ERRORS TO RL-COUNT WRITE REPORT-RECORD FROM REPORT-LINE MOVE "Logic Errors:" TO RL-LABEL MOVE LOGIC-ERRORS TO RL-COUNT WRITE REPORT-RECORD FROM REPORT-LINE MOVE "Missing Required Data:" TO RL-LABEL MOVE MISSING-ERRORS TO RL-COUNT WRITE REPORT-RECORD FROM REPORT-LINE EXIT.

Providing detailed error reports helps users and administrators understand and address validation issues.

Exercise: Implementing Data Validation

Complete the following COBOL program by implementing validation routines for each field in the customer record:

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
IDENTIFICATION DIVISION. PROGRAM-ID. DATAVAL. DATA DIVISION. WORKING-STORAGE SECTION. 01 CUSTOMER-RECORD. 05 CUSTOMER-ID PIC X(6). 05 CUSTOMER-NAME PIC X(30). 05 CUSTOMER-ADDRESS PIC X(50). 05 CUSTOMER-CITY PIC X(20). 05 CUSTOMER-STATE PIC XX. 05 CUSTOMER-ZIP PIC X(10). 05 CUSTOMER-PHONE PIC X(14). 05 CUSTOMER-DOB PIC X(10). 05 CUSTOMER-CREDIT-LIM PIC 9(7)V99. 05 CUSTOMER-TYPE PIC X. 88 RETAIL VALUE "R". 88 WHOLESALE VALUE "W". 88 DISTRIBUTOR VALUE "D". 88 VALID-CUST-TYPE VALUE "R" "W" "D". 01 VALIDATION-FIELDS. 05 VALID-DATA-SW PIC X VALUE "Y". 88 VALID-DATA VALUE "Y". 88 INVALID-DATA VALUE "N". 05 ERROR-MESSAGE PIC X(80) VALUE SPACES. * Add working storage areas for date validation, state code validation, * phone number format checking, etc. PROCEDURE DIVISION. DISPLAY "Data Validation Exercise". * Initialize sample data MOVE "ID1234" TO CUSTOMER-ID MOVE "John Doe" TO CUSTOMER-NAME MOVE "123 Main St" TO CUSTOMER-ADDRESS MOVE "Springfield" TO CUSTOMER-CITY MOVE "XX" TO CUSTOMER-STATE MOVE "12345-6789" TO CUSTOMER-ZIP MOVE "(555) 123-4567" TO CUSTOMER-PHONE MOVE "13/25/2000" TO CUSTOMER-DOB MOVE 25000.00 TO CUSTOMER-CREDIT-LIM MOVE "Q" TO CUSTOMER-TYPE * Perform validation PERFORM VALIDATE-CUSTOMER-RECORD IF VALID-DATA DISPLAY "Customer record is valid" ELSE DISPLAY "Customer record is invalid" END-IF STOP RUN. VALIDATE-CUSTOMER-RECORD. MOVE "Y" TO VALID-DATA-SW * Implement validation for each field: * 1. CUSTOMER-ID should be 6 characters, start with 2 letters followed by 4 digits * 2. CUSTOMER-NAME should not be spaces and be at least 3 characters * 3. CUSTOMER-STATE should be a valid US state code * 4. CUSTOMER-ZIP should be in format 12345 or 12345-6789 * 5. CUSTOMER-PHONE should be in format (XXX) XXX-XXXX * 6. CUSTOMER-DOB should be in format MM/DD/YYYY and be a valid date * (customer must be at least 18 years old and not born before 1900) * 7. CUSTOMER-CREDIT-LIM should be between 0 and 100000.00 * 8. CUSTOMER-TYPE should be a valid type (R, W, or D) EXIT.

Complete the validation routines for each field in the CUSTOMER-RECORD, implementing appropriate error handling for each validation failure.

Knowledge Check

Test Your Knowledge

1. Which COBOL statement is commonly used to check if a field contains numeric data?

  • IF NUMERIC-FIELD IS NUMERIC
  • IF NUMERIC-FIELD CONTAINS NUMBERS
  • IF NUMERIC-FIELD IS NUMBER
  • IF NUMERIC-FIELD MATCHES "9(5)"

2. What is the best way to validate a date field in COBOL?

  • Using the DATE-VALIDATION function
  • Converting to internal date format and checking for errors
  • Using 88-level items for every valid date
  • Comparing with CURRENT-DATE

3. Which of the following is NOT a common technique for handling invalid data in COBOL?

  • Displaying an error message
  • Writing to an error log file
  • Setting a return code
  • Automatically correcting the data without notification

4. What is the purpose of range checking in data validation?

  • To ensure data is sorted in ascending order
  • To verify that a value falls within acceptable minimum and maximum values
  • To check if data contains only characters from a specific range of the ASCII table
  • To validate that array indices are within bounds

5. Which of the following is an example of defensive programming in COBOL data validation?

  • Assuming all input data is correct to improve performance
  • Validating data only after writing it to a database
  • Checking for both the presence of required data and the validity of its format/content
  • Using generic error messages for all validation failures

Frequently Asked Questions