UNSTRING后向COMP-3字段移动数据触发S0C7 Abend错误求助
COBOL中MOVE数值字段到COMP-3时触发S0C7异常的解决方法
问题根源
你的S0C7异常源于UNSTRING将带小数点的字符串直接存入了隐含小数点的DISPLAY数值字段NOA/NOB,导致这两个字段的内部存储包含非法的小数点字符,后续MOVE到COMP-3字段时,COBOL无法解析不符合规则的数值内容,触发数据异常。
具体细节:
PIC S9(9)V9(02)是DISPLAY格式的数值字段,其中V仅表示隐含的小数点位置,实际存储中不会保留小数点字符,合法内容应为无小数点的数字串(比如6499对应逻辑值64.99)。- UNSTRING将
'64.99'直接写入NOA/NOB后,字段内存储了小数点.,破坏了DISPLAY数值字段的格式规则,此时NOA/NOB已不是合法的数值数据。 - 执行
MOVE NOA TO NOC时,COBOL尝试将含非法字符的内容转换为COMP-3格式,遇到非数字字符触发S0C7。
解决方案
方案1:先存字符字段,去除小数点后转数值
修改数据定义,将拆分结果先存入字符字段,去掉小数点后再转入DISPLAY数值字段,最后移动到COMP-3:
IDENTIFICATION DIVISION. PROGRAM-ID. ADDPROG. DATA DIVISION. WORKING-STORAGE SECTION. 01 VALUEA PIC X(20) VALUE '64.99|64.99'. 01 NOA-CHAR PIC X(5). // 存储带小数点的拆分字符串 01 NOB-CHAR PIC X(5). 01 NOA PIC S9(9)V9(02). 01 NOB PIC S9(9)V9(02). 01 NOC PIC S9(9)V99 COMP-3. 01 NOD PIC S9(9)V99 COMP-3. PROCEDURE DIVISION. 000-MAIN. DISPLAY "EARLIER". DISPLAY 'NOA-' NOA. DISPLAY 'NOB-' NOB. DISPLAY "AFTER". UNSTRING VALUEA DELIMITED BY '|' INTO NOA-CHAR, NOB-CHAR. // 移除字符字段中的小数点 INSPECT NOA-CHAR REPLACE ALL '.' BY SPACES. INSPECT NOB-CHAR REPLACE ALL '.' BY SPACES. // 处理后的字符自动对齐隐含小数点,转入数值字段 MOVE NOA-CHAR TO NOA. MOVE NOB-CHAR TO NOB. DISPLAY 'NOA-' NOA. DISPLAY 'NOB-' NOB. MOVE NOA TO NOC. MOVE NOB TO NOD. DISPLAY 'NOC-' NOC. DISPLAY 'NOD-' NOD. STOP RUN.
方案2:用NUMVAL-C函数直接转换字符串到COMP-3
COBOL的NUMVAL-C函数可直接解析带小数点的字符串为数值,跳过中间的DISPLAY数值字段,直接生成COMP-3数据,是最简洁的方案:
IDENTIFICATION DIVISION. PROGRAM-ID. ADDPROG. DATA DIVISION. WORKING-STORAGE SECTION. 01 VALUEA PIC X(20) VALUE '64.99|64.99'. 01 NOA-CHAR PIC X(5). 01 NOB-CHAR PIC X(5). 01 NOC PIC S9(9)V99 COMP-3. 01 NOD PIC S9(9)V99 COMP-3. PROCEDURE DIVISION. 000-MAIN. DISPLAY "EARLIER". DISPLAY 'NOC-' NOC. DISPLAY 'NOD-' NOD. DISPLAY "AFTER". UNSTRING VALUEA DELIMITED BY '|' INTO NOA-CHAR, NOB-CHAR. // 直接将字符串转换为COMP-3数值 COMPUTE NOC = FUNCTION NUMVAL-C(NOA-CHAR). COMPUTE NOD = FUNCTION NUMVAL-C(NOB-CHAR). DISPLAY 'NOA-CHAR-' NOA-CHAR. DISPLAY 'NOB-CHAR-' NOB-CHAR. DISPLAY 'NOC-' NOC. DISPLAY 'NOD-' NOD. STOP RUN.
方案3:用编辑型数值字段接收UNSTRING结果(格式需严格匹配)
如果必须用数值字段接收拆分结果,可使用编辑型数值字段(显式存储小数点),其格式需与输入字符串完全匹配:
IDENTIFICATION DIVISION. PROGRAM-ID. ADDPROG. DATA DIVISION. WORKING-STORAGE SECTION. 01 VALUEA PIC X(20) VALUE '64.99|64.99'. 01 NOA-EDIT PIC 9(2).9(2). // 显式存储小数点的编辑字段 01 NOB-EDIT PIC 9(2).9(2). 01 NOC PIC S9(9)V99 COMP-3. 01 NOD PIC S9(9)V99 COMP-3. PROCEDURE DIVISION. 000-MAIN. DISPLAY "EARLIER". DISPLAY 'NOC-' NOC. DISPLAY 'NOD-' NOD. DISPLAY "AFTER". UNSTRING VALUEA DELIMITED BY '|' INTO NOA-EDIT, NOB-EDIT. // 编辑型字段可直接MOVE到COMP-3 MOVE NOA-EDIT TO NOC. MOVE NOB-EDIT TO NOD. DISPLAY 'NOA-EDIT-' NOA-EDIT. DISPLAY 'NOB-EDIT-' NOB-EDIT. DISPLAY 'NOC-' NOC. DISPLAY 'NOD-' NOD. STOP RUN.
注意:此方案对输入格式要求严格,若输入长度或小数点位置变化,会引发新问题,灵活性不如前两种。
内容的提问来源于stack exchange,提问作者Rahul
相关产品推荐
相关产品推荐

