如何检查Work-Trig以确保它是全数字?
代码:
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.
答案 0 :(得分:2)
问题是WORK-TRIG长80个字节。前八个字节包含您的数据,但整个80字节将被测试为NUMERIC。
前八个字节有一个数据名。如果您测试的是而不是group-item,那么您的代码将起作用。
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使用不同的名称。
有一些比较模糊的方法可以测试组项的前八个字节,但由于你已经有一个名字,所以我们希望我们能够将参考修改保留在这个名称之外。
答案 1 :(得分:1)
以下代码示例有效并将检查WORK-TRIG1中的每个位置,以查看该值是否为NUMERIC。我测试了它,它确实有效。此示例使用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.
答案 2 :(得分:0)
最近经历过将非数字成功处理为数字 (COMP-3) 字段。
'FALSE99999999' 的值移入 COMP-3 字段并变为 6132599999999,并且程序从未遇到 S0C7 异常终止。
看起来验证源字段的每个字节是识别此类问题的唯一方法。