如何检查 Work-Trig 以确保它都是数字?
代码:
工作触发是 --> 20140101
CHECK-TRIG.
IF WORK-TRIG IS NUMERIC THEN
MOVE "FALSE" TO ERR-TRIG
ELSE
MOVE "TRUE" TO ERR-TRIG
END-IF.
DISPLAY 'ERR-TRIG' ERR-TRIG.
X-CHECK. EXIT.
01 WORK-TRIG.
05 TRIG-YEAR PIC X(08) VALUE SPACES.
05 TRIG-MONTH PIC X(01) VALUE SPACES.
05 TRIG-DAY PIC X(01) VALUE SPACES.
05 FILLER PIC X(70) VALUE SPACES.
问题是 WORK-TRIG 的长度是 80 个字节。前 8 个字节包含您的数据,但整个 80 个字节将被测试为数字。
您有前八个字节的数据名称。如果您测试它而不是组项,您的代码将会工作。
CHECK-TRIG.
IF WORK-YEAR IS NUMERIC THEN
MOVE "FALSE" TO ERR-TRIG
ELSE
MOVE "TRUE" TO ERR-TRIG
END-IF.
DISPLAY 'ERR-YEAR' ERR-TRIG.
X-CHECK. EXIT.
如果您有一个名为 WORK-YEAR 的数据名称,它应该只包含年份。它不应包含完整的日期。数据的好名称的目的是让我们人类能够更好地阅读和理解您的代码。在查找问题时,我们发现 WORK-YEAR 有 8 个字节长,并且必须花时间找出它是否是正确的长度,或者正确的名称和错误的长度。
考虑到代码更改,最好也为 ERR-TRIG 使用不同的名称。
还有更晦涩的方法来测试组项目的前八个字节,但由于您已经有了一个名称,因此希望我们能够将引用修改排除在外。
以下代码示例有效,并将检查 WORK-TRIG1 中的每个位置以查看该值是否为数字。我对此进行了测试,它确实有效。此示例使用 PERFORM VARYING 循环对字符串中的每个“位置”进行索引以查看其是否有效。
Should Work ALSO:
IF A IS NUMERIC THEN
//code here
END-IF
我确实知道下面的代码可以工作,因为我直接从一个运行完美且自 88 或 89 开始的程序中获取了它。
代码:
CHECK-TRIG.
PERFORM VARYING SUB1 FROM 1 BY 1 UNTIL SUB1 > 8
IF WORK-TRIG(1:SUB1) IS NUMERIC THEN
MOVE 'FALSE' TO ERR-TRIG
ELSE
MOVE 'TRUE' TO ERR-TRIG
MOVE SUB1 TO SV-RTN-CODE
MOVE 9 TO SUB1
END-IF
END-PERFORM.
X-CHECK. EXIT.
--代码--新的,这不起作用
PERFORM VARYING SUB1 FROM 1 BY 1 UNTIL SUB1 > 8
IF WORK-TRIG(SUB1:8) IS NUMERIC THEN
MOVE 'FALSE' TO ERR-TRIG
ELSE
MOVE 'TRUE' TO ERR-TRIG
MOVE SUB1 TO SV-RTN-CODE
MOVE ' TRIGGER CARD ERROR (SEE DATE BELOW)' TO
ERR-DET
MOVE 9 TO SUB1
END-IF
END-PERFORM.
最近经历过将非数字成功处理为数字(COMP-3)字段。
“FALSE99999999”的值移至 COMP-3 字段并变为 6132599999999,并且程序从未遇到 S0C7 ABEND。
看起来验证源字段的每个字节是识别此类问题的唯一方法。
我认为这有效吗? 由于某种原因,如果 VARIABLE = SPACES,它被视为数字。
IF FUNCTION TRIM(VARIABLE) IS NOT = SPACES AND
FUNCTION TRIM(VARIABLE) IS NUMERIC THEN
DISPLAY 'NUMERIC'
DISPLAY FUNCTION TRIM(VARIABLE)
ELSE
DISPLAY 'NOT NUMERIC'
DISPLAY FUNCTION TRIM(VARIABLE)
END-IF