COBOLで区分データセットのディレクトリ部を直接読むサンプル

By 神居 - Posted: 2009/09/11 Last updated: 2009/09/12 - Leave a Comment

COBOLでも区分データセットのディレクトリ部を順次編成データセットとして読み込むことができます。ポイントは区分データセット自体のレコード形式、レコード長、ブロック長に関係なく、JCLのDCBパラメーターでRECFM=F,BLKSIZE=256,LRECL=256と指定することです。プログラムそのものは256バイトの固定長レコード長のファイルを読み込むロジックを書けばいいのです。このプログラムでは読んだディレクトリブロックのデータを単にSYSPRINTに書き出すだけですが、ディレクトリブロックのデータはINDATA領域に読み込まれるので、必要に応じた処理を入れて下さい。

このサンプルはMVS3.8用に作りました。現在のOSでも動かせますが、FILE-CONTROLのSELECT文は、ASSIGN TO dd名 とdd名のみに変えて下さい(装置タイプやUNIT名などは不要)。

ディレクトリ部の具体的な構造については各OSのデータ管理解説書などを参照して下さい。

なおXSPではディレクトリ部のレコード長は1000バイトになります。サンプル中の256を1000に置き換えて下さい。MVS(MSP,VOS3)とXSPでの大きな違いは次のようになります。(COBOLでキー部は読めない)

  MVS,MSP,VOS3XSP
キー部の長さ8バイト(ブロックの最終エントリメンバー名)←同じ
データ部の長さ
(レコード長)
256バイト1000バイト
メンバーエントリーの長さ12?74バイトの可変長40または80バイト固定長
(ただし混在はない)

//COBOL    JOB ,'TEST COBOL',CLASS=A,MSGCLASS=A,MSGLEVEL=(1,1)
//*********************************************************************
//*        BUILD LOAD MODULE(COBOL) AND EXECUTE IT
//*        =======================================
//*********************************************************************
//COBCLG   PROC
//COB      EXEC PGM=IKFCBL00,REGION=4096K,
//         PARM='NOSEQ,DMAP,PMAP'
//SYSPRINT DD SYSOUT=*
//SYSPUNCH DD SYSOUT=*
//SYSLIB   DD UNIT=SYSDA,SPACE=(TRK,(1,,1))
//SYSUT1   DD UNIT=SYSDA,SPACE=(460,(700,100))
//SYSUT2   DD UNIT=SYSDA,SPACE=(460,(700,100))
//SYSUT3   DD UNIT=SYSDA,SPACE=(460,(700,100))
//SYSUT4   DD UNIT=SYSDA,SPACE=(460,(700,100))
//SYSLIN   DD DISP=(MOD,PASS),UNIT=SYSDA,SPACE=(80,(500,100))
//LKED     EXEC PGM=IEWL,REGION=2048K,
//         PARM='LIST,LET,MAP,XREF'
//SYSPRINT DD SYSOUT=*
//SYSLIN   DD DISP=(OLD,DELETE),DSNAME=*.COB.SYSLIN
//         DD DDNAME=SYSIN
//SYSLMOD  DD DISP=(,PASS),DSNAME=&GODATA(RUN),
//            UNIT=SYSDA,SPACE=(1024,(50,20,1))
//SYSLIB   DD DISP=SHR,DSNAME=SYS1.COBLIB
//SYSUT1   DD UNIT=(SYSDA,SEP=(SYSLIN,SYSLMOD)),SPACE=(1024,(50,20))
//GO       EXEC PGM=*.LKED.SYSLMOD,COND=((5,LT,COB),(5,LT,LKED))
//SYSPRINT DD SYSOUT=*
//SYSUT1   DD DISP=SHR,DSN=USR1.JCL,DCB=(RECFM=F,BLKSIZE=256,LRECL=256)
//SYSUT2   DD SYSOUT=*              ここがポイント!!
//         PEND                     必ずDCBパラメーターをこのように指定
//********************************************************************
//*        NAME: USR1.JCL(COBOL)
//*        DESC: COBOL VERIFICATION
//********************************************************************
//COBOL    EXEC COBCLG
//COB.SYSIN DD *
       IDENTIFICATION DIVISION.
       PROGRAM-ID.    COBTEST1.
      *
       ENVIRONMENT DIVISION.
       CONFIGURATION SECTION.
       INPUT-OUTPUT SECTION.
       FILE-CONTROL.
           SELECT INFILE ASSIGN TO DA-2311-S-SYSUT1.
           SELECT OUTFILE ASSIGN TO DA-2311-S-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-NAKAMI            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' 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-NAKAMI.
           WRITE OUTDATA.
           GO TO LOOP.
      *
           STOP RUN.
//
//
Posted in 未分類 • • Top Of Page