CLISTでISPFを学ぶ(1)
CLISTでISPFを学ぶ(1):JCLをサブミットして、ジョブログ(実行結果)ISPFブラウザーで確認する
ISPF(Interactive System Productivity Facility:対話式システム生産性向上機能)は、z/OSを使う上で必須で使えなければならない機能です。ISPFを利用する機能として、JCLやプログラムのソースを編集しサブミットしたり、データセットの一覧を表示して改名や削除などのさまざまな操作を行うことができるPDF(Program Development Facility)や、ジョブの実行結果を見たりするSDSF(System Display and Search Facility)が有名で、開発部門、運用部門、管理部門などメインフレーム運用に携わるあらゆる業務で日常的に使われています。
しかしながら、ISPFとはPDFやSDSFのことを指すのではありません。PDFやSDSFなどのさまざまな機能プログラムやツールを、TSO画面を通じて対話式で処理を実行するための土台となるものです。多くのエンジニアが日々の業務で使用するツールがPDFやSDSFであるために、ISPF=PDF+SDSFと思われていることも多いですが、実際はISPFという土台の上でPDFやSDSFという対話型処理を行うプログラムが実行されています。これは、OSとアプリケーションの関係に似ています。OSという土台の上でアプリケーション・プログラムが動くわけです。ISPFでは、土台となる機能が「DM(Dialog Manager):ダイアログ・マネージャー」と言い、DMという土台の上で動くプログラムを「ダイアログ」と言います。PDFは、ISPFが提供する代表的なダイアログの1つです。
メーカーやベンダーから提供されるダイアログを使うだけのことが多いですが、土台であるISPF/DMのしくみを学び、直接自分で土台を使うことができるとz/OSの操作や運用の幅が広がります。ダイアログは必ずしもプログラムである必要はなくCLISTでもかまいません。CLISTだけでの処理はコマンド・ラインがベースになりますが、ISPF/DMのサービスを呼び出すことによって画面パネルを使用した対話型処理として実装することができます。少し複雑な処理であれば、REXXを利用するといいでしょう。REXXは、メインフレームからSystem i、AIX、z/LinuxなどのIBMコンピューターに共通のスクリプト言語です。
ISPF/DMに関連するマニュアルには以下のものがあります。実際に作ってみる際は、本サイトの記事だけでなくマニュアルも併せて参照して下さい。
- 対話式システム生産性向上機能(ISPF)ユーザーズ・ガイド第1巻(SC88-8965)
- 対話式システム生産性向上機能(ISPF)ユーザーズ・ガイド第2巻(SC88-8966)
- 対話式システム生産性向上機能(ISPF)サービス・ガイド(SC88-8962)
- 対話式システム生産性向上機能(ISPF)ダイアログ開発者ガイドとリファレンス(SC88-8964)
- 対話式システム生産性向上機能(ISPF)メッセージおよびコード(SC88-8958)
最初に紹介するのは、CLISTからユーザー独自のISPFパネルを表示して、入力されたデータ内容に応じた処理を行うサンプルです。以前に、CLIST入門編の最後に紹介した「JCLをサブミットして結果をISPFブラウザーで表示するCLIST」をISPFパネル入力にしたものです。CLISTによるデータ入力の基本はコマンドライン・ベースですが、ISPFパネルを利用すると、より実践向けにできます。ISPFサービスの呼び出しについては、以前のCLIST入門(9)にも解説があります。
ISPFパネルの定義
ISPFパネルを使用した対話式アプリケーションは、ISPFダイアログ・アプリケーションと呼ばれます。ダイアログの土台となる表示パネルは、専用のパネル定義ステートメントを用いて定義し、区分データセット(RECFM=FB、LRECL=80)のメンバーとして登録します。登録されたパネル・メンバーを、ISPFのサービスを使用して表示します。入力されたデータは、変数として格納され、それらをCLISTやREXXあるいはアセンブラーなどのプログラムで処理することができます。多くのことはCLISTでも十分に実現できますが、込み入った処理はREXXを使用すると作りやすいでしょう。
----+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8 )ATTR _ TYPE(INPUT) INTENS(HIGH) ? TYPE(INPUT) INTENS(LOW) # TYPE(OUTPUT) INTENS(HIGH) COLOR(WHITE) )BODY + ===== SUBMIT JCL AND BROWSE JOBLOG ===== + %COMMAND ===>_Z + + + + DATASET NAME:?Z + + + MEMBER NAME: ?Z + + + )INIT .ZVARS = '(ZCMD ZDSN ZMEM)' IF (&ZDSN = '') &ZDSN = 'EDU1.JCL' )REINIT REFRESH (*) )PROC IF (&ZCMD NE '') GOTO ERRMSG1 /* SHOW ERROR MSG */ EXIT ERRMSG1: /* SHOW 24BYTES SHORT MSG */ &ZERRSM = 'INVALID COMMAND ENTERED.' /* 24BYTES SHORT MSG */ &ZERRLM = '''&ZCMD'' IS NOT VALID COMMAND.' /* LONG MSG BY PF1 */ .MSG = ISRZ003 /* POPUP ERROR MSG TEXT IN ISRZ003(ISPF GENERAL MSG) */ )END
任意の区分データセット(RECFM=FB、LRECL=80)に、パネルのソース・メンバーとして登録します。このサンプルでは、EDU1.PANEL(SELJCL1)として登録しています。

ISPFパネルを表示して、実際に処理を行うCLISTを作成する
定義したISPFパネルを表示して、データセット名とメンバー名を受け取り、JCLとしてサブミットして、そのジョブの実行結果を表示するCLISTです。
----+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8 /* */ /* CLIST FOR CALLING ISPF SERVICE */ /* =============================== */ /* SUBMIT JCL AND BROWSE JOBLOG */ /* */ CONTROL MSG NOLIST NOCONLIST NOFLUSH ALLOC DD(ISPPUSR) SHR DSN('EDU1.PANEL') ISPEXEC LIBDEF ISPPLIB LIBRARY /* ADD USER PANEL LIBRARY */ + ID(ISPPUSR) /* (CALL ISPF SERVICE) */ MAIN: + ISPEXEC DISPLAY PANEL(SELJCL1) /* SHOW PANEL(CALL ISPF SERVICE) IF &LASTCC = 8 THEN GOTO DONE /* IF PF3/PF4 EXIT CLIST SET &SYSOUTTRAP = 1 SET &CJOB = JOB SET &CSUB = SUBMITTED SET &COUT = ON OUTPUT QUEUE /* THE VALIABLES ZDSN AND ZMEM ARE DEFINED IN PANEL MEMBER SUBMIT '&ZDSN(&ZMEM)' /* SUBMIT JCL MEMBER WRITE &SYSOUTLINE1 IF &MAXCC NE 0 THEN GOTO DONE /* IF PF3/PF4 EXIT CLIST SET &X = &SYSINDEX(&CJOB,&SYSOUTLINE1) + 4 SET &Y = &SYSINDEX(&CSUB,&SYSOUTLINE1) - 2 SET &JOBID = &SUBSTR(&X:&Y,&SYSOUTLINE1) WRITE &SYSOUTLINE1 ALLOCATE DD(SOUTWRK) NEW TRACKS SPACE(10 10) DO UNTIL &X NE 0 ST &JOBID WRITE &SYSOUTLINE1 SET &X = &SYSINDEX(&COUT,&SYSOUTLINE1) END SET &SYSOUTTRAP = 0 LISTDSI SOUTWRK FILE OUTPUT &JOBID HOLD KEEP PRINT('&SYSDSNAME') ISPEXEC BROWSE DATASET('&SYSDSNAME') VOLUME(&SYSVOLUME) FREE DD(SOUTWRK) GOTO MAIN /* LOOP FOR NEXT PROCESSING DONE: + ISPEXEC LIBDEF ISPPLIB /* REMOVE USER PANEL LIBRARY FREE DD(ISPPUSR) /* UNALLOCATE USER PANEL DATASET EXIT /* RETURN TO TSO/E
最初のALLOCコマンドで割り振っているデータセットが、作成したパネル・メンバーを格納した区分データセットです。サンプルではEDU1.PANELになっていますが、実際のデータセット名に変えて下さい。
ISPEXECステートメントが、ISPF/DMのサービス呼び出しです。DISPLAYはパネルを表示します。パネル内でのエラー処理(誤ったコマンドやデータの入力など)はパネル側で行えるので、パネルを使うプログラムやCLISTでは考える必要がありません。パネルでPF3やPF4キーが押されるとCC=8で戻ってきますので、そのまま終了処理を行います。データが入力され実行キーが押されるとCC=0で戻ってきますので続きの処理を行います。
パネルで入力したデータが格納された変数(パネル側で定義されている)は、CLIST内でもそのまま同じ名前で参照できます。CLISTの場合は、この辺りが簡単です。アセンブラーやCOBOLで作る場合は、ISPF/DMのサービスを使用しなければ変数を参照することができません。
パネルで入力されたDSNとメンバー名をパラメーターとして、TSOのSUBMITコマンドでサブミットします。ジョブの実行終了をCLIST内でウォッチして(処理内容の概要は、以前のCLIST入門(9)を参照)、実行が終了したらTSOのOUTPUTコマンドで、ジョブのSYSOUT一式を動的に割り振ったPSデータセットに書き込みます。OUTPUTコマンドの仕様で、ジョブのMSGCLASSにはホールドされるSYSOUTクラスを指定する必要があります。
OUTPUTコマンドから戻ってきたら、ISPEXECステートメントを使用して、ISPF/DMのBROWSEサービスを呼び出します。画面の処理はすべてBROWSEサービスがやってくれるので、ユーザーは面倒な画面制御の処理を何も行う必要はありません。ISPFブラウザーが終了したらCLISTに戻ってくるので、再度パネル表示から繰り返します。

業務で使う、ちょっとした定型的な処理などは、ISPFのサービスを組み合わせることで簡単なパネル・アプリケーションとして作ることもできます。この連載では、ISPFの土台であるISPF/DMの使い方の基本を紹介して行こうと思います。