如何在Cobol中从副本创建表?
本字帖中有几个组,只需要其中一个组在表格中。
我是否需要多次使用副本替换变量的开头,以便编译器将它们视为不同的东西?
只要使用它的其他程序将编译,我就可以编辑该副本。
它位于IBM大型机上。
请参阅下面的答案,了解我的最终解决方案。感谢@Bruce Martin
答案 0 :(得分:2)
你说你不能改变字帖。好吧,可以改变字帖,使其不会影响任何其他内容。
这是Enterprise COBOL语言参考中的一个示例:
Example 3
If the following conventions are followed in library text, then parts of names (for
example the prefix portion of data names) can be changed with the REPLACING
phrase.
In this example, the library text PAYLIB consists of the following data division
entries:
01 :TAG:.
02 :TAG:-WEEK PIC S99.
02 :TAG:-GROSS-PAY PIC S9(5)V99.
02 :TAG:-HOURS PIC S999 OCCURS 1 TO 52 TIMES
DEPENDING ON :TAG:-WEEK OF :TAG:.
The programmer can use the COPY statement in the data division of a program as
follows:
COPY PAYLIB REPLACING ==:TAG:== BY ==Payroll==.
Usage Note: It is important to notice in this example the required use of colons or
parentheses as delimiters in the library text. Colons are recommended for clarity
because parentheses can be used for a subscript, for instance in referencing a table
element.
In this program, the library text is copied; the resulting text is treated as if it had
been written as follows:
01 PAYROLL.
02 PAYROLL-WEEK PIC S99.
02 PAYROLL-GROSS-PAY PIC S9(5)V99.
02 PAYROLL-HOURS PIC S999 OCCURS 1 TO 52 TIMES
DEPENDING ON PAYROLL-WEEK OF PAYROLL.
The changes shown are made only for this program. The text, as it appears in the
library, remains unchanged.
因此,对于现有副本中的01,您可以使用COPY ... REPLACING ...替换01之后的数据定义以给出相同的前缀(假设数据名称具有前缀....)然后根据需要创建具有调整后的级别数的新副本(例如,show level-numbers 02,这总是很愚蠢,但这可能不是世界上唯一的例子)。不同的级别数字不会影响任何现有代码(因为编译器会正常化所有级别数,因此编译器将始终将01后面的最低级别编号视为02,将第二个最低级别编号视为03,等)。
然后您可以在表格中使用新的字帖。
请注意,您必须使用下标来引用表格中的任何字段。
如果你真的无法改变字帖(一些奇怪的diktat,有时会发生)那么最好的选择可能就是制作一个相同的新字帖,但有不同的前缀,没有01级,以获得灵活性
我们现在需要存储记录的目的。
看来你有这样的事情:
copy reclyout.
01 record-layout-1.
...
01 record-layout-2.
...
01 record-layout-3.
...
然后,您希望仅将记录布局2记录存储在表格中。
正如Bruce Martin所问,了解您正在使用哪种编译器和操作系统会很有用。部分(而非全部)COBOL编译器支持嵌套的复制语句。您可以使用copy
语句替换原始副本中记录的布局,以包含布局的新副本。
你有一个小问题,你需要01本身在外面的副本,你需要在级别数字中留出足够的空白来容纳你的表定义包括新的副本。
01 The-Table.
05 some-name OCCURS 100 TIMES.
copy newlyout.
副本中的最高级别数据定义必须以大于05的级别数开始。这不是一个很难实现的问题。无论如何,COBOL编译器将“标准化”级别数字,并且通过这样做使得不那么灵活的机会几乎为零。如果您的编译器支持嵌套的复制语句,那么这是您的最佳解决方案。
是的,使用COPY和REPLACING非常有用。必须使用数据名称(或标签)的限定条件总是很难看。
如果没有,请考虑做同样的事情,但从现有的副本中删除该特定的布局,并在原始的副本声明之后简单地包含新的副本。您是否能够这样做将取决于其他地方使用的字帖数量。把它交给你的分析师/老板。
如果无法做到这一点,请为表格制作新的副本,并使用可用的注释和其他文档来建立两个数据定义之间的关系。不理想,但这是一种常见的方式。
另一种可能性是简单地定义表格中的区域,并通过MOVE
使用记录布局来记录布局。这是另一种常见的方法,它需要文档和检查表/记录布局中的长度,并且是一种笨拙/低效的方法。再一次,你可能会遇到这种方式。
如果您在编译器/操作系统上咳嗽,还有其他一些方法。
答案 1 :(得分:1)
IBM的大型机支持嵌套副本,因此您可以将副本更改为 嵌套字帖
另外看看
所以
01 record-layout-1.
...
01 record-layout-2.
...
01 record-layout-3.
...
可以更改为
01 record-layout-1.
...
01 record-layout-2.
...
01 record-layout-3.
copy newCopy.
...
在您的程序中,您可以使用 newCopy 或者您所谓的。您可能希望在使用时重新编写副本级别。
因此,如果原始副本是
01 record-layout-3.
05 field-1 pic x(4).
05 field-2 ...
您将创建新的副本
25 field-1 pic x(4).
25 field-2 ...
实际级别数字并不重要,只需要> 01为本抄写本。使用25可以很容易地嵌入到您的工作存储中。
一些公司将其作为标准副本,不得包含01级,以便副本也可以嵌入到工作存储中。这很少见
答案 2 :(得分:1)
我的最终解决方案。
我实际上结束了不必从副本创建一个表,但仍然需要01组变量作为他们自己的副本,以创建具有相同结构的多个变量实例,只是具有不同的01组名和变量名。
我最终为01组变量创建了单独的字帖书籍,然后使用Replace块使嵌套的副本看起来像原始的。请参阅下面的最终结果。
REPLACE ==(TAGEIGHT)== BY ==N==.
01 STD-NACHA-FILE-HEADER.
COPY ABRYNAFH.
01 STD-NACHA-BATCH-HEADER.
COPY ABRYNABH.
01 STD-NACHA-DETAIL-TRANS.
COPY ABRYNADT.
01 STD-NACHA-DETAIL-ADDENDA-REC.
COPY ABRYNADA.
01 STD-NACHA-BATCH-TOTAL-REC.
COPY ABRYNABT.
01 STD-NACHA-FILE-TOTAL-REC.
COPY ABRYNAFT.
01 STD-NACHA-FILE-PAD-REC.
COPY ABRYNAFP.
01 STD-NACHA-RETURN-REC.
COPY ABRYNARR.
REPLACE OFF.