0

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

4 回答 4

1

图 9(4)V99 中的 V 是假定的小数;没有小数点。它只接受像 123410 这样的数字。它不会接受 1234.10

对于 1234.10,您需要将其定义为

   03 f1      pic 9(4)
   03 filler  pic x.
   03 f2      pic v99.

并且在程序中

   compute PRESUM = f1 + f2.
于 2012-07-19T15:07:24.923 回答
1

Bruce Martin 给出的答案将起作用,但您也可以尝试将“数字”定义为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为压缩十进制(COMP-3)PRESUM1

顺便说一句……每个新的 COBOL 程序员都会遇到这个小问题,通常需要一段时间才能解决。

于 2012-07-19T16:56:12.290 回答
0

像 1234.56 这样的数字应该定义为:-

     05  PREM                   PIC 9999.99.

您需要告诉编译器期望一个嵌入了实际小数点的字符格式的数字。

于 2012-07-20T03:16:01.177 回答
0

S0C7 是数据异常错误。如果打包字段中的数据不是打包格式,或者分区字段中的数据不是分区格式,则会出现此错误。值得庆幸的是,S0C7 不是很有害(就像在 COBOL 中很少见的 S0C1 和 S0C4,感谢上帝),因此将它们排除在外并不难。

我假设您正在从文件中读取 PRESUM 和 PRESUM1 的值?文件中有什么?

有趣的是,COMP-3 或分区字段通常不会抱怨无效数据,直到您尝试使用它,例如添加到它或将它添加到其他东西。

在不知道构成 COMP-3 压缩字段的字节(不是值,而是 BYTES)的情况下,无法诊断此 S0C7。

如果您或其他任何人需要有关分区或打包数据的更多信息,我可以提供大量信息……我在 COBOL 中编程的时间比我愿意承认的要长得多。

于 2012-07-20T11:15:04.930 回答