プログラムを実行するには、JCLを作成して使用するデータセットに対応したDDステートメントを定義します。DDステートメントにどのようなパラメーターが定義されているかによって、プログラムの動きを変えたりアクセスするデータセットの情報を得たりすることはしばしば行われます。
アプリケーションの実行結果のサマリー出力などにDD名だけではなくDSNを表示することで、利用者はプログラムが実際にどのデータセットにアクセスしたのかが容易にわかります。
データセットの装置タイプを得たり、DDステートメントが定義されているかを確認する
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
----+----1----+----2----+----3----+----4----+----5----+----6----+----7-- DEVTYPE DDNAME,DEVINFO TEST DD STMT DEFINITION LTR R15,R15 SUCCESSFUL ? BNZ NODDSTMT NO, DD STMT NOT DEFINED TM DEVINFO+2,X'80' TAPE DEVICE ? BO DEVTAPE YES, TM DEVINFO+2,X'20' DASD DEVICE ? BNO DEVOTHR NO, CLI DEVINFO+3,X'0F' 3390 DASD ? BNE DEVERRO NO, CLI DEVINFO+2,0 DUMMY DATASET ? BE DEVDUMY YES, CLC DEVINFO+2(2),=XL2'0102' SYSOUT/SYSIN DATASET ? BE DEVSPOOL YES, CLC DEVINFO+2(2),=XL2'0103' PATH DATASET(HFS) ? BE DEVHFS YES, : : DDNAME DC CL8'SYSUT1' DDNAME FIELD DEVINFO DC XL8'00' DEVINFO RETURN AREA(UCBTBYT) |
DEVTYPEマクロを発行することでDDステートメントに定義したデータセットの装置タイプを得ることができます。DEVTYPEを利用すれば、特定の装置タイプしかサポートしないプログラムはOPEN前に定義されたデバイス種別を知ることができます。また、指定した名前に対応するDDステートメントが定義されていなければDEVTYPEはエラーを返すので、未定義のDDステートメントに対応したデータセットをOPENしないようにすることができます。未定義のDD名でOPENしてもエラーが返るだけですが、次のメッセージがコンソールに出てしまいます。DEVTYPEで事前に確認すればエラー・メッセージが発行されることを抑止できます。
IEC130I ddname DD STATEMENT MISSING
※サンプルではエラーを0か0以外かで判定してますが、実際のエラーコードは細分化されています(マニュアルを参照)。
DEVTYPEが返す情報はマクロのパラメーターによって変わります。サンプルは最もシンプルなパターンです。DEVINFOエリアには8バイトの情報が返り、先頭の4バイトはUCBの装置タイプバイト(UCBTBYT1~UCBTBYT4)です(IEFUCBOBマッピング・マクロで参照可能)。その他、DEVTYPEの詳細は「z/OS DFSMSdfp 拡張サービス」(z/OS)「システムプログラミング手引書 データ管理編」(MSP)「システムプログラマの手引-マクロ編-」(VOS3)の各マニュアルに記載されています。
DDステートメントに定義したパラメーター情報を得る
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
----+----1----+----2----+----3----+----4----+----5----+----6----+----7-- USING INFMJFCB,JFCBAREA ADDRESS TO JFCB READ AREA RDJFCB (SYSUT1) READ JFCB(SYSUT1 DD STMT) LTR 15,15 SUCCESSFUL ? BNZ NODDSTMT NO, DD STMT NOT DEFINED MVC DSNAME,JFCBDSNM SET ACTUAL DSNAME MVC VOLUME,JFCBVOLS SET ALLOCATED VOLUME : : DSNAME DC CL44' ' VOLUME DC CL6' ' : : SYSUT1 DCB DDNAME=SYSUT2, QSAM DCB + DSORG=PS,MACRF=(GL,PM),EXLST=JFCBEXIT JFCBEXIT DC X'87',AL3(JFCBAREA) JFCB READ EXIT JFCBAREA DS 0F (FULLWORD BOUNDARY) DC CL176' ' JFCB READ AREA : : DJFCB DSECT , IEFJFCBN JFCB MAP |
MVS(特にバッチプログラム)では、データセットはDD名によってアクセスするのが基本です。プログラムはデータセットの名前などを知る必要はありません(知らなくてもアクセスできる)。しかし、どのようなデータセットにアクセスするのかを求めたい場合もあり、そのような場合はRDJFCBマクロを利用できます。上記サンプルは、アクセスするデータセットのDSNと先頭のVOLUME名を求めるものです。
DDステートメントに定義されたパラメーターは、JFCBと呼ばれるコントロール・ブロックに格納されています。JFCBは、基本的にDDステートメントに定義されたパラメーターに基づき設定されているので、スペース情報(1次量、2次量他)などは指定がなければ設定されていません(それらはJFCBではなくDSCBを求めて得ることができる)。ただし、カタログされているボリューム名や一時的データセットのDSNなどは設定されています。DDステートメントのパラメーターをいろいろと変えて試してみるといいでしょう。なお、RDJFCBはOPENの前と後のどちらでも発行できます。OPEN後に発行した場合、RECFMなど1部のDCB情報はJFCBにも設定されます。読み込んだJFCBは、IEFJFCBNマッピング・マクロで参照できます。RDJFCBマクロもDEVTYPEと同じマニュアルに記載されています。