КОБОЛ: Может ли дескриптор файла GDG (FD) ссылаться на несколько поколений? - PullRequest
0 голосов
/ 02 мая 2018

У меня есть программа, которая читает файл GDG и перемещает данные в рабочее хранилище. Мне интересно узнать, можно ли повторить этот процесс для нескольких поколений GDG, используя ссылку на определение файла. Возможно, есть способ использовать подписки на определение файла? Я думаю, что должен быть метод для перемещения различных определений файлов в ссылочную переменную, из которой они получают доступ к файлам.

Ответы [ 2 ]

0 голосов
/ 02 мая 2018

Пример кода на основе предложенного 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. Обязательно очистите свой оператор DD в JCL / Step.
0 голосов
/ 02 мая 2018

В COBOL мэйнфрейма FD относится к SELECT, который относится к оператору DD, присоединенному к оператору EXEC PGM для вашей программы в вызывающем JCL. Оператор DD может относиться к одному или нескольким GDG. Это определяется во время компиляции.

Я думаю, что вы запрашиваете динамическое размещение файла в runtime . Есть несколько способов сделать это, один из них - 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 здесь . Похоже, что это может быть проще, но я никогда не делал это таким образом.

...