MainframeMaster

COBOL Tutorial

Input Validation in COBOL

Progress0 of 0 lessons

Introduction to Input Validation

Input validation is the process of checking and verifying data as it enters a COBOL program from external sources such as files, user terminals, or databases. Proper input validation ensures data quality, prevents processing errors, and maintains data integrity throughout your application.

Why Input Validation Matters

  • Prevents garbage-in, garbage-out scenarios that corrupt downstream processing
  • Catches errors early in the processing pipeline, reducing debugging time
  • Maintains data quality standards across all applications
  • Provides audit trails for invalid data attempts
  • Protects against processing failures and system crashes
  • Ensures compliance with business rules and data standards

Key Input Validation Strategies

cobol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
* Validate as early as possible PERFORM READ-INPUT-RECORD IF FILE-STATUS NOT = "00" PERFORM HANDLE-FILE-ERROR EXIT PARAGRAPH END-IF PERFORM VALIDATE-RECORD-STRUCTURE IF NOT VALID-RECORD PERFORM HANDLE-INVALID-RECORD GO TO READ-NEXT-RECORD END-IF PERFORM VALIDATE-ALL-FIELDS IF NOT VALID-DATA PERFORM LOG-VALIDATION-ERRORS WRITE ERROR-RECORD GO TO READ-NEXT-RECORD END-IF * Process validated record PERFORM PROCESS-VALID-RECORD.

Validation should happen early in the processing flow, before any business logic is applied.

File I/O Validation

When reading from files, COBOL programs must validate both the file operations and the data being read. This includes checking file status codes, verifying record formats, and ensuring data integrity.

File Status 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
IDENTIFICATION DIVISION. PROGRAM-ID. FILEVALID. DATA DIVISION. FILE SECTION. FD INPUT-FILE FILE STATUS IS WS-INPUT-STATUS. 01 INPUT-RECORD PIC X(80). WORKING-STORAGE SECTION. 01 WS-INPUT-STATUS PIC XX. 88 SUCCESSFUL-READ VALUE "00". 88 END-OF-FILE VALUE "10". 88 LOGICAL-EOF VALUE "46". 88 READ-ERROR VALUE "30" "94" "96" "97". 01 WS-FILE-ERROR-MSG PIC X(80). PROCEDURE DIVISION. INITIALIZATION. OPEN INPUT INPUT-FILE EVALUATE WS-INPUT-STATUS WHEN "00" DISPLAY "File opened successfully" WHEN "35" MOVE "File not found" TO WS-FILE-ERROR-MSG PERFORM ABEND-PROGRAM WHEN OTHER MOVE "Error opening file" TO WS-FILE-ERROR-MSG MOVE WS-INPUT-STATUS TO WS-FILE-ERROR-MSG(20:2) PERFORM ABEND-PROGRAM END-EVALUATE. READ-AND-VALIDATE. READ INPUT-FILE AT END SET END-OF-FILE TO TRUE END-READ EVALUATE WS-INPUT-STATUS WHEN SUCCESSFUL-READ CONTINUE WHEN END-OF-FILE GO TO END-OF-PROCESSING WHEN LOGICAL-EOF GO TO END-OF-PROCESSING WHEN READ-ERROR MOVE "Read error occurred" TO WS-FILE-ERROR-MSG PERFORM LOG-ERROR GO TO READ-AND-VALIDATE WHEN OTHER MOVE "Unexpected file status" TO WS-FILE-ERROR-MSG MOVE WS-INPUT-STATUS TO WS-FILE-ERROR-MSG(25:2) PERFORM LOG-ERROR END-EVALUATE.

Always check FILE STATUS after file operations to handle errors gracefully.

Record Length and 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
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
IDENTIFICATION DIVISION. PROGRAM-ID. RECVALID. DATA DIVISION. WORKING-STORAGE SECTION. 01 INPUT-RECORD PIC X(200). 01 INPUT-RECORD-LENGTH PIC 9(3) VALUE 80. 01 VALIDATION-SWITCHES. 05 VALID-RECORD-SW PIC X VALUE "Y". 88 VALID-RECORD VALUE "Y". 88 INVALID-REC VALUE "N". 05 ERROR-FLAG PIC X VALUE SPACE. 01 ERROR-MESSAGE PIC X(100). PROCEDURE DIVISION. READ-INPUT-FILE. READ INPUT-FILE AT END GO TO END-OF-PROCESSING END-READ * Check record length PERFORM VALIDATE-RECORD-LENGTH IF NOT VALID-RECORD GO TO READ-INPUT-FILE END-IF * Validate record format PERFORM VALIDATE-RECORD-FORMAT IF NOT VALID-RECORD GO TO READ-INPUT-FILE END-IF * Process valid record PERFORM PROCESS-RECORD GO TO READ-INPUT-FILE. VALIDATE-RECORD-LENGTH. MOVE "Y" TO VALID-RECORD-SW MOVE FUNCTION LENGTH(INPUT-RECORD) TO INPUT-RECORD-LENGTH IF INPUT-RECORD-LENGTH NOT = 80 MOVE "Record length is not 80 characters" TO ERROR-MESSAGE MOVE "N" TO VALID-RECORD-SW MOVE "L" TO ERROR-FLAG PERFORM LOG-ERROR END-IF. EXIT. VALIDATE-RECORD-FORMAT. MOVE "Y" TO VALID-RECORD-SW * Check if record starts with expected identifier IF INPUT-RECORD(1:3) NOT = "HDR" AND INPUT-RECORD(1:3) NOT = "DTL" AND INPUT-RECORD(1:3) NOT = "TRL" MOVE "Invalid record type identifier" TO ERROR-MESSAGE MOVE "N" TO VALID-RECORD-SW MOVE "T" TO ERROR-FLAG PERFORM LOG-ERROR END-IF. EXIT.

Validate record structure and length before attempting to access individual fields.

Input Field Validation

cob Quiz
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
01 INPUT-FIELDS. 05 CUSTOMER-NUMBER PIC X(10). 05 TRANSACTION-DATE PIC X(10). 05 TRANSACTION-AMT PIC X(12). 05 TRANSACTION-TYPE PIC X. 88 VALID-TRANS-TYPE VALUE "S" "P" "R" "C". 05 PRODUCT-CODE PIC X(15). 01 VALIDATION-WORK-AREAS. 05 WS-CUSTOMER-NUM PIC 9(10). 05 WS-TRANS-DATE PIC 9(8). 05 WS-TRANS-AMOUNT PIC 9(8)V99. 05 VALID-FIELD-SW PIC X VALUE "Y". 88 FIELD-VALID VALUE "Y". 88 FIELD-INVALID VALUE "N". VALIDATE-INPUT-FIELDS. MOVE "Y" TO VALID-FIELD-SW * Validate customer number IF CUSTOMER-NUMBER IS NOT NUMERIC MOVE "Customer number must be numeric" TO ERROR-MSG MOVE "N" TO VALID-FIELD-SW PERFORM LOG-FIELD-ERROR MOVE "CUSTOMER-NUMBER" TO ERROR-FIELD-NAME END-IF * Validate and convert transaction date IF TRANSACTION-DATE IS NOT NUMERIC MOVE "Transaction date must be numeric" TO ERROR-MSG MOVE "N" TO VALID-FIELD-SW PERFORM LOG-FIELD-ERROR MOVE "TRANSACTION-DATE" TO ERROR-FIELD-NAME ELSE MOVE TRANSACTION-DATE TO WS-TRANS-DATE PERFORM VALIDATE-DATE-FORMAT IF NOT FIELD-VALID MOVE "Invalid date format" TO ERROR-MSG PERFORM LOG-FIELD-ERROR END-IF END-IF * Validate transaction amount IF TRANSACTION-AMT IS NOT NUMERIC MOVE "Transaction amount must be numeric" TO ERROR-MSG MOVE "N" TO VALID-FIELD-SW PERFORM LOG-FIELD-ERROR MOVE "TRANSACTION-AMT" TO ERROR-FIELD-NAME ELSE MOVE TRANSACTION-AMT TO WS-TRANS-AMOUNT IF WS-TRANS-AMOUNT <= ZERO MOVE "Transaction amount must be greater than zero" TO ERROR-MSG MOVE "N" TO VALID-FIELD-SW PERFORM LOG-FIELD-ERROR MOVE "TRANSACTION-AMT" TO ERROR-FIELD-NAME END-IF END-IF * Validate transaction type IF NOT VALID-TRANS-TYPE MOVE "Invalid transaction type" TO ERROR-MSG MOVE "N" TO VALID-FIELD-SW PERFORM LOG-FIELD-ERROR MOVE "TRANSACTION-TYPE" TO ERROR-FIELD-NAME END-IF * Validate product code format IF PRODUCT-CODE(1:3) IS NOT ALPHABETIC MOVE "Product code must start with 3 letters" TO ERROR-MSG MOVE "N" TO VALID-FIELD-SW PERFORM LOG-FIELD-ERROR MOVE "PRODUCT-CODE" TO ERROR-FIELD-NAME ELSE IF PRODUCT-CODE(4:1) NOT = "-" MOVE "Product code must have hyphen at position 4" TO ERROR-MSG MOVE "N" TO VALID-FIELD-SW PERFORM LOG-FIELD-ERROR MOVE "PRODUCT-CODE" TO ERROR-FIELD-NAME END-IF END-IF.

Validate each input field individually and provide specific error messages for each validation failure.

User Input Validation

In interactive COBOL programs, user input requires immediate validation with feedback to the user. This ensures data quality and provides a better user experience.

Interactive Input with 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
01 USER-INPUT-AREAS. 05 ACCOUNT-NUMBER-INPUT PIC X(10). 05 ACCOUNT-BALANCE PIC 9(7)V99. 05 DEPOSIT-AMOUNT-INPUT PIC X(10). 05 DEPOSIT-AMOUNT PIC 9(7)V99. 01 VALIDATION-FLAGS. 05 VALID-INPUT-SW PIC X. 88 VALID-INPUT VALUE "Y". 88 INVALID-INPUT VALUE "N". 05 ERROR-DISPLAY-SW PIC X VALUE "N". 88 SHOW-ERROR VALUE "Y". ACCEPT-AND-VALIDATE-ACCOUNT. DISPLAY "Enter account number (10 digits): " ACCEPT ACCOUNT-NUMBER-INPUT MOVE "Y" TO VALID-INPUT-SW * Validate account number IF ACCOUNT-NUMBER-INPUT IS NOT NUMERIC DISPLAY "ERROR: Account number must contain only digits" MOVE "N" TO VALID-INPUT-SW ELSE IF FUNCTION LENGTH(ACCOUNT-NUMBER-INPUT) NOT = 10 DISPLAY "ERROR: Account number must be exactly 10 digits" MOVE "N" TO VALID-INPUT-SW END-IF END-IF * Continue validation loop until input is valid PERFORM UNTIL VALID-INPUT IF INVALID-INPUT DISPLAY "Please re-enter account number: " ACCEPT ACCOUNT-NUMBER-INPUT MOVE "Y" TO VALID-INPUT-SW IF ACCOUNT-NUMBER-INPUT IS NOT NUMERIC DISPLAY "ERROR: Account number must contain only digits" MOVE "N" TO VALID-INPUT-SW ELSE IF FUNCTION LENGTH(ACCOUNT-NUMBER-INPUT) NOT = 10 DISPLAY "ERROR: Account number must be exactly 10 digits" MOVE "N" TO VALID-INPUT-SW END-IF END-IF END-IF END-PERFORM. EXIT. ACCEPT-AND-VALIDATE-AMOUNT. PERFORM UNTIL VALID-INPUT DISPLAY "Enter deposit amount (max 9999999.99): " ACCEPT DEPOSIT-AMOUNT-INPUT MOVE "Y" TO VALID-INPUT-SW IF DEPOSIT-AMOUNT-INPUT IS NOT NUMERIC DISPLAY "ERROR: Amount must be numeric" MOVE "N" TO VALID-INPUT-SW ELSE MOVE DEPOSIT-AMOUNT-INPUT TO DEPOSIT-AMOUNT IF DEPOSIT-AMOUNT <= ZERO DISPLAY "ERROR: Amount must be greater than zero" MOVE "N" TO VALID-INPUT-SW ELSE IF DEPOSIT-AMOUNT > 9999999.99 DISPLAY "ERROR: Amount exceeds maximum of 9999999.99" MOVE "N" TO VALID-INPUT-SW END-IF END-IF END-IF IF INVALID-INPUT DISPLAY "Please try again." END-IF END-PERFORM. EXIT.

Provide immediate feedback and allow users to correct invalid input in interactive programs.

Batch Processing Error Handling

In batch processing, invalid input records should not stop the entire job. Instead, they should be logged and written to an error file for later correction.

Error File Management

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
IDENTIFICATION DIVISION. PROGRAM-ID. BATCHVALID. DATA DIVISION. FILE SECTION. FD INPUT-FILE. 01 INPUT-RECORD PIC X(200). FD VALID-FILE. 01 VALID-RECORD PIC X(200). FD ERROR-FILE. 01 ERROR-RECORD. 05 ERR-DATE PIC X(8). 05 ERR-TIME PIC X(8). 05 ERR-INPUT-RECORD PIC X(200). 05 ERR-MESSAGE PIC X(100). WORKING-STORAGE SECTION. 01 WS-PROCESSING-STATS. 05 WS-RECORDS-READ PIC 9(7) VALUE ZERO. 05 WS-RECORDS-VALID PIC 9(7) VALUE ZERO. 監視WS-RECORDS-ERROR PIC 9(7) VALUE ZERO. 01 VALIDATION-SWITCHES. 05 VALID-RECORD-SW PIC X. 88 VALID-RECORD VALUE "Y". 88 INVALID-REC VALUE "N". MAIN-PROCESSING. OPEN INPUT INPUT-FILE OUTPUT VALID-FILE OUTPUT ERROR-FILE PERFORM UNTIL END-OF-FILE READ INPUT-FILE AT END SET END-OF-FILE TO TRUE END-READ IF NOT END-OF-FILE ADD 1 TO WS-RECORDS-READ MOVE "Y" TO VALID-RECORD-SW * Perform all validations PERFORM VALIDATE-INPUT-RECORD IF VALID-RECORD WRITE VALID-RECORD FROM INPUT-RECORD ADD 1 TO WS-RECORDS-VALID ELSE PERFORM WRITE-ERROR-RECORD ADD 1 TO WS-RECORDS-ERROR END-IF END-IF END-PERFORM CLOSE INPUT-FILE VALID-FILE ERROR-FILE PERFORM PRINT-SUMMARY-STATISTICS STOP RUN. VALIDATE-INPUT-RECORD. * Validate record type IF INPUT-RECORD(1:3) = SPACES MOVE "Invalid record: Record type is blank" TO ERROR-MSG MOVE "N" TO VALID-RECORD-SW EXIT PARAGRAPH END-IF * Validate key field PERFORM VALIDATE-KEY-FIELDS IF NOT VALID-RECORD EXIT PARAGRAPH END-IF * Validate data fields PERFORM VALIDATE-DATA-FIELDS IF NOT VALID-RECORD EXIT PARAGRAPH END-IF EXIT. WRITE-ERROR-RECORD. MOVE FUNCTION CURRENT-DATE(1:8) TO ERR-DATE MOVE FUNCTION CURRENT-DATE(9:6) TO ERR-TIME MOVE INPUT-RECORD TO ERR-INPUT-RECORD MOVE ERROR-MSG TO ERR-MESSAGE WRITE ERROR-RECORD EXIT.

Batch programs should continue processing and collect statistics on valid and invalid records.

Exercise: Building a Comprehensive Input Validator

Create a COBOL program that reads customer transaction records and validates all input 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
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
IDENTIFICATION DIVISION. PROGRAM-ID. EXERCISE01. DATA DIVISION. FILE SECTION. FD INPUT-FILE. 01 TRANSACTION-RECORD. 05 RECORD-TYPE PIC XX. 05 CUSTOMER-ID PIC X(10). 05 TRANSACTION-DATE PIC X(10). 05 TRANSACTION-TYPE PIC X. 就05 AMOUNT PIC X(12). 05 FILLER PIC X(146). FD VALID-OUTPUT-FILE. 01 VALID-OUTPUT-REC PIC X(180). FD ERROR-OUTPUT-FILE. 01 ERROR-OUTPUT-REC. 05 ERR-DATE PIC X(8). 05 ERR-TIME PIC X(6). 05 ERR-INPUT PIC X(180). 05 ERR-MESSAGE PIC X(100). WORKING-STORAGE SECTION. 01 WS-SWITCHES. 05 EOF-SW PIC X VALUE "N". 88 END-OF-FILE VALUE "Y". 05 VALID-REC-SW PIC X VALUE "Y". 88 VALID-RECORD VALUE "Y". 88 INVALID-REC VALUE "N". 01 WS-WORK-FIELDS. 05 WS-CUST-ID PIC 9(10). 05 WS-TRANS-DATE PIC 9(8). 05 WS-AMOUNT PIC 9(8)V99. 01 WS-STATISTICS. 05 WS-TOTAL-READ PIC 9(7) VALUE ZERO. 05 WS-TOTAL-VALID PIC 9(7) VALUE ZERO. 05 WS-TOTAL-ERROR PIC 9(7) VALUE ZERO. * Implement the following: * 1. Record type validation (must be "DT") * 2. Customer ID validation (must be 10 numeric digits) * 3. Transaction date validation (format YYYYMMDD) * 4. Transaction type validation (must be "D" or "W" or "P") * 5. Amount validation (must be numeric and > 0) PROCEDURE DIVISION. MAIN. OPEN INPUT INPUT-FILE OUTPUT VALID-OUTPUT-FILE OUTPUT ERROR-OUTPUT-FILE PERFORM UNTIL END-OF-FILE READ INPUT-FILE AT END SET END-OF-FILE TO TRUE END-READ IF NOT END-OF-FILE ADD 1 TO WS-TOTAL-READ MOVE "Y" TO VALID-REC-SW PERFORM VALIDATE-TRANSACTION IF VALID-RECORD WRITE VALID-OUTPUT-REC FROM TRANSACTION-RECORD ADD 1 TO WS-TOTAL-VALID ELSE PERFORM WRITE-ERROR ADD 1 TO WS-TOTAL-ERROR END-IF END-IF END-PERFORM CLOSE INPUT-FILE VALID-OUTPUT-FILE ERROR-OUTPUT-FILE DISPLAY "Total records read: " WS-TOTAL-READ DISPLAY "Valid records: " WS-TOTAL-VALID DISPLAY "Error records: " WS-TOTAL-ERROR STOP RUN. VALIDATE-TRANSACTION. * Implement validation logic here EXIT. WRITE-ERROR. * Implement error writing logic here EXIT.

Implement the validation logic for all fields and proper error handling in the provided program.

Knowledge Check

Test Your Knowledge

1. Which validation technique should be performed first when reading input in COBOL?

  • Range checking
  • Format validation
  • Business rule validation
  • Cross-field validation

2. What is the purpose of the FILE STATUS clause in COBOL?

  • To check if data is valid
  • To determine file opening success
  • To indicate the position in the file
  • To validate record format

3. When reading records from a file, what is the best practice for validating the record length?

  • Assume all records are the correct length
  • Check record length against a maximum length only
  • Validate record length matches expected format before processing
  • Skip validation for performance

4. How should you handle input records that fail validation in a batch program?

  • Stop processing immediately
  • Skip to the next record
  • Write to an error file and continue processing
  • Attempt to correct the data automatically

5. What is a common technique for validating formatted input data like dates or codes?

  • Using REDEFINES to break down the data into components
  • Using only basic numeric checks
  • Skipping format validation
  • Using random validation

Frequently Asked Questions