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,VOS3 | XSP | |
キー部の長さ | 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