从文件中读取后,无法在循环中添加小数

时间:2012-07-19 09:12:30

标签: cobol

从文件读取后我无法添加两个十进制数,在文件内部,数字被定义为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.        

4 个答案:

答案 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编程的时间远远超过我承认的范围。