我正在尝试使用COBOL程序读取顺序文件并将其写入其他文件(具有不同的结构)。
旧文件的结构包含一个包含表(数组)的字段。
因此,我不需要使用“move field-old to field-new”,而是需要为此表编写一个循环。 我该怎么做?
答案 0 :(得分:3)
在输入记录中,您将拥有以下内容:
01 a-nicely-named-record.
05 nicely-named-data PIC ...
...
05 and-a-final-nice-name PIC ...
05 field-containing-the-count-of-actual-entries ... PIC ...
05 the-COBOL-table.
10 table-entry OCCURS n TIMES.
15 table-entry-data-nice-name PIC ...
...
15 table-entry-a-final-nice-name PIC ...
这样的事情。如果您可以展示自己的布局,那就更好了。 ...
表示“把你实际拥有的东西放在这里,因为我们不知道细节”。输入记录应该有所有字段名称的前缀,但可能不是。
您的输出记录:
01 a-nicely-named-record.
05 nicely-named-data PIC ...
...
05 and-a-final-nice-name PIC ...
05 field-containing-the-count-of-actual-entries ... PIC ...
05 the-COBOL-table.
10 table-entry OCCURS n TIMES.
15 table-entry-data-nice-name PIC ...
...
15 table-entry-a-final-nice-name PIC ...
同样,所有这些都应该有一个前缀。但可能没有。你说结构是不同的,但你没有显示,所以去“逻辑”等价。
要访问表格,您需要使用subscripting
。订阅在(
和)
内编码。订阅可以使用文字值(1),(2)等,也可以使用索引(在INDEXED BY
的数据定义上定义为OCCURS
)或使用数据名作为下标
01 the-subscript BINARY PIC 9(4).
BINARY PIC 9(4)
可以包含最大值9999,如果您的表格较大(不太可能,但不是不可能,对于文件上的表格),请将其设为BINARY PIC 9(8)
。
PERFORM
VARYING the-subscript
FROM 1
BY 1
UNTIL ( the-subscript
GREATER THAN field-containing-the-count-of-actual-entries )
MOVE input-field.... ( the-subscript ) to output-filed... ( the-subscript )
...
MOVE input-field.... ( the-subscript ) to output-filed... ( the-subscript )
END-PERFORM
使用索引与上面的索引相同,除非引用索引名而不是下标。
如果表格中的条目数量很少(相对术语),您可以使用文字:
MOVE input-field.... ( 1 ) TO output-filed... ( 1 )
...
MOVE input-field.... ( 1 ) TO output-filed... ( 1 )
MOVE input-field.... ( n ) TO output-filed... ( n )
...
MOVE input-field.... ( n ) TO output-filed... ( n )
如果两个文件的表格格式相同,并且您确信输入表格中的数据与PICture子句完全一致,则可以使用一个MOVE语句完成。
MOVE input-table TO output-table
如果所有记录中都有固定数量的条目,您可以使用
initial value for subscript/index
PERFORM n TIMES
MOVEs (as above)
increment subscript/index
END-PERFORM
如果您有问题需要进一步说明,请使用输入和输出记录,编译器名称以及您正在使用的操作系统更新您的问题。
答案 1 :(得分:1)
PERFORM VARYING MY-SUBSCRIPT FROM +1 BY +1
UNTIL MY-SUBSCRIPT NOT LESS THAN NUMBER-IN-FILE-RECORD
MOVE IN-FILE-FIELD1(MY-SUBSCRIPT) TO OUT-FILE-FIELD1
.....
MOVE IN-FILE-FIELD99(MY-SUBSCRIPT) TO OUT-FILE-FIELD99
WRITE OUT-FILE-RECORD
END-PERFORM.