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

COBOL:GDG文件描述符(FD)可以引用多个代吗?,cobol,Cobol,我有一个程序,可以读取GDG文件并将数据移动到工作存储器。我很想知道是否可以通过引用文件定义,对多代GDG重复这个过程。也许有一种方法可以在文件定义上使用下标?我的想法是,必须有一种方法将不同的文件定义移动到一个引用变量中,从中访问文件。在大型机COBOL中,FD指的是一个SELECT,它指的是一个DD语句,附加到调用JCL中的程序的EXEC PGM语句。DD语句可能涉及一个或多个GDG。这是在编译时确定的 我认为您要求的是在运行时动态分配文件。有两种方法可以实现这一点,一种是BPXWDYN

我有一个程序,可以读取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.           
这只是徒手画,所以可能有语法错误,但我希望我已经把想法说清楚了

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

基于建议的代码示例,setenv解决方案 笔记
  • 将DSN值移动到ENV-value时,请特别注意。在我第一次挥杆时,我省略了最后的括号,很可能是因为JCL肌肉记忆
  • 确保在JCL/Step中清空DD语句
    最初的研究让我接触到这个,呃,我能称之为效用吗?(BPXWDYN)当我试图编译此解决方案时,收到一个链接错误
    IEW2456E 9207 SYMBOL BPXWDYN未解决。无法从指定的呼叫库中包括成员
    我想在给我的系统人员打电话之前,我会研究一下您建议的另一个选项,发现
    setenv
    方法非常有效。我不确定是否允许这样做(如果我错了,请纠正我),但我会将此标记为正确,以便让我找到解决方案,并将对我有效的代码示例添加为另一个答案。@TechSparrow如果愿意,您可以接受您自己的答案而不是我的答案,这在堆栈溢出时是完全可以接受的。关于链接错误,如果动态调用BPXWDYN,则应消除IEW2456E消息。
    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.