首先,我看到您在最后一个问题之后已经使用 OCCURS 获得了合同表。我认为这是错误的做法。这个更好。
01 FILE-TABLE.
05 FILE-TABLE-ROW
OCCURS 10 TIMES
INDEXED BY I.
10 FILE-TABLE-COL
OCCURS 10 TIMES
INDEXED BY J.
15 FILE-TABLE-COL PIC X(1).
只是我之前没有提到的一点,因为您可能正在命名以帮助您作为初学者,如果您不打算使用字段,则不需要命名字段。
01 FILE-TABLE.
05 FILE-TABLE-ROW
OCCURS 10 TIMES
INDEXED BY I.
10 FILLER
OCCURS 10 TIMES
INDEXED BY J.
15 FILE-TABLE-COL PIC X(1).
请注意,自 1985 年标准以来,FILLER 一词可以用隐形墨水书写:
05 FILLER PIC X(20).
05 PIC X(20).
名称中的空格是隐含的 FILLER。另请注意,它05
可以写为5
,每个以零开头的级别数也可以写为 。
正如那句老话所说,读文件,写记录。在这种情况下,“记录”是 DF 下的 01 级。您正在尝试编写一些作为记录的从属部分的内容,但这是行不通的。似乎混淆了编译器。
我没有看到 FD,但假设它在那里。将您的表放入 WORKING-STORAGE(或 LOCAL-STORAGE)。在您的 FD 下定义一个 10 字节的记录,将 FILE-TABLE-ROW 移动到该新定义的记录,或使用 WRITE FROM FILE-TABLE-ROW。
您不能在 FILE SECTION 中写入记录的一部分(01 级)。您可以使用 MOVE 或 WRITE ... FROM... 来访问非 01 级别的数据,并将该数据放入您的 01 级别以允许写入。
WORKING-STORAGE SECTION,
01 some-thing PIC X.
然后
MOVE some-thing TO output-record
WRITE output-record
或者
WRITE output-record FROM some-thing
有两种不同的方式来写WRITE
你感兴趣的内容:
WRITE record-name
WRITE record-name FROM somewhere-else
首先,您在 FD 下完全定义输出,将值放入您需要的字段中,然后写入记录。
对于第二个,您只需要在 FD 下进行最小定义(足以定义记录的长度,它可以是可变的,您可能稍后会谈到)并且您将值放在您需要的所有字段中,从属于如有必要,另一个组项目。FD下的定义可以是完整的,只是不必如此。
该数据可以来自数据部门中的任何地方。它甚至可能来自 FILE SECTION 中的其他地方(您将看到从输入记录写入输出记录)。
FROM
on WRITE 和 on READ 一样,INTO
是一个隐含的MOVE
. MOVE formatted-data TO output-record 和 WRITE output-record,就是这么WRITE ... FROM ...
说的。