I have 4 fields in my map which are 9(6),9(3),9(3),9(3). I wrote validation code like this:
IF ROLLNUM IS NOT NUMERIC
MOVE DFHRED TO ROLLNUMC
MOVE 'INVALID DATA' TO RESMSGO
MOVE ROLLNUMI TO ROLLNUMO
PERFORM SEND-MAP THRU SEND-MAP-EXIT
PERFORM KEY-VALIDATION THRU KEY-VALIDATION-EXIT.
But I am not getting any kind of error while inserting the values like A12AK into the database from cics. It is replacing A with 1, B with 2, and so on...
Why is this happening? And how to avoid this
Add ATTRB=(UNPROT,NUM,FSET,IC) to the DFHMDF fields of the BMS mapset for the numeric fields.
You'll also need JUSTIFY=(RIGHT,ZERO).
Gilbert is giving you good advice on fixing your CICS map. Take it!
Let me try to explain the "strange" values...
When a character (PIC X
) is placed in a PIC 9
data item the
upper 4 bits of the byte representing the character value are overwitten with 'F'x. The
lower 4 bits are left as-is.
At this point it might be useful to look at an EBCDIC character chart
Notice that the hex representation of an 'A' is 'C1'x and 1 is 'F1'x. When an 'A' is moved to a
PIC 9
field it becomes a 1 (the upper 4 bits, 'C'x, are replaced with 'F'x, the lower 4 bits are left as-is).
Similar type of thing for all letters of the alphabet. Notice that
the EBCDIC character sequence for 'A' through 'Z' is not contiguous (there are gaps when the lower 4 bits
roll into the 'A'x - 'F'x range). This is why you will always get a 'valid' digit when moving a letter from an 'X' type to a '9' type field.
The result is a valid numeric value after a move from an 'X' to '9' type data item when only digits, letters and SPACE are involved.
This will then pass an IF NUMERIC
test.
The root of your problem is that your CICS map allows for non numeric data entry, when that value is transferred to your
working storage item defined as PIC 9
it is converted as described above. Not what you want! As Gilbert pointed out, if you define
the CICS map field as 'NUM' the only valid characters the user can enter are digits, which solves your problem.
Finally, notice that some non alpha characters, such as '@' will not coherse into a valid digit.
CICS also offers the BIF DEEDIT option.