解决了

我发现这条线远远超出了我将这些值移动到输出文件的位置:

INSPECT OUT-RECORD REPLACING ALL X'00' BY ' '

将我的 X'00' 更改为 X'40',这就是我得到神秘的 '4' 的地方。我将这归因于我第一个缺少“;”的 Cobol 版本。

感谢 Bruce 和匿名用户 user9835153 的帮助!

我需要一些我从未遇到过的奇怪场景的帮助。

我有一个无符号分区十进制数字作为输入,PIC 9(3).9(6),我需要将它作为有符号 COMP-3 PIC S9(3)V9(6) 写出到数据集。这适用于所有值 ,除非输入 中的十进制周围有零。在这种情况下,小数点前的 0 始终更改为 4。

示例: 当输入值为 31.006261 时,它被写为 +31.006261(实际输出文件中的 x'031006261C')。但是,当输入值为 30.006261 时,它会以 +34.006261 (x'034006261C') 的形式写出到文件中。

我无法更改值的输入方式,但我可以更改输入布局。我尝试了多种移动这个值的方法,包括:从输入直接移动到 COMP-3,移动到工作存储中不同类型的临时字段,使输入成为字符字段并移动到数字(完全忽略小数) .

这是我正在做的事情的简化版本:
* Value 30.006261 is read into WS-IN-VAL from input file.

01 WS-IN-RECORD.
   05 WS-IN-VAL      PIC 9(3).9(6).

01 OUT-RECORD.
   05 WS-OUT-VAL     PIC S9(3)V9(6) COMP-3.

* Working Storage 01 area
   05 WS-HOLD-VAL       PIC 9(3)V9(6).
   05 WS-DISP-VAL       PIC +9(3).9(6).

MOVE WS-IN-VAL   TO WS-HOLD-VAL.
MOVE WS-HOLD-VAL TO WS-OUT-VAL.
MOVE WS-OUT-VAL  TO WS-DISP-VAL.

WRITE WS-OUT-RECORD.

DISPLAY 'VALUE IN:   ' WS-IN-VAL.
DISPLAY 'HOLD VALUE: ' WS-HOLD-VAL.
DISPLAY 'VALUE OUT:  ' WS-OUT-VAL.
DISPLAY 'FORMATTED:  ' WS-DISP-VAL.
VALUE IN:   30.006261
HOLD VALUE: 030006261
VALUE OUT:  030006261
FORMATTED:  +030.006261

但是,当我打开带有 HEX ON 的输出文件时,我得到的是:
----+
04021
3066C

View of the file with a layout shows: +34.006261.

每次在小数点周围出现零时都会发生这种情况。我使用了 8 条记录的数据子集,并将一半更改为 10.1xxxxx,另一半更改为 10.0xxxxx(x 是各种数字)。所有 10.0xxxxx 记录更改为 14.0xxxxx,但 10.1xxxxx 记录保持正确。使用 20.x、30.x、40.x 等执行此操作并得到相同的结果。

从未签名到签名时,我也尝试过 COMPUTE 而不是 MOVE - 结果相同。就像我之前提到的,我尝试了各种移动输入值的方法,但结果总是一样的。我想也许显式十进制(x'4B')的一部分以某种方式被放置在上半字节中,所以我修改了输入以单独读取它,并将它的十六进制值更改为x'00',但这不起作用任何一个。我完全不知道还有什么可以尝试的,也找不到其他经历过这种情况的人。

关于为什么小数点前的 0 被 4 替换的任何想法或建议?

在提供建议后于 2018 年 5 月 21 日编辑:
VALUE FROM FILE:              50.022287
VALUE AFTER MOVE:             050022287
VALUE AS COMP-3 (OUTPUT FLD): 050022287
OUTPUT DISPLAYED:             +050.022287

VALUE IN FILE: +54.022287

写入数据集后,小数点前的零仍然会发生变化。

最佳答案

这是在 IBM Enterprise COBOL for z/OS 4.2.0 下编译和运行的完整 COBOL 程序。它不会显示您所描述的行为:

   IDENTIFICATION DIVISION.
   PROGRAM-ID. COMP3.
   ENVIRONMENT DIVISION.
   INPUT-OUTPUT SECTION.
   FILE-CONTROL.
        SELECT OFILE  ASSIGN TO OFILE STATUS OFILE-STAT.
   DATA DIVISION.
   FILE SECTION.
    FD  OFILE
        LABEL RECORDS STANDARD
        RECORDING MODE F
        BLOCK CONTAINS 0 RECORDS.

    01  OFILE-REC.
        02 COMP3-NBR                PIC S9(3)V9(6) COMP-3.
        02                          PIC X(75).

   WORKING-STORAGE SECTION.
   01  WS-IN-VAL                    PIC 9(3).9(6).
   01  WS-OUT-VAL                   PIC S9(3)V9(6) COMP-3.
   01  WS-OUT-VAL-X REDEFINES WS-OUT-VAL
                                    PIC X(5).
   01  WS-HOLD-VAL                  PIC 9(3).9(6).
   01  WS-DISP-VAL                  PIC +9(3).9(6).
   01  OFILE-STAT                   PIC 9(2).
       88 OFILE-STAT-OK             VALUE ZERO.
   PROCEDURE DIVISION.
       MOVE 30.006216       TO WS-IN-VAL
       MOVE WS-IN-VAL       TO WS-HOLD-VAL
       MOVE WS-HOLD-VAL     TO WS-OUT-VAL
        02                          PIC X(75).

   WORKING-STORAGE SECTION.
   01  WS-IN-VAL                    PIC 9(3).9(6).
   01  WS-OUT-VAL                   PIC S9(3)V9(6) COMP-3.
   01  WS-OUT-VAL-X REDEFINES WS-OUT-VAL
                                    PIC X(5).
   01  WS-HOLD-VAL                  PIC 9(3).9(6).
   01  WS-DISP-VAL                  PIC +9(3).9(6).
   01  OFILE-STAT                   PIC 9(2).
       88 OFILE-STAT-OK             VALUE ZERO.
   PROCEDURE DIVISION.
       MOVE 30.006216       TO WS-IN-VAL
       MOVE WS-IN-VAL       TO WS-HOLD-VAL
       MOVE WS-HOLD-VAL     TO WS-OUT-VAL
       MOVE WS-OUT-VAL      TO WS-DISP-VAL
       DISPLAY 'VALUE IN: ' WS-IN-VAL
       DISPLAY 'HOLD VAL: ' WS-HOLD-VAL
       DISPLAY 'OUT VAL : ' WS-OUT-VAL
       DISPLAY 'OUT VALX: ' WS-OUT-VAL-X
       OPEN OUTPUT OFILE
       IF NOT OFILE-STAT-OK THEN
          DISPLAY "OFILE OPEN STATUS: " OFILE-STAT
          STOP RUN
       END-IF
       INITIALIZE OFILE-REC
       MOVE WS-OUT-VAL  TO COMP3-NBR
       WRITE OFILE-REC
       IF NOT OFILE-STAT-OK THEN
          DISPLAY "OFILE WRITE STATUS: " OFILE-STAT
          STOP RUN
       END-IF
       GOBACK
       .

系统输出:

******************************** Top of Data ***********************************
VALUE IN: 030.006216
HOLD VAL: 030.006216
OUT VAL : 030006216
OUT VALX: : ::%
 ******************************* Bottom of Data ********************************

和以十六进制显示的 OFILE 内容:

****** ***************************** Top of Data ******************************
000001     %
       000260000000000000000000000000000000000000000000000000000000000000000000
       3061C0000000000000000000000000000000000000000000000000000000000000000000
------------------------------------------------------------------------------
****** **************************** Bottom of Data ****************************

这一切对我来说都很好!我认为您的代码中一定存在其他问题。

关于hex - 写入数据集后 Cobol COMP-3 值发生变化,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50417915/

10-12 06:28