将BINARY INTEGER变量与COBOL中的ALPHANUMERIC变量进行比较

时间:2014-01-06 19:56:41

标签: cobol mainframe

 IF AWA-REQ-DATE < WS-JULIAN-DATE
    MOVE VAR1 to VAR2

AWA-REQ-DATE是二进制整数,即PIC S9(09)COMP,而Julian日期是PIC X(10)VALUE SPACES。

他们内部都有Julian约会,如2013031&amp; 2013099。

这给出了:

ERROR:REQ-DATE(BINARY INTEGER)“与”WS-JULIAN-date(ALPHANUMERIC)“进行了比较。放弃了

我可以将其中的一个转换为代码中的其他格式吗?

4 个答案:

答案 0 :(得分:4)

您所有的四位数年份朱利安日期将包含七位数字。它们是约会,所以自然是积极的。

目前还不清楚为什么你有一个九位数的签名二进制文件来保存这样或日期。也不是10字节的字母数字。还不清楚为什么这应该具有SPACE的初始值。

01  WS-JULIAN-DATE                          VALUE SPACE.
    05  WS-JULIAN-DATE-NUM                  PIC 9(7).
    05  FILLER                              PIC XXX.

这假设您的所有WS-JULIAN-DATE值都是左对齐的。

IF AWA-REQ-DATE < WS-JULIAN-DATE
    MOVE VAR1 to VAR2
END-IF

希望VAR1和VAR2只是问题的样本名称。如果没有,请让它们有意义,因为这将使下一个阅读程序的人更容易理解。那可能就是你。

如果WS -...的值不能保证为NUMERIC,请测试它们是否为NUMERIC并采取适当的行动(根据您的规格),如果不是。

九位二进制文​​件可能会生成超出需要的额外代码。

另一种可能性是:

01  WS-AWA-REQ-JULIAN-DATE                  VALUE SPACE.
    05  WS-AWA-REQ-JULIAN-DATE-NUM          PIC 9(7).
    05  FILLER                              PIC XXX.

MOVE AWA-REQ-DATE                           TO WS-AWA-REQ-JULIAN-DATE-NUM


IF WS-AWA-REQ-JULIAN DATE < WS-JULIAN-DATE
    MOVE VAR1 to VAR2
END-IF

您选择的内容取决于您对字段的其他操作。

此外,如果一个是“不变”,则将其转换为与变量1相同的格式,仅一次。

答案 1 :(得分:1)

在各种ISO / ANSI COBOL标准中,比较字母数字(PIC X)和数字(PIC 9)就像比较苹果和橙子。有定义的规则。当然,每个编译器都有不同的解释标准的方法。因此,您最好将其中一个字段转换为其他格式并进行比较。 Bill Woodger对要转换的字段以及如何转换有一些很好的评论。

总之,您应该始终比较类似的数据类型。对于数字项,最好是可以比较相同的COMP格式,但有时无法完成。如果是这种情况,您需要阅读编译器文档,以了解如何在不同的计算类型和任何陷阱(例如IBM的Enterprise COBOL中的COMP-4COMP-5)之间执行比较。

答案 2 :(得分:0)

答案可能取决于您使用的编译器。在GNU Cobol上,比较在将FUNCTION NUMVAL应用于Julian(文本)日期后起作用。

答案 3 :(得分:0)

如错误消息所述:数字值 PIC S9(9)COMP 无法与字符串 PIC X(10)进行比较。

COMP 变量是值的系统相关的数字表示。用于计算的内部表示(二进制,BCD,......)有变化。根据机器的不同,您的日期值在内部表示为:0011110 10110111 01100111

显示变量根据编码标准(ASCII,EBCDIC,UNICODE)存储变量的每个位置。同样,根据您的计算机和编码表,您的变量的表示形式可能是:00110010 00110000 00110001 00110011 00110000 00111001 00111001

我在这里做一些猜测,以解决潜在的问题

首先猜测:alpha定义PIC X(10)看起来像是打印格式的日期,应该包含分隔符以使其长10个字符

21.02.2014
123456789A

这样的变量毕竟不应该是朱利安日期,你可能需要一个日期比较函数。

第二个猜测:对于一些显示原因,你想要一个长度为10个字符的变量,将julian日期保存在前7个字符中。在这种情况下,我会定义一个结构,你可以保持比较:

01  WS-JULIAN-DATE-PRINT                    VALUE SPACE.
    05  WS-JULIAN-DATE                 PIC 9(7).
    05  FILLER                         PIC X(3).