从抄写本在 Cobol 中创建 table?

Create a table in Cobol from a copybook?

如何使用 Cobol 从字帖创建 table?

字帖有好几组,只需要其中一组在一个table。

我是否需要多次使用 copybook 来替换变量的开头,以便编译器将它们视为不同的东西?

我可以编辑字帖,只要使用它的其他程序可以编译。

它在 IBM 大型机上。

请参阅下面的答案以了解我的最终解决方案。感谢@Bruce Martin

你说你改不了字帖。嗯,字帖可以改成不影响其他的。

这是企业 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,您可以将 01 之后的数据定义替换为 COPY ... REPLACING ... 以提供相同的前缀(假设数据名称具有前缀... .) 然后根据需要创建具有调整后的级别编号的新副本(例如,示例显示级别编号 02,这总是很愚蠢,但这可能不是世界上唯一的示例)。不同的级别编号不会影响任何现有代码(因为编译器无论如何都会规范化所有级别编号,因此编译器将始终将 01 之后的 lowest 级别编号视为 02,第二低如 03 等)。

然后你就可以在你的table中使用你的新字帖了。

请注意,您必须使用下标来引用 table 中的任何字段。

如果你真的不能更改字帖(有些奇怪的命令,有时会发生)那么最好的办法可能是制作一个新的字帖,它是相同的,但前缀不同,并且没有 01 级,为了灵活性。

我们现在需要存储记录的目的。


看来你有这样的东西:

copy reclyout.

01  record-layout-1.
...
01  record-layout-2.
... 
01  record-layout-3.
... 

因此,您只想将 record-layout-2 记录存储在 table.

正如 Bruce Martin 所问,了解您正在使用的编译器和 OS 会很有用。部分(并非全部)COBOL 编译器支持嵌套复制语句。您可以用 copy 语句替换原始抄写本中记录的布局,以创建包含该布局的新抄写本。

你会遇到一个小问题,你需要 01 本身 字帖之外,并且你需要在关卡中留出足够的空隙-允许您的 table 定义包含新字帖的数字。

01  The-Table.
    05  some-name OCCURS 100 TIMES.
copy newlyout.

copybook 中的最高级别数据定义必须以大于 05 的级别数字开头。实现这不是什么大问题。无论如何,COBOL 编译器都会 "normalise" 级别编号,并且通过这样做使某些东西变得不那么灵活的机会几乎为零。如果您的编译器支持嵌套复制语句,这是您的最佳解决方案。

是的,将 COPY 与 REPLACING 一起使用会非常有用。必须使用数据名称(或标签)的限定总是很丑陋。

如果不是,请考虑做同样的事情,但从现有的抄写本中删除该特定布局,并在原始抄写语句之后简单地包含新的抄写本。你是否能够做到这一点将取决于字帖在其他地方的使用情况。把它带到你的 analyst/boss.

如果这不可能,请为 table 制作一个新的副本,并使用您可用的评论和其他文档来建立两个数据定义之间的关系。不理想,但这是一种常见的完成方式。

另一种可能性是简单地定义 table 内的区域,并使用记录布局,通过 MOVE 到记录布局。这是另一种常见的方式,它确实需要文档并检查 table/record-layout 中的长度,并且是一种 ungainly/inefficient 的方式。同样,您可能会遇到这种情况。

如果你对着compiler/OS咳嗽,还有一些其他方法。

IBM 的大型机 支持嵌套 字帖,因此您可以将字帖更改为 嵌套字帖

也看看

  • "COPY" statement with "REPLACING" in COBOL

所以

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级别,以便字帖也可以嵌入工作存储中。这虽然很少见

我的最终解决方案。

我实际上结束了不必从副本创建 table 但仍然需要 01 组变量作为它们自己的副本来创建多个具有相同结构的变量实例,只是具有不同的 01 组名称和变量名字。

我最终为 01 组变量创建了单独的字帖,然后使用替换块使嵌套的字帖看起来像原始字帖。最终结果见下文。

 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.            

I went here for how to use Replace within a copybook.