从文件读取后我无法添加两个十进制数,在文件内部,数字被定义为1234.10等等,我在程序中循环添加这些数字,但在使用第三个时获取SOC7变量来添加文件中的细节,我已将所有数值变量定义为9(4)v99并尝试使用s9(4)v99 comp-3,但仍未添加。
只有当文件中的小数被定义为123410而不是文件中的1234.10时,程序才有效。
这是我编码的方式,
READ-PARA1.
READ FILEX
AT END
MOVE 'Y' TO WS-EOF-IND.
READ FILEY
AT END
MOVE 'Y' TO WS-EOF-IND.
DISPLAY SPACE
DISPLAY OCODE1,' 'ACODE1,' 'POLNO1,' 'EDATE1,
' 'PHOLD1,' 'LOCATION1,' ',LICNO1,' 'VMAKE1,
' 'VMODEL,' 'YEAR,' 'PREM' '.
ADD 1 TO R1.
MOVE PREM TO PRESUM1.
ADD PRESUM1 TO PRESUM.
在工作存储部分,包括上面的文件描述符,
05 PREM PIC S9(4)V99 COMP-3.
05 FILLER PIC X(34).
WORKING-STORAGE SECTION.
77 R1 PIC 9(2) VALUE 0.
77 PRESUM PIC S9(4)V99 COMP-3 VALUE 0.
77 PRESUM1 PIC S9(4)V99 COMP-3 VALUE 0.
77 PRESUM2 PIC S9(4)V99 COMP-3 VALUE 0.
答案 0 :(得分:1)
图9(4)中的V V99是假定的小数;没有小数点。它只接受123410这样的数字。它不接受1234.10
对于1234.10,您需要将其定义为
03 f1 pic 9(4)
03 filler pic x.
03 f2 pic v99.
并在程序中
compute PRESUM = f1 + f2.
答案 1 :(得分:1)
布鲁斯·马丁给出的答案可行,但您也可以尝试将“数字”定义为PIC X
输入文件,然后使用NUMVAL
将其转换为数字值。类似的东西:
01 FILEX-REC.
02 ....
02 PREM PIC X(7).
02 ...
01.
02 PRESUM1 PIC S9(4)V99 PACKED-DECIMAL.
COMPUTE PRESUM1 = FUNCTION NUMVAL(PREM) END-COMPUTE
NUMVAL
函数接受一个字符串(PIC X)并将其转换为数字数据项。这会将PREM
中数字的字符表示转换为PRESUM1
中的压缩十进制(COMP-3)。
顺便说一句......每个新的COBOL程序员遇到这个小问题,通常需要一段时间来解决它。
答案 2 :(得分:0)
1234.56之类的数字应定义为: -
05 PREM PIC 9999.99.
您需要告诉编译器期望嵌入实际小数点的字符格式的数字。
答案 3 :(得分:0)
S0C7是数据异常错误。如果打包字段中的数据不是打包格式,或者分区字段中的数据不是分区格式,则会发生此错误。值得庆幸的是,S0C7s并不是非常有害(比如S0C1s和S0C4s,它们在COBOL中很少见,感谢上帝)所以要把它们赶出去并不太难。
我假设您正在从文件中读取PRESUM和PRESUM1的值?文件中包含什么内容?
有趣的是,在尝试使用无效数据之前,COMP-3或分区字段通常不会抱怨无效数据,例如添加或将其添加到其他内容。
在不知道构成COMP-3压缩字段的字节(不是值,而是BYTES)的情况下,无法诊断此S0C7。
如果您或其他任何人需要有关分区或打包数据的更多信息,我可以提供吨...我在COBOL编程的时间远远超过我承认的范围。