这是按记录工作的。我知道这不是你想听到的,但有时就是这样。您的应用程序异常终止,因为 NUMCHECK 编译选项检测到它认为无效的数据。
请注意,IBM COBOL 6.2 的 NUMCLS 安装选项控制 IF NUMERIC 类测试的行为,其隐式版本由 NUMCHECK 编译选项生成。如果您的打包数据是没有符号定义的,即
77 XYZ PIC 999 COMP-3.
然后文档表明 x'F' 的符号半字节是唯一将通过 IF NUMERIC 类测试的符号半字节。符号半字节的任何其他值都被视为无效。
摘自 IBM Enterprise COBOL 6.2 文档...
Table 1. NUMCLS(PRIM) and valid signs
NUMPROC(NOPFD) NUMPROC(PFD)
Signed C, D, F C, D, +0 (positive zero)
Unsigned F F
Table 2. NUMCLS(ALT) and valid signs
NUMPROC(NOPFD) NUMPROC(PFD)
Signed A to F C, D, +0 (positive zero)
Unsigned F F
IBM COBOL 4.2 的 NUMCLS 选项的文档措辞肯定不同...
使用 ALT 进行处理接受有效的十六进制 A 到 F。
使用 PRIM 进行处理接受有效的十六进制 C、D 和 F。
您可能想查看https://www.ibm.com/support/pages/node/604539#112918 以查看是否有任何 PTF 适用于您的情况。
您可以尝试向 IBM 提出问题,但问题是:如果您有未签名的数据,则可以提出一个论点,即有一个符号半字节表示正数 (x'C') 或负数 (x'D ') 符号无效。我怀疑这是 NUMCHECK 选项按其方式工作的部分原因。
可能的解决方案包括让您的汇编程序调用您的 COBOL 程序对它们传递的任何打包数据进行符号修复。可能是最后一个字节上的 OI。您可以为商店的 SORT 实用程序编写控制卡,以修复平面文件中的打包数据。您可以更改您的 COBOL 程序中未签名的打包数据项以进行签名。
这完全取决于你想要什么样的行为。你说你不能相信你的数值变量的内容。如果这意味着您有时会使用 x'A' 而不是 x'C' 的符号半字节来表示正值,那么如果 NUMCLS(ALT) 有效,则可以使用 NUMPROC(NOPFD)。
如果 NUMCLS(ALT) 生效,另一种可能的解决方案是使用 NUMPROC(NOPFD) 进行编译并使用签名字段来最初保存您的数据。根据文档,将数据移动到未签名的字段将修复符号。请注意,NUMPROC(NOPFD) 的性能不如 NUMPROC(PFD)。
以下是我对哪些符号半字节导致 IF NUMERIC 测试为真的文档的理解的扩展。我无法对此进行测试,这只是我将文档的隐式语言转换为显式表的尝试。它确实突出了 IBM Enterprise COBOL 4.x 与 IBM Enterprise COBOL v5 及更高版本之间的区别。
SIGN COBOL 5+ COBOL 4
NUMCLS NUMPROC SIGNED NIBBLE NUMERIC NUMERIC
ALT NOPFD YES X'A' TRUE TRUE
ALT NOPFD YES X'B' TRUE TRUE
ALT NOPFD YES X'C' TRUE TRUE
ALT NOPFD YES X'D' TRUE TRUE
ALT NOPFD YES X'E' TRUE TRUE
ALT NOPFD YES X'F' TRUE TRUE
ALT NOPFD NO X'A' FALSE TRUE
ALT NOPFD NO X'B' FALSE TRUE
ALT NOPFD NO X'C' FALSE TRUE
ALT NOPFD NO X'D' FALSE TRUE
ALT NOPFD NO X'E' FALSE TRUE
ALT NOPFD NO X'F' TRUE TRUE
ALT PFD YES X'A' FALSE FALSE
ALT PFD YES X'B' FALSE FALSE
ALT PFD YES X'C' TRUE TRUE
ALT PFD YES X'D' TRUE TRUE
ALT PFD YES X'E' FALSE FALSE
ALT PFD YES X'F' FALSE FALSE
ALT PFD NO X'A' FALSE FALSE
ALT PFD NO X'B' FALSE FALSE
ALT PFD NO X'C' FALSE FALSE
ALT PFD NO X'D' FALSE FALSE
ALT PFD NO X'E' FALSE FALSE
ALT PFD NO X'F' TRUE TRUE
PRIM NOPFD YES X'A' FALSE FALSE
PRIM NOPFD YES X'B' FALSE FALSE
PRIM NOPFD YES X'C' TRUE TRUE
PRIM NOPFD YES X'D' TRUE TRUE
PRIM NOPFD YES X'E' FALSE FALSE
PRIM NOPFD YES X'F' TRUE TRUE
PRIM NOPFD NO X'A' FALSE FALSE
PRIM NOPFD NO X'B' FALSE FALSE
PRIM NOPFD NO X'C' FALSE TRUE
PRIM NOPFD NO X'D' FALSE TRUE
PRIM NOPFD NO X'E' FALSE FALSE
PRIM NOPFD NO X'F' TRUE TRUE
PRIM PFD YES X'A' FALSE FALSE
PRIM PFD YES X'B' FALSE FALSE
PRIM PFD YES X'C' TRUE TRUE
PRIM PFD YES X'D' TRUE TRUE
PRIM PFD YES X'E' FALSE FALSE
PRIM PFD YES X'F' FALSE FALSE
PRIM PFD NO X'A' FALSE FALSE
PRIM PFD NO X'B' FALSE FALSE
PRIM PFD NO X'C' FALSE FALSE
PRIM PFD NO X'D' FALSE FALSE
PRIM PFD NO X'E' FALSE FALSE
PRIM PFD NO X'F' TRUE TRUE