COBOL:GDG 文件描述符 (FD) 可以引用多代吗?

COBOL: Can a GDG file descriptor (FD) reference multiple generations?

我有一个程序可以读取 GDG 文件并将数据移动到工作存储。我很想知道是否可以使用对文件定义的引用为多代 GDG 重复此过程。也许有办法在文件定义上使用下标?我的想法是必须有一种方法可以将不同的文件定义移动到一个引用变量中,从中可以访问这些文件。

在大型机 COBOL 中,FD 指的是 SELECT,它指的是 DD 语句附加到调用 JCL 中程序的 EXEC PGM 语句。 DD 语句可以引用一个或多个 GDG。这是在编译时确定的。

我认为您要求的是在运行时动态分配文件。有几种方法可以实现,一种是 BPXWDYN。

   Identification Division.
   Program-ID.    SOMETEST.
   Environment Division.
   Input-Output Section.
   File-Control.
       Select MY-FILE             Assign SYSUT1A.
   Data Division.
   File Section.
   FD  MY-FILE
       Record 80
       Block 0
       Recording F.
   01  MY-FILE-REC        PIC X(080).
   Working-Storage Section.
   01  CONSTANTS.
       05  BPXWDYN-PGM             PIC X(008) VALUE 'BPXWDYN '.
       05  ALCT-LIT-PROC           PIC X(035)
               VALUE 'ALLOC FI(SYSUT1A) SHR MSG(WTP) DSN('.
       05  FREE-LIT-PROC           PIC X(016)
               VALUE 'FREE FI(SYSUT1A)'.
       05  A-QUOTE                 PIC X(001) VALUE "'".

   01  WORK-AREAS.
       05  WS-DSN                  PIC X(044) VALUE 'MY.GDG.BASE'.
       05  WS-GDG-NB               PIC 999    VALUE ZEROS.
       05  BPXWDYN-PARM.
           10                      PIC S9(004) COMP-5 VALUE +100.
           10  BPXWDYN-PARM-TXT    PIC X(100).


   Procedure Division.
  *    Construct the allocation string for BPXWDYN.
       MOVE SPACES TO BPXWDYN-PARM-TXT
       STRING
           ALCT-LIT-PROC
             DELIMITED SIZE
           WS-DSN
             DELIMITED SPACE
           '(-'
             DELIMITED SIZE
           WS-GDG-NB
             DELIMITED SIZE
           ')'
             DELIMITED SIZE
         INTO
           BPXWDYN-PARM-TXT
       END-STRING

       CALL BPXWDYN-PGM USING
           BPXWDYN-PARM
       END-CALL

       IF RETURN-CODE = 0
           CONTINUE
       ELSE
           [error handling]
       END-IF

       [file I/O with MY-FILE]

       MOVE SPACES TO BPXWDYN-PARM-TXT
       MOVE FREE-LIT-PROC TO BPXWDYN-PARM-TXT

       CALL BPXWDYN-PGM USING
           BPXWDYN-PARM
       END-CALL

       IF RETURN-CODE = 0
           CONTINUE
       ELSE
           [error handling]
       END-IF

       GOBACK.           

这只是写意,所以可能有语法错误,但我希望我已经表达清楚了。

还有另一种技术,使用 C RTL 函数 setenv,由 IBM here 记录。看起来它可能更简单,但我从来没有这样做过。

基于建议的代码示例,setenv 解决方案

FILE-CONTROL.
SELECT DATAIN        ASSIGN TO UT-S-DATAIN.

DATA DIVISION.
FILE-SECTION.
FD  DATAIN                         
BLOCK CONTAINS 0 RECORDS       
RECORD CONTAINS 133 CHARACTERS 
LABEL RECORDS ARE STANDARD     
DATA RECORD IS DATA-REC.       
01  DATA-REC   PIC X(133).         

WORKING-STORAGE SECTION.   
01  ENV-VARS.                                             
02  ENV-NAME        PIC  X(9).                        
02  ENV-VALUE       PIC  X(100).                      
02  ENV-OVERWRITE   PIC  S9(8) COMPUTATIONAL VALUE 1.

PROCEDURE DIVISION.
MOVE Z"DATAIN" TO ENV-NAME                                   
MOVE Z"DSN(PROGRAMMER.TEST.GDGFILE(-1)),SHR" TO ENV-VALUE 
MOVE 1 TO ENV-OVERWRITE                                      
CALL "setenv" USING ENV-NAME ENV-VALUE ENV-OVERWRITE.

备注

  1. 将 DSN 值移动到 ENV-VALUE 时要特别注意。在我第一次挥杆时,我遗漏了右括号,很可能是因为 JCL 肌肉记忆。
  2. 请务必清空您在 JCL/Step 中的 DD 语句。