- 「メインフレーム・コンピューター」で遊ぼう - http://www.arteceed.net -

CLIST入門(9)

CLIST入門(9):ISPFの呼び出し

これまでの連載で、CLISTとはどういうものか、どんな機能があるのか、使うと何ができるのか、といったことのアウトラインを紹介してきました。しかし、自動化されようが、繰り返しの作業が楽になろうが、いかんせんコマンド・ベースの処理で、TSO端末での作業の大半をISPFでこなしている現在では、何となく物足りない、機能やしくみはわかったがあまり使いようがないな、と感じる人も多いと思います。
そこでこのシリーズの最終回である今回は、CLISTからISPFを呼び出す方法を解説します。ISPFを呼び出すことで、コマンド・ベースの処理とパネルを使う対話処理を組み合わせたり、対話型の反復処理を行ったり、応用範囲がさらに拡がります。

ISPFのダイアログおよびPDFの機能は、CLIST、REXX EXECあるいはアプリケーションプログラムから呼び出すことができます。コマンド形式とリンク形式の2種類の呼び出し方法があり、CLISTから呼び出す場合はコマンド形式を使用します。ISPFを呼び出すためのコマンドが「ISPEXEC」です。他のTSOコマンド同様にISPEXECコマンドをCLISTに記述するだけで、簡単にISPFおよびPDFの機能を実行させることができます。


    ISPEXECによるISPFダイアログ・サービスの実行

    ----+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8
    /* SHOW PDF/EDITOR MENU PANEL */
    ISPEXEC SELECT PGM(ISREDIT)
    

    ISPEXECのコマンド名に続いて、実行したいサービス名、必要なパラメーターの順に記述します。呼び出したサービスが終了(例えばPF3でパネルの処理を終了するなど)するとISPEXECコマンドのステートメントは終了し、次のステートメントの実行に移ります。
    このサンプルは、PDFのエディターパネルを表示させるものです。表示されたパネルにDSNなどを入力すれば、データセットやメンバーの編集が行えます。
    このようにPDFの機能パネルを単純に呼び出して実行させる場合は、ISPFのSELECTサービスを使い、PDFの機能プログラム名を指定して実行します。SELECTサービスにどのようなパラメーターを指定すればいいかは、PDFのパネル・ソースを見れば簡単にわかります。

      目的の機能に対応したSELECTパラメーターの見つけ方

      ISPF/PDFのプライマリー・オプション・パネルのソース・メンバーを見ます。パネル名やパネル・ライブラリー名がわからない場合、次のような手順で求めることができます。ISPF/PDFのプライマリー・オプション・パネルを表示します。コマンド欄に「PANELID」と入力すれば、パネルの左上部にパネル名が表示されます。「PANELID OFF」でパネル名表示は消えます。パネル・ライブラリーは、ISPFを実行するCLISTを参照します。

      ----+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8
      PROC 0 PANEL()                                                         
      /*********************************************************************/
      /*                                                                   */
      /* LIB: SYS1.CMDPROC(ISPPDF) FOR ISPF STANDARD PROCEDURE             */
      /* DOC: THIS CLIST ALLOCATES THE FILES REQUIRED BY ISPF AND PDF      */
      /*      AND THEN INVOKES PDF.                                        */
      /* NOTE: SYSPROC IS FREED AND REALLOCATED TO INCLUDE THE PDF CLIST   */
      /*       DATASET. THIS MAY RESULT IN A DIFFERENT CONCATENATION       */
      /*       THAN EXISTED BEFORE THIS CLIST WAS INVOKED.                 */
      /*                                                                   */
      /*********************************************************************/
               :
      ALLOC FI(ISPPLIB) SHR DA( +                                            
                               'USR1.ISFPLIB'  ここがパネル・ライブラリー   +
                               'ISP.SISPPJPN'  の定義                       +
                               'ISF.SISFPLIB'                               +
                               'ISP.SISPPENU')                               
               :
      

      CLIST内で、ISPPLIBのDD名で発行しているALLOCコマンドを見つけます。そこに定義されたデータセットにパネル名と同じメンバーがあるか、DAパラメーター内での定義順に探します。

      ----+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8
               :
      &ZSEL = TRANS (TRUNC (&ZCMD,'.')                         
        0,'PGM(ISPISM) SCRNAME(SETTINGS)'                      
        1,'PGM(ISRBRO) PARM(ISRBRO01) SCRNAME(VIEW)'           
        2,'PGM(ISREDIT) PARM(P,ISREDM01) SCRNAME(EDIT)'        
        3,'PANEL(ISRUTIL) SCRNAME(UTIL)'                       
        4,'PANEL(ISRFPA) SCRNAME(FOREGRND)'                    
        5,'PGM(ISRJB1) PARM(ISRJPA) SCRNAME(BATCH) NOCHECK'    
        6,'PGM(ISRPTC) SCRNAME(CMD)'                           
        S,'PGM(ISFISP) NOCHECK NEWAPPL(ISF) PARM(&NEXTOPT)'    
        7,'PGM(ISPYXDR) PARM(&ZTAPPLID) SCRNAME(DTEST) NOCHECK'
        8,'PANEL(ISRLPRIM) SCRNAME(LMF)'                       
        9,'PANEL(ISRDIIS) ADDPOP'                              
       10,'PGM(ISRSCLM) SCRNAME(SCLM) NOCHECK'                 
       11,'PGM(ISRUDA) PARM(ISRWORK) SCRNAME(WORK)'            
        X,EXIT                                                 
       SP,'PGM(ISPSAM) PARM(PNS)'                              
               :
      

      パネル・ソースの下の方に上のサンプルのような定義箇所があるはずです。クォーテーション記号で囲まれた部分がSELECTサービスで指定するパラメーターとなります。オプション2はエディターで、PGM呼び出しになっているのでこのまま利用できます。オプション3.nの場合、さらに別のパネルが入るので、次にそのパネルを見ます。オプション3.nならパネル名はISRUTILとなります。ISRUTILパネル・ソース内でSELECTサービスのパラメーターを見つけます。

    ----+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8
    /* CALL PDF/EDITOR */                  
    ISPEXEC EDIT DATASET('dsname(member)')
    

    単にエディターを呼び出すだけではあまり意味はないので、CLISTからの呼び出しの場合は、編集対象のDSNやメンバー名を与えて、エディターのDSN入力パネルを迂回するような使い方が一般的です。このような場合は、エディター・プログラムを直接呼ぶのではなく、ISPFのダイアログ・サービスを実行します。

    ----+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8
    /* EXEC PDF/EDITOR */
    ISREPDF 'dsname(member)' [BROWSE] [VIEW]
    

    エディターとブラウザーならば、ISREPDFコマンドによって直接に呼び出すこともできます。BROWSEオプションを付ければエディターではなく、ブラウザーでの表示になります。


    DSLISTの実行

    ----+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8
    /* DISPLAY PDF/DSLIST PANEL */
    ISPEXEC LMDINIT LISTID(LID) LEVEL(dslevel)
    ISPEXEC LMDDISP LISTID(&LID)
    WRITE CC = &LASTCC
    
    ISPEXEC LMDINIT LISTID(LID) VOLUME(volser)
    ISPEXEC LMDDISP LISTID(&LID) VIEW(SPACE)
    

    DSLISTユーティリティーは、LMDDISPサービスによって実行できます。最初にLMDINITサービスでDSLEVELもしくはVOLUME名を指定して初期化しておきます。その後にLMDDISPサービスを呼び出します。DSLEVELやVOLUME名を間違えるてもエラー・パネルなどは表示されず見た目は何も変化なしで終わってしまいます。そのような場合は、WRITEステートメントなどで&LASTCC変数の値を表示させれば正常終了なのかエラーなのか判別できるようになります。


    PDSデータセット内のJCLメンバーをサブミットして、そのジョブの実行結果をISPFブラウザーにて表示する

    ----+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8
    /*
    /*  JCL SUBMIT AND DISPLAY JOB OUTPUT BY ISPF BROWSER.
    /*
    PROC 0
    WRITENR PLEASE ENTER JCL DATASET NAME ==>
    READ &DSN
    
    MAIN: +
    WRITENR PLEASE ENTER MEMBER NAME ==>
    READ &MEM
    IF &MEM = '' THEN EXIT
    
    SET &SYSOUTTRAP = 1
    SET &CJOB = JOB
    SET &CSUB = SUBMITTED
    SET &COUT = ON OUTPUT QUEUE
    
    SUBMIT '&DSN(&MEM)'
    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) REUSE
    
    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
    

    以前にも紹介したものですが、PDSデータセット内のJCLメンバーをサブミットして、そのジョブの実行結果をISPFブラウザーにて表示するサンプルです。ジョブの完了は、STコマンドを発行してその返答メッセージで判定します。「ON OUTPUT QUEUE」となるまでループしてコマンドを発行しています。前回のCLIST入門(8)のコマンド・メッセージのトラップでも解説した&SYSOUTTRAPと&SYSOUTLINEを使っていますが、今回OUTPUTコマンドは、ジョブのSYSOUTをPSデータセットに書き出すために使い、SYSOUTの内容はISPFのBROWSEサービスによって表示します。OUTPUTコマンドでの表示では先に進むだけですが、ISPFブラウザーでなら後方へスクロールしたり、検索なども可能になり、ずっと実用的になります。


ISPFのサービスを組み合わせることで、コマンド・ベースだけではできなかった処理を組み込むことも可能になります。マニュアルなどを参考にしていろいろなサービスを試してみて下さい。ISPEXECで呼び出せるサービスの種類とパラメーターなどの詳細は、「z/OS 対話式システム生産性向上機能(ISPF)サービス・ガイド」に詳細が解説されています。