MainframeMaster

COBOL Tutorial

COBOL NUMERIC

The NUMERIC class test represents comprehensive data validation and sophisticated numeric content verification capabilities within COBOL programming environments, providing advanced validation mechanisms, enhanced data integrity features, and intelligent numeric testing that enable precise input validation, complex data verification processes, and systematic numeric content analysis. This class test embodies modern validation programming principles by supporting comprehensive numeric testing, enabling sophisticated data integrity workflows, and facilitating precise validation control requirements while maintaining data accuracy, ensuring predictable validation behavior, and enabling flexible validation architectures across enterprise applications requiring exact numeric verification, input validation capabilities, and reliable data validation throughout sophisticated business logic scenarios and data processing workflows.

NUMERIC Class Test Usage

Basic NUMERIC Testing Syntax
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
*> Basic NUMERIC class tests IF input-field IS NUMERIC PERFORM PROCESS-NUMERIC-DATA ELSE PERFORM HANDLE-INVALID-INPUT END-IF *> NUMERIC test with NOT IF input-value IS NOT NUMERIC DISPLAY "Invalid numeric input: " input-value MOVE "Y" TO error-flag END-IF *> NUMERIC in compound conditions IF customer-id IS NUMERIC AND customer-id > 0 PERFORM VALIDATE-CUSTOMER ELSE DISPLAY "Invalid customer ID format" END-IF *> NUMERIC with different data types 01 WS-TEST-FIELDS. 05 WS-AMOUNT-DISPLAY PIC 9(8)V99. 05 WS-QUANTITY-COMP PIC 9(6) COMP. 05 WS-RATE-PACKED PIC 9(4)V99 COMP-3. 05 WS-USER-INPUT PIC X(10). *> Testing different numeric formats IF WS-AMOUNT-DISPLAY IS NUMERIC DISPLAY "Display amount is numeric" END-IF IF WS-QUANTITY-COMP IS NUMERIC DISPLAY "Comp quantity is numeric" END-IF IF WS-RATE-PACKED IS NUMERIC DISPLAY "Packed rate is numeric" END-IF *> User input validation ACCEPT WS-USER-INPUT FROM CONSOLE IF WS-USER-INPUT IS NUMERIC MOVE WS-USER-INPUT TO WS-AMOUNT-DISPLAY PERFORM CALCULATE-TOTAL ELSE DISPLAY "Please enter a valid numeric value" PERFORM GET-NUMERIC-INPUT END-IF *> NUMERIC with sign handling 01 WS-SIGNED-FIELDS. 05 WS-BALANCE PIC S9(8)V99. 05 WS-ADJUSTMENT PIC S9(6)V99 SIGN LEADING. IF WS-BALANCE IS NUMERIC DISPLAY "Balance validation passed" END-IF IF WS-ADJUSTMENT IS NUMERIC ADD WS-ADJUSTMENT TO WS-BALANCE END-IF *> NUMERIC in table processing 01 WS-DATA-TABLE. 05 WS-TABLE-ENTRY OCCURS 100 TIMES. 10 WS-ENTRY-VALUE PIC X(8). PERFORM VARYING WS-INDEX FROM 1 BY 1 UNTIL WS-INDEX > 100 IF WS-ENTRY-VALUE(WS-INDEX) IS NUMERIC ADD 1 TO WS-VALID-COUNT ELSE ADD 1 TO WS-INVALID-COUNT END-IF END-PERFORM
Class Test
Validation
Data Integrity

Input Validation and Data Processing

Comprehensive Validation Examples
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
*> Advanced input validation patterns PERFORM GET-VALID-NUMERIC-INPUT UNTIL WS-USER-INPUT IS NUMERIC AND WS-USER-INPUT > 0 *> Multi-field validation IF customer-id IS NUMERIC AND order-amount IS NUMERIC AND tax-rate IS NUMERIC PERFORM PROCESS-ORDER ELSE PERFORM VALIDATION-ERROR-HANDLING END-IF *> Range validation with NUMERIC IF price-input IS NUMERIC MOVE price-input TO WS-PRICE IF WS-PRICE >= 0 AND WS-PRICE <= 999999.99 PERFORM ACCEPT-PRICE ELSE DISPLAY "Price must be between 0 and 999,999.99" PERFORM GET-PRICE-INPUT END-IF ELSE DISPLAY "Price must be numeric" PERFORM GET-PRICE-INPUT END-IF *> File processing with validation READ input-file AT END MOVE "Y" TO end-of-file-flag NOT AT END IF record-amount IS NUMERIC AND record-quantity IS NUMERIC PERFORM PROCESS-VALID-RECORD ADD 1 TO valid-record-count ELSE PERFORM LOG-INVALID-RECORD ADD 1 TO invalid-record-count END-IF END-READ *> Batch validation processing PERFORM VARYING record-index FROM 1 BY 1 UNTIL record-index > total-records IF input-amount(record-index) IS NUMERIC MOVE input-amount(record-index) TO work-amount PERFORM VALIDATE-AMOUNT-RANGE IF validation-passed PERFORM PROCESS-AMOUNT END-IF ELSE MOVE record-index TO error-record-number PERFORM LOG-NUMERIC-ERROR END-IF END-PERFORM *> Database field validation EXEC SQL SELECT customer_id, order_amount, tax_rate INTO :ws-customer-id, :ws-order-amount, :ws-tax-rate FROM orders WHERE order_number = :ws-order-number END-EXEC IF ws-customer-id IS NUMERIC AND ws-order-amount IS NUMERIC AND ws-tax-rate IS NUMERIC PERFORM CALCULATE-ORDER-TOTAL ELSE PERFORM DATABASE-INTEGRITY-ERROR END-IF

Comprehensive NUMERIC Validation Examples

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
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
IDENTIFICATION DIVISION. PROGRAM-ID. NUMERIC-VALIDATION-DEMO. DATA DIVISION. WORKING-STORAGE SECTION. *> Input validation data structures 01 WS-INPUT-VALIDATION. 05 WS-USER-INPUT PIC X(20). 05 WS-NUMERIC-INPUT PIC 9(10)V99. 05 WS-VALIDATION-STATUS PIC X. 88 VALIDATION-PASSED VALUE "P". 88 VALIDATION-FAILED VALUE "F". 05 WS-ERROR-COUNT PIC 9(4) VALUE 0. 05 WS-RETRY-COUNT PIC 9(2) VALUE 0. 05 WS-MAX-RETRIES PIC 9(2) VALUE 3. *> Financial transaction validation 01 WS-TRANSACTION-DATA. 05 WS-ACCOUNT-NUMBER PIC X(12). 05 WS-TRANSACTION-AMOUNT PIC X(15). 05 WS-ROUTING-NUMBER PIC X(9). 05 WS-REFERENCE-NUMBER PIC X(20). 05 WS-CONVERTED-AMOUNT PIC 9(10)V99. 05 WS-CONVERTED-ACCOUNT PIC 9(12). 05 WS-CONVERTED-ROUTING PIC 9(9). *> File processing validation 01 WS-FILE-VALIDATION. 05 WS-RECORD-COUNT PIC 9(8) VALUE 0. 05 WS-VALID-RECORDS PIC 9(8) VALUE 0. 05 WS-INVALID-RECORDS PIC 9(8) VALUE 0. 05 WS-NUMERIC-FIELDS-COUNT PIC 9(6) VALUE 0. 05 WS-NON-NUMERIC-COUNT PIC 9(6) VALUE 0. *> Batch processing data 01 WS-BATCH-DATA. 05 WS-EMPLOYEE-RECORDS OCCURS 1000 TIMES. 10 WS-EMP-ID PIC X(8). 10 WS-EMP-SALARY PIC X(10). 10 WS-EMP-HOURS PIC X(6). 10 WS-EMP-RATE PIC X(8). 05 WS-BATCH-SUMMARY. 10 WS-PROCESSED-COUNT PIC 9(6) VALUE 0. 10 WS-ERROR-COUNT-BATCH PIC 9(6) VALUE 0. 10 WS-TOTAL-PAYROLL PIC 9(12)V99 VALUE 0. *> Statistical validation data 01 WS-STATISTICS. 05 WS-NUMERIC-TEST-COUNT PIC 9(8) VALUE 0. 05 WS-PASSED-TESTS PIC 9(8) VALUE 0. 05 WS-FAILED-TESTS PIC 9(8) VALUE 0. 05 WS-SUCCESS-PERCENTAGE PIC 9(3)V99. *> Error tracking and logging 01 WS-ERROR-TRACKING. 05 WS-ERROR-LOG OCCURS 100 TIMES. 10 WS-ERROR-FIELD PIC X(20). 10 WS-ERROR-VALUE PIC X(30). 10 WS-ERROR-TYPE PIC X(15). 10 WS-ERROR-TIMESTAMP PIC X(20). 05 WS-ERROR-INDEX PIC 9(4) VALUE 1. *> Test data for demonstrations 01 WS-TEST-DATA. 05 WS-TEST-VALUES OCCURS 20 TIMES. 10 WS-TEST-INPUT PIC X(15). 10 WS-EXPECTED-RESULT PIC X. PROCEDURE DIVISION. MAIN-NUMERIC-DEMONSTRATION. DISPLAY "=== COBOL NUMERIC CLASS TEST DEMONSTRATION ===" DISPLAY SPACES PERFORM SETUP-TEST-DATA PERFORM DEMONSTRATE-BASIC-NUMERIC-VALIDATION PERFORM DEMONSTRATE-INPUT-VALIDATION-LOOP PERFORM DEMONSTRATE-FINANCIAL-VALIDATION PERFORM DEMONSTRATE-FILE-PROCESSING-VALIDATION PERFORM DEMONSTRATE-BATCH-VALIDATION PERFORM DEMONSTRATE-COMPLEX-VALIDATION-SCENARIOS PERFORM DEMONSTRATE-ERROR-HANDLING PERFORM DISPLAY-VALIDATION-STATISTICS DISPLAY "=== NUMERIC VALIDATION DEMO COMPLETE ===" STOP RUN. SETUP-TEST-DATA. DISPLAY "=== SETTING UP TEST DATA ===" *> Valid numeric test cases MOVE "12345" TO WS-TEST-INPUT(1) MOVE "P" TO WS-EXPECTED-RESULT(1) MOVE "123.45" TO WS-TEST-INPUT(2) MOVE "P" TO WS-EXPECTED-RESULT(2) MOVE "-987.65" TO WS-TEST-INPUT(3) MOVE "P" TO WS-EXPECTED-RESULT(3) MOVE "+5432.10" TO WS-TEST-INPUT(4) MOVE "P" TO WS-EXPECTED-RESULT(4) MOVE "0000123" TO WS-TEST-INPUT(5) MOVE "P" TO WS-EXPECTED-RESULT(5) *> Invalid numeric test cases MOVE "ABC123" TO WS-TEST-INPUT(6) MOVE "F" TO WS-EXPECTED-RESULT(6) MOVE "12.34.56" TO WS-TEST-INPUT(7) MOVE "F" TO WS-EXPECTED-RESULT(7) MOVE "12A45" TO WS-TEST-INPUT(8) MOVE "F" TO WS-EXPECTED-RESULT(8) MOVE "++123" TO WS-TEST-INPUT(9) MOVE "F" TO WS-EXPECTED-RESULT(9) MOVE " 123 " TO WS-TEST-INPUT(10) MOVE "F" TO WS-EXPECTED-RESULT(10) MOVE "$123.45" TO WS-TEST-INPUT(11) MOVE "F" TO WS-EXPECTED-RESULT(11) MOVE "1,234.56" TO WS-TEST-INPUT(12) MOVE "F" TO WS-EXPECTED-RESULT(12) MOVE SPACES TO WS-TEST-INPUT(13) MOVE "F" TO WS-EXPECTED-RESULT(13) MOVE "123E+05" TO WS-TEST-INPUT(14) MOVE "F" TO WS-EXPECTED-RESULT(14) MOVE "123-45" TO WS-TEST-INPUT(15) MOVE "F" TO WS-EXPECTED-RESULT(15) DISPLAY " ✓ Test data initialized with 15 test cases" DISPLAY SPACES. DEMONSTRATE-BASIC-NUMERIC-VALIDATION. DISPLAY "=== BASIC NUMERIC VALIDATION ===" DISPLAY SPACES DISPLAY "Testing various input formats for NUMERIC validation..." PERFORM VARYING WS-ERROR-INDEX FROM 1 BY 1 UNTIL WS-ERROR-INDEX > 15 ADD 1 TO WS-NUMERIC-TEST-COUNT MOVE WS-TEST-INPUT(WS-ERROR-INDEX) TO WS-USER-INPUT IF WS-USER-INPUT IS NUMERIC ADD 1 TO WS-PASSED-TESTS IF WS-EXPECTED-RESULT(WS-ERROR-INDEX) = "P" DISPLAY " ✅ PASS: '" WS-USER-INPUT "' is numeric (expected)" ELSE DISPLAY " ❌ FAIL: '" WS-USER-INPUT "' is numeric (unexpected)" END-IF ELSE ADD 1 TO WS-FAILED-TESTS IF WS-EXPECTED-RESULT(WS-ERROR-INDEX) = "F" DISPLAY " ✅ PASS: '" WS-USER-INPUT "' is not numeric (expected)" ELSE DISPLAY " ❌ FAIL: '" WS-USER-INPUT "' is not numeric (unexpected)" END-IF END-IF END-PERFORM COMPUTE WS-SUCCESS-PERCENTAGE = (WS-PASSED-TESTS / WS-NUMERIC-TEST-COUNT) * 100 DISPLAY " " DISPLAY " 📊 Basic Validation Results:" DISPLAY " Total tests: " WS-NUMERIC-TEST-COUNT DISPLAY " Passed: " WS-PASSED-TESTS DISPLAY " Failed: " WS-FAILED-TESTS DISPLAY " Success rate: " WS-SUCCESS-PERCENTAGE "%" DISPLAY SPACES. DEMONSTRATE-INPUT-VALIDATION-LOOP. DISPLAY "=== INPUT VALIDATION LOOP ===" DISPLAY SPACES DISPLAY "Demonstrating retry mechanism for invalid input..." MOVE 0 TO WS-RETRY-COUNT MOVE "INVALID" TO WS-USER-INPUT PERFORM GET-VALID-NUMERIC-INPUT UNTIL (WS-USER-INPUT IS NUMERIC) OR (WS-RETRY-COUNT >= WS-MAX-RETRIES) IF WS-USER-INPUT IS NUMERIC DISPLAY " ✅ Valid numeric input received: " WS-USER-INPUT MOVE WS-USER-INPUT TO WS-NUMERIC-INPUT ELSE DISPLAY " ❌ Maximum retries exceeded" DISPLAY " Last input: " WS-USER-INPUT DISPLAY " Retry count: " WS-RETRY-COUNT END-IF DISPLAY SPACES. GET-VALID-NUMERIC-INPUT. ADD 1 TO WS-RETRY-COUNT DISPLAY " 🔄 Attempt #" WS-RETRY-COUNT " - Testing input: " WS-USER-INPUT IF WS-USER-INPUT IS NOT NUMERIC DISPLAY " ⚠️ Input is not numeric" *> Simulate getting new input (in real program, use ACCEPT) EVALUATE WS-RETRY-COUNT WHEN 1 MOVE "ABC123" TO WS-USER-INPUT WHEN 2 MOVE "12.3.4" TO WS-USER-INPUT WHEN 3 MOVE "123.45" TO WS-USER-INPUT WHEN OTHER MOVE "999.99" TO WS-USER-INPUT END-EVALUATE ELSE DISPLAY " ✅ Input is numeric" END-IF. DEMONSTRATE-FINANCIAL-VALIDATION. DISPLAY "=== FINANCIAL TRANSACTION VALIDATION ===" DISPLAY SPACES DISPLAY "Validating financial transaction data..." *> Sample transaction data MOVE "123456789012" TO WS-ACCOUNT-NUMBER MOVE "1250.75" TO WS-TRANSACTION-AMOUNT MOVE "021000021" TO WS-ROUTING-NUMBER MOVE "REF123456" TO WS-REFERENCE-NUMBER MOVE 0 TO WS-ERROR-COUNT *> Validate account number IF WS-ACCOUNT-NUMBER IS NUMERIC MOVE WS-ACCOUNT-NUMBER TO WS-CONVERTED-ACCOUNT DISPLAY " ✅ Account number validation passed: " WS-ACCOUNT-NUMBER ELSE ADD 1 TO WS-ERROR-COUNT DISPLAY " ❌ Invalid account number: " WS-ACCOUNT-NUMBER END-IF *> Validate transaction amount IF WS-TRANSACTION-AMOUNT IS NUMERIC MOVE WS-TRANSACTION-AMOUNT TO WS-CONVERTED-AMOUNT DISPLAY " ✅ Amount validation passed: $" WS-TRANSACTION-AMOUNT ELSE ADD 1 TO WS-ERROR-COUNT DISPLAY " ❌ Invalid amount: " WS-TRANSACTION-AMOUNT END-IF *> Validate routing number IF WS-ROUTING-NUMBER IS NUMERIC AND FUNCTION LENGTH(FUNCTION TRIM(WS-ROUTING-NUMBER)) = 9 MOVE WS-ROUTING-NUMBER TO WS-CONVERTED-ROUTING DISPLAY " ✅ Routing number validation passed: " WS-ROUTING-NUMBER ELSE ADD 1 TO WS-ERROR-COUNT DISPLAY " ❌ Invalid routing number: " WS-ROUTING-NUMBER END-IF *> Overall transaction validation IF WS-ERROR-COUNT = 0 DISPLAY " " DISPLAY " 💰 Transaction Ready for Processing:" DISPLAY " Account: " WS-CONVERTED-ACCOUNT DISPLAY " Amount: $" WS-CONVERTED-AMOUNT DISPLAY " Routing: " WS-CONVERTED-ROUTING DISPLAY " Reference: " WS-REFERENCE-NUMBER ELSE DISPLAY " " DISPLAY " 🚫 Transaction validation failed" DISPLAY " Error count: " WS-ERROR-COUNT DISPLAY " Transaction rejected" END-IF DISPLAY SPACES. DEMONSTRATE-FILE-PROCESSING-VALIDATION. DISPLAY "=== FILE PROCESSING VALIDATION ===" DISPLAY SPACES DISPLAY "Simulating file processing with numeric validation..." *> Simulate reading records with mixed valid/invalid data MOVE 1 TO WS-RECORD-COUNT PERFORM PROCESS-SAMPLE-RECORDS VARYING WS-RECORD-COUNT FROM 1 BY 1 UNTIL WS-RECORD-COUNT > 10 DISPLAY " 📁 File Processing Summary:" DISPLAY " Total records processed: " WS-RECORD-COUNT DISPLAY " Valid records: " WS-VALID-RECORDS DISPLAY " Invalid records: " WS-INVALID-RECORDS DISPLAY " Numeric fields validated: " WS-NUMERIC-FIELDS-COUNT DISPLAY " Non-numeric fields found: " WS-NON-NUMERIC-COUNT COMPUTE WS-SUCCESS-PERCENTAGE = (WS-VALID-RECORDS / WS-RECORD-COUNT) * 100 DISPLAY " Success rate: " WS-SUCCESS-PERCENTAGE "%" DISPLAY SPACES. PROCESS-SAMPLE-RECORDS. *> Simulate different record patterns EVALUATE WS-RECORD-COUNT WHEN 1 MOVE "12345" TO WS-USER-INPUT WHEN 2 MOVE "ABC123" TO WS-USER-INPUT WHEN 3 MOVE "987.65" TO WS-USER-INPUT WHEN 4 MOVE "12.3.4" TO WS-USER-INPUT WHEN 5 MOVE "555.00" TO WS-USER-INPUT WHEN 6 MOVE "XYZ789" TO WS-USER-INPUT WHEN 7 MOVE "-123.45" TO WS-USER-INPUT WHEN 8 MOVE "12A34" TO WS-USER-INPUT WHEN 9 MOVE "999999" TO WS-USER-INPUT WHEN 10 MOVE "$123.45" TO WS-USER-INPUT END-EVALUATE ADD 1 TO WS-NUMERIC-FIELDS-COUNT IF WS-USER-INPUT IS NUMERIC ADD 1 TO WS-VALID-RECORDS DISPLAY " ✅ Record " WS-RECORD-COUNT ": Valid numeric data: " WS-USER-INPUT ELSE ADD 1 TO WS-INVALID-RECORDS ADD 1 TO WS-NON-NUMERIC-COUNT DISPLAY " ❌ Record " WS-RECORD-COUNT ": Invalid numeric data: " WS-USER-INPUT END-IF. DEMONSTRATE-BATCH-VALIDATION. DISPLAY "=== BATCH PROCESSING VALIDATION ===" DISPLAY SPACES DISPLAY "Processing employee payroll batch with validation..." *> Setup sample employee data MOVE "EMP00001" TO WS-EMP-ID(1) MOVE "75000.00" TO WS-EMP-SALARY(1) MOVE "40" TO WS-EMP-HOURS(1) MOVE "36.00" TO WS-EMP-RATE(1) MOVE "EMP00002" TO WS-EMP-ID(2) MOVE "ABC" TO WS-EMP-SALARY(2) MOVE "35" TO WS-EMP-HOURS(2) MOVE "28.50" TO WS-EMP-RATE(2) MOVE "EMP00003" TO WS-EMP-ID(3) MOVE "52000.00" TO WS-EMP-SALARY(3) MOVE "XX" TO WS-EMP-HOURS(3) MOVE "25.00" TO WS-EMP-RATE(3) MOVE "EMP00004" TO WS-EMP-ID(4) MOVE "48000.00" TO WS-EMP-SALARY(4) MOVE "37.5" TO WS-EMP-HOURS(4) MOVE "YY.ZZ" TO WS-EMP-RATE(4) MOVE "EMP00005" TO WS-EMP-ID(5) MOVE "65000.00" TO WS-EMP-SALARY(5) MOVE "42" TO WS-EMP-HOURS(5) MOVE "31.25" TO WS-EMP-RATE(5) *> Process batch PERFORM VALIDATE-EMPLOYEE-RECORD VARYING WS-ERROR-INDEX FROM 1 BY 1 UNTIL WS-ERROR-INDEX > 5 DISPLAY " " DISPLAY " 👥 Batch Processing Results:" DISPLAY " Employees processed: 5" DISPLAY " Valid records: " WS-PROCESSED-COUNT DISPLAY " Records with errors: " WS-ERROR-COUNT-BATCH DISPLAY " Total payroll: $" WS-TOTAL-PAYROLL DISPLAY SPACES. VALIDATE-EMPLOYEE-RECORD. MOVE 0 TO WS-ERROR-COUNT DISPLAY " Processing " WS-EMP-ID(WS-ERROR-INDEX) ":" *> Validate salary IF WS-EMP-SALARY(WS-ERROR-INDEX) IS NUMERIC DISPLAY " ✅ Salary: $" WS-EMP-SALARY(WS-ERROR-INDEX) ELSE ADD 1 TO WS-ERROR-COUNT DISPLAY " ❌ Invalid salary: " WS-EMP-SALARY(WS-ERROR-INDEX) END-IF *> Validate hours IF WS-EMP-HOURS(WS-ERROR-INDEX) IS NUMERIC DISPLAY " ✅ Hours: " WS-EMP-HOURS(WS-ERROR-INDEX) ELSE ADD 1 TO WS-ERROR-COUNT DISPLAY " ❌ Invalid hours: " WS-EMP-HOURS(WS-ERROR-INDEX) END-IF *> Validate rate IF WS-EMP-RATE(WS-ERROR-INDEX) IS NUMERIC DISPLAY " ✅ Rate: $" WS-EMP-RATE(WS-ERROR-INDEX) ELSE ADD 1 TO WS-ERROR-COUNT DISPLAY " ❌ Invalid rate: " WS-EMP-RATE(WS-ERROR-INDEX) END-IF *> Update counters IF WS-ERROR-COUNT = 0 ADD 1 TO WS-PROCESSED-COUNT IF WS-EMP-SALARY(WS-ERROR-INDEX) IS NUMERIC ADD FUNCTION NUMVAL(WS-EMP-SALARY(WS-ERROR-INDEX)) TO WS-TOTAL-PAYROLL END-IF ELSE ADD 1 TO WS-ERROR-COUNT-BATCH END-IF. DEMONSTRATE-COMPLEX-VALIDATION-SCENARIOS. DISPLAY "=== COMPLEX VALIDATION SCENARIOS ===" DISPLAY SPACES DISPLAY "Testing edge cases and complex validation logic..." *> Test zero values MOVE "0" TO WS-USER-INPUT IF WS-USER-INPUT IS NUMERIC DISPLAY " ✅ Zero value validation: '" WS-USER-INPUT "' is numeric" END-IF *> Test leading zeros MOVE "00123" TO WS-USER-INPUT IF WS-USER-INPUT IS NUMERIC DISPLAY " ✅ Leading zeros validation: '" WS-USER-INPUT "' is numeric" END-IF *> Test decimal only MOVE ".123" TO WS-USER-INPUT IF WS-USER-INPUT IS NUMERIC DISPLAY " ✅ Decimal only: '" WS-USER-INPUT "' is numeric" ELSE DISPLAY " ❌ Decimal only: '" WS-USER-INPUT "' is not numeric" END-IF *> Test signed numbers MOVE "-0" TO WS-USER-INPUT IF WS-USER-INPUT IS NUMERIC DISPLAY " ✅ Negative zero: '" WS-USER-INPUT "' is numeric" ELSE DISPLAY " ❌ Negative zero: '" WS-USER-INPUT "' is not numeric" END-IF *> Test very large numbers MOVE "999999999999999" TO WS-USER-INPUT IF WS-USER-INPUT IS NUMERIC DISPLAY " ✅ Large number: '" WS-USER-INPUT "' is numeric" END-IF DISPLAY SPACES. DEMONSTRATE-ERROR-HANDLING. DISPLAY "=== ERROR HANDLING AND LOGGING ===" DISPLAY SPACES DISPLAY "Demonstrating error tracking for non-numeric data..." *> Reset error index for logging MOVE 1 TO WS-ERROR-INDEX *> Test various error conditions PERFORM LOG-VALIDATION-ERROR WITH "ACCOUNT-NUMBER" "ABC123DEF" "ALPHABETIC" PERFORM LOG-VALIDATION-ERROR WITH "AMOUNT" "12.34.56" "MULTIPLE-DECIMALS" PERFORM LOG-VALIDATION-ERROR WITH "RATE" "$123.45" "CURRENCY-SYMBOL" PERFORM LOG-VALIDATION-ERROR WITH "QUANTITY" "1,234" "COMMA-SEPARATOR" PERFORM LOG-VALIDATION-ERROR WITH "ID" " " "SPACES-ONLY" *> Display error log DISPLAY " 📋 Error Log Summary:" PERFORM VARYING WS-RETRY-COUNT FROM 1 BY 1 UNTIL WS-RETRY-COUNT >= WS-ERROR-INDEX DISPLAY " " WS-RETRY-COUNT ": " WS-ERROR-FIELD(WS-RETRY-COUNT) " = '" WS-ERROR-VALUE(WS-RETRY-COUNT) "' (" WS-ERROR-TYPE(WS-RETRY-COUNT) ")" END-PERFORM DISPLAY SPACES. LOG-VALIDATION-ERROR. USING WS-FIELD-NAME WS-FIELD-VALUE WS-ERROR-DESCRIPTION. MOVE WS-FIELD-NAME TO WS-ERROR-FIELD(WS-ERROR-INDEX) MOVE WS-FIELD-VALUE TO WS-ERROR-VALUE(WS-ERROR-INDEX) MOVE WS-ERROR-DESCRIPTION TO WS-ERROR-TYPE(WS-ERROR-INDEX) MOVE FUNCTION CURRENT-DATE TO WS-ERROR-TIMESTAMP(WS-ERROR-INDEX) ADD 1 TO WS-ERROR-INDEX. DISPLAY-VALIDATION-STATISTICS. DISPLAY "=== VALIDATION STATISTICS SUMMARY ===" DISPLAY SPACES DISPLAY "Final statistics for all validation tests:" DISPLAY " 📊 Overall Results:" DISPLAY " Total NUMERIC tests performed: " WS-NUMERIC-TEST-COUNT DISPLAY " Successful validations: " WS-PASSED-TESTS DISPLAY " Failed validations: " WS-FAILED-TESTS DISPLAY " Error log entries: " WS-ERROR-INDEX DISPLAY " File records processed: " WS-RECORD-COUNT DISPLAY " Batch employees processed: 5" DISPLAY " " DISPLAY " ✅ Validation capabilities demonstrated:" DISPLAY " ✓ Basic NUMERIC class testing" DISPLAY " ✓ Input validation loops" DISPLAY " ✓ Financial transaction validation" DISPLAY " ✓ File processing validation" DISPLAY " ✓ Batch processing validation" DISPLAY " ✓ Complex validation scenarios" DISPLAY " ✓ Error handling and logging" DISPLAY SPACES.

NUMERIC Validation Features

Data Type Testing
  • • Validates numeric characters (0-9)
  • • Handles sign characters (+/-)
  • • Tests different USAGE formats
  • • Supports decimal point validation
Input Validation
  • • User input verification
  • • Batch processing validation
  • • File data integrity checks
  • • Database field validation
Error Prevention
  • • Prevents arithmetic errors
  • • Ensures data consistency
  • • Validates before computation
  • • Supports error logging
Business Applications
  • • Financial transaction validation
  • • Account number verification
  • • Amount field validation
  • • Rate and percentage checks

Interactive Tutorial

Hands-On Exercise: Data Validation System
Practice using NUMERIC for comprehensive input validation and data integrity checking

Exercise 1: Customer Registration 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
01 CUSTOMER-INPUT. 05 CUSTOMER-ID-INPUT PIC X(10). 05 PHONE-INPUT PIC X(15). 05 CREDIT-LIMIT-INPUT PIC X(12). 05 DISCOUNT-RATE-INPUT PIC X(6). 01 CUSTOMER-RECORD. 05 CUSTOMER-ID PIC 9(10). 05 PHONE-NUMBER PIC 9(10). 05 CREDIT-LIMIT PIC 9(8)V99. 05 DISCOUNT-RATE PIC 9(2)V99. 01 VALIDATION-FLAGS. 05 ALL-VALID PIC X VALUE 'Y'. 05 ERROR-COUNT PIC 9(2) VALUE 0. PROCEDURE DIVISION. VALIDATE-CUSTOMER-REGISTRATION. MOVE 'Y' TO ALL-VALID MOVE 0 TO ERROR-COUNT *> Validate Customer ID IF CUSTOMER-ID-INPUT IS NUMERIC MOVE CUSTOMER-ID-INPUT TO CUSTOMER-ID DISPLAY "✅ Customer ID valid: " CUSTOMER-ID ELSE MOVE 'N' TO ALL-VALID ADD 1 TO ERROR-COUNT DISPLAY "❌ Customer ID must be numeric: " CUSTOMER-ID-INPUT END-IF *> Validate Phone Number (digits only) IF PHONE-INPUT IS NUMERIC AND FUNCTION LENGTH(FUNCTION TRIM(PHONE-INPUT)) = 10 MOVE PHONE-INPUT TO PHONE-NUMBER DISPLAY "✅ Phone number valid: " PHONE-NUMBER ELSE MOVE 'N' TO ALL-VALID ADD 1 TO ERROR-COUNT DISPLAY "❌ Phone must be 10 digits: " PHONE-INPUT END-IF *> Validate Credit Limit IF CREDIT-LIMIT-INPUT IS NUMERIC MOVE CREDIT-LIMIT-INPUT TO CREDIT-LIMIT IF CREDIT-LIMIT >= 0 AND CREDIT-LIMIT <= 999999.99 DISPLAY "✅ Credit limit valid: $" CREDIT-LIMIT ELSE MOVE 'N' TO ALL-VALID ADD 1 TO ERROR-COUNT DISPLAY "❌ Credit limit out of range: $" CREDIT-LIMIT END-IF ELSE MOVE 'N' TO ALL-VALID ADD 1 TO ERROR-COUNT DISPLAY "❌ Credit limit must be numeric: " CREDIT-LIMIT-INPUT END-IF *> Validate Discount Rate IF DISCOUNT-RATE-INPUT IS NUMERIC MOVE DISCOUNT-RATE-INPUT TO DISCOUNT-RATE IF DISCOUNT-RATE >= 0 AND DISCOUNT-RATE <= 99.99 DISPLAY "✅ Discount rate valid: " DISCOUNT-RATE "%" ELSE MOVE 'N' TO ALL-VALID ADD 1 TO ERROR-COUNT DISPLAY "❌ Discount rate must be 0-99.99%: " DISCOUNT-RATE END-IF ELSE MOVE 'N' TO ALL-VALID ADD 1 TO ERROR-COUNT DISPLAY "❌ Discount rate must be numeric: " DISCOUNT-RATE-INPUT END-IF *> Final validation result IF ALL-VALID = 'Y' DISPLAY " " DISPLAY "🎉 Customer registration validation PASSED" PERFORM SAVE-CUSTOMER-RECORD ELSE DISPLAY " " DISPLAY "❌ Customer registration validation FAILED" DISPLAY " Total errors: " ERROR-COUNT DISPLAY " Please correct the errors and try again" END-IF.

Exercise 2: Financial Transaction Processor

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
01 TRANSACTION-INPUT. 05 FROM-ACCOUNT-INPUT PIC X(12). 05 TO-ACCOUNT-INPUT PIC X(12). 05 AMOUNT-INPUT PIC X(15). 05 ROUTING-INPUT PIC X(9). 01 TRANSACTION-RECORD. 05 FROM-ACCOUNT PIC 9(12). 05 TO-ACCOUNT PIC 9(12). 05 TRANSACTION-AMOUNT PIC 9(10)V99. 05 ROUTING-NUMBER PIC 9(9). 01 BUSINESS-RULES. 05 MIN-AMOUNT PIC 9(4)V99 VALUE 0.01. 05 MAX-AMOUNT PIC 9(8)V99 VALUE 50000.00. 05 MAX-DAILY-LIMIT PIC 9(8)V99 VALUE 10000.00. PROCEDURE DIVISION. PROCESS-FINANCIAL-TRANSACTION. PERFORM VALIDATE-TRANSACTION-DATA IF VALIDATION-PASSED PERFORM APPLY-BUSINESS-RULES IF BUSINESS-RULES-PASSED PERFORM EXECUTE-TRANSACTION END-IF END-IF. VALIDATE-TRANSACTION-DATA. MOVE 'Y' TO VALIDATION-PASSED *> Validate from account IF FROM-ACCOUNT-INPUT IS NUMERIC AND FUNCTION LENGTH(FUNCTION TRIM(FROM-ACCOUNT-INPUT)) = 12 MOVE FROM-ACCOUNT-INPUT TO FROM-ACCOUNT DISPLAY "✅ From account validated: " FROM-ACCOUNT ELSE MOVE 'N' TO VALIDATION-PASSED DISPLAY "❌ Invalid from account: " FROM-ACCOUNT-INPUT EXIT PARAGRAPH END-IF *> Validate to account IF TO-ACCOUNT-INPUT IS NUMERIC AND FUNCTION LENGTH(FUNCTION TRIM(TO-ACCOUNT-INPUT)) = 12 MOVE TO-ACCOUNT-INPUT TO TO-ACCOUNT DISPLAY "✅ To account validated: " TO-ACCOUNT ELSE MOVE 'N' TO VALIDATION-PASSED DISPLAY "❌ Invalid to account: " TO-ACCOUNT-INPUT EXIT PARAGRAPH END-IF *> Validate amount IF AMOUNT-INPUT IS NUMERIC MOVE AMOUNT-INPUT TO TRANSACTION-AMOUNT DISPLAY "✅ Amount validated: $" TRANSACTION-AMOUNT ELSE MOVE 'N' TO VALIDATION-PASSED DISPLAY "❌ Invalid amount: " AMOUNT-INPUT EXIT PARAGRAPH END-IF *> Validate routing number IF ROUTING-INPUT IS NUMERIC AND FUNCTION LENGTH(FUNCTION TRIM(ROUTING-INPUT)) = 9 MOVE ROUTING-INPUT TO ROUTING-NUMBER DISPLAY "✅ Routing number validated: " ROUTING-NUMBER ELSE MOVE 'N' TO VALIDATION-PASSED DISPLAY "❌ Invalid routing number: " ROUTING-INPUT END-IF. APPLY-BUSINESS-RULES. MOVE 'Y' TO BUSINESS-RULES-PASSED *> Check minimum amount IF TRANSACTION-AMOUNT < MIN-AMOUNT MOVE 'N' TO BUSINESS-RULES-PASSED DISPLAY "❌ Amount below minimum: $" MIN-AMOUNT EXIT PARAGRAPH END-IF *> Check maximum amount IF TRANSACTION-AMOUNT > MAX-AMOUNT MOVE 'N' TO BUSINESS-RULES-PASSED DISPLAY "❌ Amount exceeds maximum: $" MAX-AMOUNT EXIT PARAGRAPH END-IF *> Check daily limit (simplified check) IF TRANSACTION-AMOUNT > MAX-DAILY-LIMIT MOVE 'N' TO BUSINESS-RULES-PASSED DISPLAY "❌ Amount exceeds daily limit: $" MAX-DAILY-LIMIT EXIT PARAGRAPH END-IF DISPLAY "✅ All business rules passed".

Best Practices

Knowledge Check

Test Your Understanding

Question 1: NUMERIC Class Test Purpose

What is the primary purpose of the NUMERIC class test?

Answer: The NUMERIC class test determines if a data item contains only valid numeric characters (0-9) and optionally valid sign characters. It's used to validate data before arithmetic operations and ensure data integrity.

Question 2: Data Format Handling

How does NUMERIC handle different data formats like COMP and COMP-3?

Answer: NUMERIC tests based on the PICTURE clause and internal representation. For display items, it checks characters 0-9 and signs. For packed decimal (COMP-3) and binary (COMP) items, it examines the internal encoding for valid numeric representation.

Question 3: Best Practices

When should you use NUMERIC validation in your programs?

Answer: Use NUMERIC validation before arithmetic operations, at input boundaries, when processing external data, and in file processing scenarios. Always validate user input and data from external sources to prevent runtime errors and ensure data integrity.