Cobol 使用occurs子句处理文件

Cobol 使用occurs子句处理文件,cobol,Cobol,我正在尝试使用COBOL程序读取一个顺序文件并将其写入另一个文件(具有不同的结构) 旧文件的结构包含一个包含表(数组)的字段 因此,我需要为这个表编写一个循环,而不是使用“将旧字段移动到新字段”。 我该怎么做?在您的输入记录中,您将有如下内容: PERFORM VARYING MY-SUBSCRIPT FROM +1 BY +1 UNTIL MY-SUBSCRIPT NOT LESS THAN NUMBER-IN-FILE-RECORD MOVE IN-FILE-FI

我正在尝试使用COBOL程序读取一个顺序文件并将其写入另一个文件(具有不同的结构)

旧文件的结构包含一个包含表(数组)的字段

因此,我需要为这个表编写一个循环,而不是使用“将旧字段移动到新字段”。
我该怎么做?

在您的输入记录中,您将有如下内容:

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.
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 ...
同样,所有这些都应该有一个前缀。但可能没有。你说结构是不同的,但你没有展示,所以选择“逻辑上”的等价物

要访问表,您需要使用
订阅
。订阅编码在
中。下标可以是文字值(1)、(2)等,也可以是索引(定义为
的数据定义中被
索引),或者使用数据名作为下标

01  the-subscript BINARY PIC 9(4).
二进制PIC 9(4)
可以包含最大值9999,如果您的表更大(不太可能,但并非不可能,对于文件上的表),则将其设置为
二进制PIC 9(8)

除了引用索引名而不是下标之外,使用索引将与上面相同

01  the-subscript BINARY PIC 9(4).
如果表中的条目数很小(相对术语),则可以使用文字:

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

为了进一步澄清问题,如果您有问题,请使用输入和输出记录、编译器名称和您正在使用的操作系统更新您的问题。

在您的输入记录中,您将有如下内容:

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 ...
同样,所有这些都应该有一个前缀。但可能没有。你说结构是不同的,但你没有展示,所以选择“逻辑上”的等价物

要访问表,您需要使用
订阅
。订阅编码在
中。下标可以是文字值(1)、(2)等,也可以是索引(定义为
的数据定义中被
索引),或者使用数据名作为下标

01  the-subscript BINARY PIC 9(4).
二进制PIC 9(4)
可以包含最大值9999,如果您的表更大(不太可能,但并非不可能,对于文件上的表),则将其设置为
二进制PIC 9(8)

除了引用索引名而不是下标之外,使用索引将与上面相同

01  the-subscript BINARY PIC 9(4).
如果表中的条目数很小(相对术语),则可以使用文字:

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

如果您有问题,请使用输入和输出记录、编译器名称和您正在使用的操作系统更新您的问题,以便进一步澄清。

您是否意识到我发布答案的意义?您是否注意到代码与您接受的答案不同?你是否意识到你所接受的答案忽略了每条记录上的最后一条记录?你是否意识到我发布答案有其意义?您是否注意到代码与您接受的答案不同?您是否已经意识到您接受的答案忽略了每条记录上的最后一个条目?有时人们对完整或经过深思熟虑的答案不感兴趣-他们只是想得到一个提示,让他们开始编写下一个bug。他们寻找的答案不一定是完整的,或者正如你所观察到的,甚至是正确的!有时人们对一个完整的或者经过深思熟虑的答案并不感兴趣——他们只是想得到一个提示,让他们开始编写下一个bug。他们寻找的答案不一定是完整的,或者正如你所观察到的,甚至是正确的!悲哀但正确。Neal写入必须在循环中——他希望输入记录的OCCURS部分中的每一组字段都有一个输出记录。好的,然后至少修复下标错误:
,直到MY-SUBSCRIPT不小于NUMBER-in-FILE-record
此条件将删除最后一个表项
直到进入循环体之前对
条件进行评估,您似乎在假定
之后进行测试。正确的条件是:
直到MY-SUBSCRIPT>NUMBER-IN-FILE-RECORD
Neal,写入必须在循环中——他希望输入记录的发生部分的每一组字段都有一个输出记录。OK,然后至少修复下标错误:
直到MY-SUBSCRIPT不小于NUMBER-IN-FILE-RECORD
此条件将删除最后一个表条目
直到进入循环体之前对
条件进行评估,您似乎在假定
之后进行测试。正确的条件是:
直到MY-SUBSCRIPT>NUMBER-IN-FILE-RECORD