2015-12-18 59 views
2

如何使用COBOL获取PDS的成员列表(使用批处理作业中指定的DD名称)? 可以动态处理使用DDNAME指定的PDS。因此,使用TCB可以获得给定DDNAME的PDS列表并处理指定的成员名称。与DDNAME相关的PDS成员列表

但是如何使用COBOL获取PDS的成员列表?我知道这可以使用REXX轻松实现。但我需要COBOL或直接从COBOL调用。

+0

您想获得在JCL中的DD语句中指定的PDS中所有成员的列表吗?或者是其他东西? –

+0

这可能是为什么? –

+0

是的。实现一个现有工具的包装器,以便为数据集的所有成员(而不是pds的单个成员)执行它。它只是另外提供“-dir”之类的选项。 – cobp

回答

5

如果你用一个简单的SELECT(当然包括FILE STATUS)来指定它,你将能够读取一个PDS目录。

FD INPUT-FILE 
     RECORDING MODE IS U 
     LABEL RECORDS ARE STANDARD. 
    01 INPUT-RECORD. 
     05 FILLER PIC X(256). 

在JCL指定DDNAME这样的:

//ffffffff DD DISP=OLD,DSN=yourpdsname, 
//   RECFM=U,LRECL=256 

您也可以更改COBOL程序拍摄模式,以F和在JCL的RECFM到F。要么工作(U(ndefined)或F(ixed))。

然后,您只需将该目录视为普通文件。

但是,每个目录块有多个条目,您需要了解那些能够使用这些数据的条目。

这是一个程序,最初是从1982年开始的。在某些时候,我改变了原来的GO TO循环作为内联的PERFORM,并对IBM的VS COBOL II下的新功能进行了其他更改,标准。

EXPANDED-DIRECTORY是我为你粘贴的一本习字簿。

您可以使用上面定义的输入记录和EXPANDED-DIRECTORY来调用程序。

然后,在每次CALL之后,您都可以访问当前块中的成员(如果有的话)。

ID DIVISION. 
    PROGRAM-ID. OCDIRBLK. 
    DATA DIVISION. 
    WORKING-STORAGE SECTION. 
    01 LENGTH-UP-DIRECTORY   BINARY PIC 9(4). 
    01 LENGTH-OF-USER-DATA   BINARY PIC 9(4). 
    01 DIRECTORY-DATA-LENGTH  BINARY PIC 9(4). 
    01 HIGH-ORDER-BIT-VALUE   BINARY PIC 9(4) VALUE 128. 
    01 BIT-ONE-VALUE    BINARY PIC 9(4) VALUE 64. 
    01 BIT-TWO-VALUE    BINARY PIC 9(4) VALUE 32. 
    01 USER-DATA-LENGTH    BINARY PIC 9(4). 
     88 NO-USER-HALFWORDS    VALUE ZERO. 
     88 SOME-USER-HALFWORDS    VALUE 1 THRU 31. 
     88 MEMBER-HAS-ONE-POINTER   VALUE 32 THRU 63. 
     88 MEMBER-HAS-TWO-POINTERS   VALUE 64 THRU 127. 
     88 MEMBER-IS-AN-ALIAS    VALUE 128 THRU 255. 
    01 FILLER REDEFINES USER-DATA-LENGTH. 
     05 FILLER       PIC X. 
     05 USER-DATA-BYTE     PIC X. 
    LINKAGE SECTION. 
    01 INPUT-DIRECTORY. 
     05 I-D-LENGTH    BINARY PIC 9(4). 
      88 I-D-NO-MEMBERS    VALUE ZERO. 
     05 FILLER OCCURS 0 TO 252 TIMES 
      DEPENDING ON LENGTH-UP-DIRECTORY 
              PIC X. 
     05 I-D-MEMBER-NAME     PIC X(8). 
      88 I-D-END-OF-BLOCK    VALUE HIGH-VALUES. 
     05 I-D-TRACK-ADDRESS    PIC XXX. 
     05 I-D-INDICATOR     PIC X. 
     05 I-D-USER-DATA. 
      10 FILLER 
       OCCURS 0 TO 62 TIMES 
       DEPENDING ON 
       LENGTH-OF-USER-DATA. 
       15 FILLER     PIC X. 
    01 EXPANDED-DIRECTORY. 
     05 E-D-NUMBER-OF-ENTRIES BINARY PIC 9(4). 
     05 FILLER OCCURS 22 TIMES. 
      10 E-D-MEMBER-NAME    PIC X(8). 
      10 E-D-TRACK-ADDRESS   PIC X(3). 
      10 E-D-INDICATOR    PIC X(1). 
      10 E-D-ALIAS-FLAG    PIC X. 
       88 E-D-ALIAS    VALUE "Y". 
       88 E-D-ALIAS-NOT   VALUE "N". 
      10 E-D-NO-OF-POINTERS   PIC 9. 
      10 E-D-USER-DATA    PIC X(62). 
    PROCEDURE DIVISION    USING 
              INPUT-DIRECTORY 
              EXPANDED-DIRECTORY 
              . 

     IF I-D-NO-MEMBERS 
      MOVE ZERO    TO DIRECTORY-DATA-LENGTH 
     ELSE 
      SUBTRACT +2    FROM I-D-LENGTH 
      GIVING     DIRECTORY-DATA-LENGTH 
     END-IF 

     MOVE ZERO     TO E-D-NUMBER-OF-ENTRIES 
             LENGTH-UP-DIRECTORY 
     PERFORM UNTIL (LENGTH-UP-DIRECTORY 
      NOT LESS THAN DIRECTORY-DATA-LENGTH) 
       OR (I-D-END-OF-BLOCK) 
      ADD 1     TO E-D-NUMBER-OF-ENTRIES 
      MOVE I-D-MEMBER-NAME  TO E-D-MEMBER-NAME 
             (E-D-NUMBER-OF-ENTRIES) 
      MOVE I-D-TRACK-ADDRESS TO E-D-TRACK-ADDRESS 
             (E-D-NUMBER-OF-ENTRIES) 
      MOVE I-D-INDICATOR  TO E-D-INDICATOR 
             (E-D-NUMBER-OF-ENTRIES) 
              USER-DATA-BYTE 
      MOVE ZERO    TO E-D-NO-OF-POINTERS 
             (E-D-NUMBER-OF-ENTRIES) 
      IF MEMBER-IS-AN-ALIAS 
       SET E-D-ALIAS (E-D-NUMBER-OF-ENTRIES) 
            TO TRUE 
       SUBTRACT HIGH-ORDER-BIT-VALUE 
            FROM USER-DATA-LENGTH 
      ELSE 
       SET E-D-ALIAS-NOT (E-D-NUMBER-OF-ENTRIES) 
            TO TRUE 
      END-IF 
      IF MEMBER-HAS-TWO-POINTERS 
       MOVE 2    TO E-D-NO-OF-POINTERS 
             (E-D-NUMBER-OF-ENTRIES) 
       SUBTRACT BIT-ONE-VALUE 
            FROM USER-DATA-LENGTH 
      END-IF 
      IF MEMBER-HAS-ONE-POINTER 
       ADD 1    TO E-D-NO-OF-POINTERS 
             (E-D-NUMBER-OF-ENTRIES) 
       SUBTRACT BIT-TWO-VALUE 
            FROM USER-DATA-LENGTH 
      END-IF 
      IF SOME-USER-HALFWORDS 
       MULTIPLY USER-DATA-LENGTH BY 2 
       GIVING    LENGTH-OF-USER-DATA 
       MOVE I-D-USER-DATA TO E-D-USER-DATA 
             (E-D-NUMBER-OF-ENTRIES) 
       ADD LENGTH-OF-USER-DATA TO LENGTH-UP-DIRECTORY 
      ELSE 
       MOVE SPACE   TO E-D-USER-DATA 
             (E-D-NUMBER-OF-ENTRIES) 
       MOVE ZERO   TO LENGTH-OF-USER-DATA 
      END-IF 
      ADD 12     TO LENGTH-UP-DIRECTORY 
     END-PERFORM 
     GOBACK 
     . 

这里的一个程序读取PDS/PDSE目录的一个例子,以及使用OCDIRBLK作为载/嵌套/嵌入式程序。

IDENTIFICATION DIVISION. 
    PROGRAM-ID. STOB30. 
    ENVIRONMENT DIVISION. 
    INPUT-OUTPUT SECTION. 
    FILE-CONTROL. 

     SELECT INPUT-FILE ASSIGN TO PDSIND 
      FILE STATUS IS W-PDSIND-FILE-STATUS. 

    DATA DIVISION. 
    FILE SECTION. 
    FD   INPUT-FILE 
     RECORDING MODE IS U 
     RECORD IS VARYING FROM 1 TO 256 DEPENDING ON 
     W-RECORD-LENGTH 
     LABEL RECORDS ARE STANDARD. 
    01 INPUT-RECORD. 
     05 FILLER PIC X(252). 
    WORKING-STORAGE SECTION. 
    01 W-THIS-PROGRAM      PIC X(9) VALUE 
                "STOB30". 
    01 W-WHEN-COMPILED      PIC X(8)BX(8). 
    01 W-RECORD-LENGTH    BINARY PIC 9(8). 
    01 W-PDSIND-FILE-STATUS    PIC XX. 
     88 W-PDSIND-FILE-STATUS-OK   VALUE ZERO "10". 
     88 W-END-OF-INPUT-PDSIND   VALUE "10". 
    01 EXPANDED-DIRECTORY. 
     05 E-D-NUMBER-OF-ENTRIES BINARY PIC 9(4). 
     05 FILLER 
      OCCURS 22 TIMES 
      INDEXED BY E-D-IND. 
      10 E-D-MEMBER-NAME    PIC X(8). 
      10 E-D-TRACK-ADDRESS   PIC X(3). 
      10 E-D-INDICATOR    PIC X(1). 
      10 E-D-ALIAS-FLAG    PIC X. 
       88 E-D-ALIAS    VALUE "Y". 
       88 E-D-ALIAS-NOT   VALUE "N". 
      10 E-D-NO-OF-POINTERS   PIC 9. 
      10 E-D-USER-DATA    PIC X(62). 
    PROCEDURE DIVISION. 
     PERFORM      00-START-UP 
     PERFORM      10-INTIAL-FILE-PROCESSING 
     PERFORM UNTIL W-END-OF-INPUT-PDSIND 
      CALL "OCDIRBLK"   USING INPUT-RECORD 
              EXPANDED-DIRECTORY 
      SET E-D-IND    TO 1 
      PERFORM E-D-NUMBER-OF-ENTRIES TIMES 
       DISPLAY 
         E-D-MEMBER-NAME (E-D-IND) 
       SET E-D-IND   UP BY 1 
      END-PERFORM 
      PERFORM     99A-READ-INPUT-FILE 
     END-PERFORM 
     PERFORM      30-FINALISE-INPUT-PROCESSING 
     GOBACK 
     . 
    00-START-UP. 
     MOVE WHEN-COMPILED   TO W-WHEN-COMPILED 
     DISPLAY 
       W-THIS-PROGRAM 
       " COMPILED ON " 
       W-WHEN-COMPILED 
     . 
    10-INTIAL-FILE-PROCESSING. 
     OPEN INPUT INPUT-FILE 
     IF NOT W-PDSIND-FILE-STATUS-OK 
      DISPLAY W-THIS-PROGRAM " DODGY PDSIND OPEN STATUS " 
        ">" W-PDSIND-FILE-STATUS "<" 
      CALL "BBDUMP" 
     END-IF 

     PERFORM      10A-PRIMING-READ 
     . 
    10A-PRIMING-READ. 
     PERFORM      99A-READ-INPUT-FILE 
     . 
    30-FINALISE-INPUT-PROCESSING. 
     CLOSE INPUT-FILE 
     IF NOT W-PDSIND-FILE-STATUS-OK 
      DISPLAY W-THIS-PROGRAM " DODGY PDSIND CLOSE STATUS " 
        ">" W-PDSIND-FILE-STATUS "<" 
      CALL "BBDUMP" 
     END-IF 
     . 
    99A-READ-INPUT-FILE. 
     IF W-END-OF-INPUT-PDSIND 
      DISPLAY "YOIKS" 
     END-IF 
     READ INPUT-FILE 
     IF NOT W-PDSIND-FILE-STATUS-OK 
      DISPLAY W-THIS-PROGRAM " DODGY PDSIND READ " 
        ">" W-PDSIND-FILE-STATUS "<" 
      CALL "BBDUMP" 
     END-IF 
     . 
    IDENTIFICATION DIVISION. 
    PROGRAM-ID. OCDIRBLK. 
    DATA DIVISION. 
    WORKING-STORAGE SECTION. 
    01 LENGTH-UP-DIRECTORY   BINARY PIC 9(4). 
    01 LENGTH-OF-USER-DATA   BINARY PIC 9(4). 
    01 DIRECTORY-DATA-LENGTH  BINARY PIC 9(4). 
    01 HIGH-ORDER-BIT-VALUE   BINARY PIC 9(4) VALUE 128. 
    01 BIT-ONE-VALUE    BINARY PIC 9(4) VALUE 64. 
    01 BIT-TWO-VALUE    BINARY PIC 9(4) VALUE 32. 
    01 USER-DATA-LENGTH    BINARY PIC 9(4). 
     88 NO-USER-HALFWORDS    VALUE ZERO. 
     88 SOME-USER-HALFWORDS    VALUE 1 THRU 31. 
     88 MEMBER-HAS-ONE-POINTER   VALUE 32 THRU 63. 
     88 MEMBER-HAS-TWO-POINTERS   VALUE 64 THRU 127. 
     88 MEMBER-IS-AN-ALIAS    VALUE 128 THRU 255. 
    01 FILLER REDEFINES USER-DATA-LENGTH. 
     05 FILLER       PIC X. 
     05 USER-DATA-BYTE     PIC X. 
    LINKAGE SECTION. 
    01 INPUT-DIRECTORY. 
     05 I-D-LENGTH    BINARY PIC 9(4). 
      88 I-D-NO-MEMBERS    VALUE ZERO. 
     05 FILLER OCCURS 0 TO 252 TIMES 
      DEPENDING ON LENGTH-UP-DIRECTORY 
              PIC X. 
     05 I-D-MEMBER-NAME     PIC X(8). 
      88 I-D-END-OF-BLOCK    VALUE HIGH-VALUES. 
     05 I-D-TRACK-ADDRESS    PIC XXX. 
     05 I-D-INDICATOR     PIC X. 
     05 I-D-USER-DATA. 
      10 FILLER 
       OCCURS 0 TO 62 TIMES 
       DEPENDING ON 
       LENGTH-OF-USER-DATA. 
       15 FILLER     PIC X. 
    01 EXPANDED-DIRECTORY. 
     05 E-D-NUMBER-OF-ENTRIES BINARY PIC 9(4). 
     05 FILLER OCCURS 22 TIMES. 
      10 E-D-MEMBER-NAME    PIC X(8). 
      10 E-D-TRACK-ADDRESS   PIC X(3). 
      10 E-D-INDICATOR    PIC X(1). 
      10 E-D-ALIAS-FLAG    PIC X. 
       88 E-D-ALIAS    VALUE "Y". 
       88 E-D-ALIAS-NOT   VALUE "N". 
      10 E-D-NO-OF-POINTERS   PIC 9. 
      10 E-D-USER-DATA    PIC X(62). 
    PROCEDURE DIVISION    USING 
              INPUT-DIRECTORY 
              EXPANDED-DIRECTORY 
              . 

     IF I-D-NO-MEMBERS 
      MOVE ZERO    TO DIRECTORY-DATA-LENGTH 
     ELSE 
      SUBTRACT +2    FROM I-D-LENGTH 
      GIVING     DIRECTORY-DATA-LENGTH 
     END-IF 

     MOVE ZERO     TO E-D-NUMBER-OF-ENTRIES 
             LENGTH-UP-DIRECTORY 
     PERFORM UNTIL (LENGTH-UP-DIRECTORY 
      NOT LESS THAN DIRECTORY-DATA-LENGTH) 
       OR (I-D-END-OF-BLOCK) 
      ADD 1     TO E-D-NUMBER-OF-ENTRIES 
      MOVE I-D-MEMBER-NAME  TO E-D-MEMBER-NAME 
             (E-D-NUMBER-OF-ENTRIES) 
      MOVE I-D-TRACK-ADDRESS TO E-D-TRACK-ADDRESS 
             (E-D-NUMBER-OF-ENTRIES) 
      MOVE I-D-INDICATOR  TO E-D-INDICATOR 
             (E-D-NUMBER-OF-ENTRIES) 
              USER-DATA-BYTE 
      MOVE ZERO    TO E-D-NO-OF-POINTERS 
             (E-D-NUMBER-OF-ENTRIES) 
      IF MEMBER-IS-AN-ALIAS 
       SET E-D-ALIAS (E-D-NUMBER-OF-ENTRIES) 
            TO TRUE 
       SUBTRACT HIGH-ORDER-BIT-VALUE 
            FROM USER-DATA-LENGTH 
      ELSE 
       SET E-D-ALIAS-NOT (E-D-NUMBER-OF-ENTRIES) 
            TO TRUE 
      END-IF 
      IF MEMBER-HAS-TWO-POINTERS 
       MOVE 2    TO E-D-NO-OF-POINTERS 
             (E-D-NUMBER-OF-ENTRIES) 
       SUBTRACT BIT-ONE-VALUE 
            FROM USER-DATA-LENGTH 
      END-IF 
      IF MEMBER-HAS-ONE-POINTER 
       ADD 1    TO E-D-NO-OF-POINTERS 
             (E-D-NUMBER-OF-ENTRIES) 
       SUBTRACT BIT-TWO-VALUE 
            FROM USER-DATA-LENGTH 
      END-IF 
      IF SOME-USER-HALFWORDS 
       MULTIPLY USER-DATA-LENGTH BY 2 
       GIVING    LENGTH-OF-USER-DATA 
       MOVE I-D-USER-DATA TO E-D-USER-DATA 
             (E-D-NUMBER-OF-ENTRIES) 
       ADD LENGTH-OF-USER-DATA TO LENGTH-UP-DIRECTORY 
      ELSE 
       MOVE SPACE   TO E-D-USER-DATA 
             (E-D-NUMBER-OF-ENTRIES) 
       MOVE ZERO   TO LENGTH-OF-USER-DATA 
      END-IF 
      ADD 12     TO LENGTH-UP-DIRECTORY 
     END-PERFORM 
     GOBACK 
     . 
    END PROGRAM OCDIRBLK. 
    END PROGRAM STOB30. 

这里的JCL的例子:

//LISTDIR EXEC PGM=STOB30,TIME=(,2) 
//STEPLIB DD DSN=yours as necessary 
//SYSOUT DD SYSOUT=* for the DISPLAY output 
//PDSIND DD DSN=your pds/pdse, 
// DISP=SHR,LRECL=256,RECFM=U 

注意,同时建立JCL我不包括RECFM = U(意外)。使用RECFM = FB,LRECL = 80 PDS和RECFM = U PDSE执行清理,产生正确的结果。

这让我感到惊讶。你的旅费可能会改变。

+0

不应该是255而不是252? IIRC,PDS目录记录是一个8字节密钥(CKD),后面最多255个字节。 (关键是没有提供I/O。) – zarchasmpgmr

+0

@zarchasmpgmr可能是256.我可能会通过使用U离开它。我最近才发现F是可能的,在那里我想我必须得到正确的长度。 –

+0

它是256.请记住在IEBPTPCH中打印目录的旧技巧? RECFM = U,BLKSIZE = 256,KEYLEN = 8 – zarchasmpgmr