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

时间:2018-05-02 15:46:09

标签: cobol

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

2 个答案:

答案 0 :(得分:3)

基于建议的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语句。

答案 1 :(得分:2)

在大型机COBOL中,FD引用SELECT,它引用在调用JCL中附加到程序的DD语句的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 here记录的C RTL函数setenv。看起来它可能更简单,但我从未这样做过。