0

我的地图中有 4 个字段,分别是 9(6)、9(3)、9(3)、9(3)。我写了这样的验证代码:

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.

但是从 cics 将 A12AK 之类的值插入数据库时​​,我没有收到任何错误。它将 A 替换为 1,B 替换为 2,依此类推……为什么会发生这种情况?以及如何避免这种情况

4

3 回答 3

6

Gilbert 在修复 CICS 地图方面为您提供了很好的建议。拿着!

让我试着解释一下“奇怪”的价值观......

当字符 ( PIC X) 放置在PIC 9数据项中时,表示字符值的字节的高 4 位被 'F'x 覆盖。低 4 位保持原样。

此时,查看EBCDIC 字符图可能很有用

请注意,“A”的十六进制表示是“C1”x,而 1 是“F1”x。当“A”移动到一个 PIC 9字段时,它变为 1(高 4 位“C”x 被替换为“F”x,低 4 位保持原样)。字母表中所有字母的类似类型。请注意,从 'A' 到 'Z' 的 EBCDIC 字符序列是不连续的(当低 4 位滚动到 'A'x - 'F'x 范围内时会有间隙)。这就是为什么在将字母从“X”类型移动到“9”类型字段时总是会得到一个“有效”数字的原因。

当仅涉及数字、字母和空格时,结果是从“X”类型数据项移动到“9”类型数据项后的有效数值。这将通过IF NUMERIC测试。

您的问题的根源是您的 CICS 映射允许非数字数据输入,当该值传输到定义为PIC 9如上所述转换的工作存储项时。不是你想要的!正如吉尔伯特指出的那样,如果您将 CICS 映射字段定义为“NUM”,则用户可以输入的唯一有效字符是数字,这可以解决您的问题。

最后,请注意一些非字母字符,例如“@”,不会连贯为有效数字。

于 2012-04-30T17:09:11.260 回答
4

将 ATTRB=(UNPROT,NUM,FSET,IC) 添加到数字字段的 BMS 地图集的 DFHMDF 字段。

您还需要 JUSTIFY=(RIGHT,ZERO)。

于 2012-04-30T16:22:47.280 回答
1

CICS 还提供 BIF DEEDIT 选项。

于 2012-05-01T01:57:22.837 回答