COBOLでも区分データセットのディレクトリー部を順次データセットとして読み込むことができます。ポイントは区分データセット自体のレコード形式、レコード長、ブロック長に関係なく、JCLのDCBパラメーターにRECFM=F,BLKSIZE=256,LRECL=256を指定することです。
プログラムそのものは256バイトの固定長レコード長のファイルを読み込むロジックを書けばいいのです。このサンプル・プログラムでは読んだディレクトリー・ブロックのデータを単にSYSPRINTに書き出すだけですが、ディレクトリー・ブロックのデータはINDATA領域に読み込まれるので必要に応じた処理をそこに追加できます。ディレクトリー部の具体的な構造については各OSのデータ管理解説書などを参照して下さい。なお、COBOLではPDSディレクトリー・ブロックのキー部は読めません(256バイトのデータ部のみが読み込める)。
富士通のXSPではディレクトリー部のレコード長は1000バイトになります。サンプル中の256を1000に置き換えて下さい。MVS(MSP,VOS3)とXSPでの大きな違いには以下のものがあります。
MVS,MSP,VOS3 | XSP | |
キー部の長さ | 8バイト(ブロックの最終エントリメンバー名) | ←同じ |
データ部の長さ (レコード長) |
256バイト | 1000バイト |
メンバーエントリーの長さ | 12~74バイトの可変長 | 40または80バイト固定長 (ただし混在はない) |
PDSディレクトリー読み込みプログラム・サンプル
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 |
// JOB //********************************************************************* //READDIR EXEC IGYWCLG z/OS以外では各OSのCOBOLプロシージャーを指定する //GO.SYSUT1 DD DISP=SHR,DSN=&SYSUID..JCL, // DCB=(RECFM=F,BLKSIZE=256,LRECL=256) ここがポイント!! 必ずDCBパラメーターをこのように指定 //GO.SYSUT2 DD SYSOUT=* //COBOL.SYSIN DD * IDENTIFICATION DIVISION. PROGRAM-ID. READDIR. * ENVIRONMENT DIVISION. CONFIGURATION SECTION. INPUT-OUTPUT SECTION. FILE-CONTROL. SELECT INFILE ASSIGN TO SYSUT1. SELECT OUTFILE ASSIGN TO SYSUT2. * DATA DIVISION. FILE SECTION. FD OUTFILE RECORDING MODE IS F BLOCK CONTAINS 0 RECORDS RECORD CONTAINS 264 CHARACTERS. 01 OUTDATA. 02 MARK1 PIC X(4). 02 OUTDATA-PDSDIR PIC X(256). 02 MARK2 PIC X(4). FD INFILE RECORDING MODE IS F BLOCK CONTAINS 1 RECORDS RECORD CONTAINS 256 CHARACTERS. 01 INDATA PIC X(256). * WORKING-STORAGE SECTION. 01 RETCODE PIC S9(008) COMP VALUE 0. * PROCEDURE DIVISION. DISPLAY 'THIS IS SAMPLE COBOL PROGRAM(READ PDS DIRECTORY BLOCK)' UPON CONSOLE. * OPEN INPUT INFILE. OPEN OUTPUT OUTFILE. MOVE '>>> ' TO MARK1. MOVE '<<< ' TO MARK2. LOOP. READ INFILE AT END CLOSE INFILE CLOSE OUTFILE STOP RUN. MOVE INDATA TO OUTDATA-PDSDIR. WRITE OUTDATA. GO TO LOOP. * STOP RUN. // // |