PDSメンバーを移動する
PDSメンバーを移動する
区分データセットのメンバーを移動するにはいくつかの方法があります。以下にその方法をいくつか示します。「PDSメンバー 移動」というキーワードだけでどのOSかがわかりませんでしたので、MVS(z/OS)の例で示します。
ISPFを使う
最も手軽な方法です。ISPFのオプション3.1(LIBRARYユーティリティー)、3.4(DSLISTユーティリティー)などから移動元の区分データセットを選択してメンバーリストを表示し、メンバーリスト・パネルから移動したいメンバーを選択できます。複数のメンバーを移動したい場合でも簡単な操作で行うことができます。MSPならPFD、VOS3ならASPENを利用できます。
IEHMOVEユーティリティーを使う
//IEHMOVE EXEC PGM=IEHMOVE //SYSPRINT DD SYSOUT=* //SYSUT1 DD DISP=OLD,UNIT=SYSDA,VOL=SER=WORK01 //DDIN DD DISP=OLD,UNIT=SYSDA,VOL=SER=WORK01 //DDOUT DD DISP=OLD,UNIT=SYSDA,VOL=SER=SHRWRK //SYSIN DD * MOVE PDS=WORK.PDS1,UNCATLG, X TO=SYSDA=SHRWRK,RENAME=MY.JCLWORK SELECT MEMBER=(MEMBER1,MEMBER2,MEMBER3) //
IEHMOVEユーティリティーを使ってバッチ処理でメンバーを移動することもできます。しかしこのユーティリティーは少々わかりにくい上、選択されなかったメンバーが残っていても処理後は元の区分データセット自体も消えてしまいます。特定のメンバーだけを残して、残りは捨てる、という場合でなければ使いにくいでしょう。MSPではJSGMOVE、VOS3ではJSFMOVEが互換ユーティリティーです。
//COPY EXEC PGM=IEBCOPY //SYSPRINT DD SYSOUT=* //SYSUT1 DD DISP=SHR,DSN=WORK.PDS1 //SYSUT2 DD DISP=SHR,DSN=MY.JCLWORK //SYSIN DD * COPY INDD=SYSUT1,OUTDD=SYSUT2 SELECT MEMBER=(MEMBER1,MEMBER2,MEMBER3) //* //SCRATCH EXEC PGM=IEHPROGM,COND=(0,NE,COPY) //SYSPRINT DD SYSOUT=* //SYSUT1 DD DISP=OLD,UNIT=SYSDA,VOL=SER=WORK01 //SYSIN DD * SCRATCH DSNAME=WORK.PDS1,VOL=SYSDA=WORK01,MEMBER=MEMBER1 SCRATCH DSNAME=WORK.PDS1,VOL=SYSDA=WORK01,MEMBER=MEMBER2 SCRATCH DSNAME=WORK.PDS1,VOL=SYSDA=WORK01,MEMBER=MEMBER3 //
IEHMOVEユーティリティーは古典的なユーティリティーですし、これまでに使ったことがなければ新たに覚える必要はないでしょう。使ったことがなかったり、ユーティリティーの動きが行いたいことと合わないなら、IEBCOPYで必要なメンバーをコピーしてからIEHPROGMユーティリティーで元のデータセットからコピーしたメンバーを削除してもいいでしょう。
ISPFをバッチで実行する
//********************************************************************* //* ISPF BACTH SESSION SAMPLE JCL //********************************************************************* //ISPBATCH PROC //BLDCLST EXEC PGM=IEBGENER //SYSPRINT DD DUMMY //SYSUT2 DD DISP=(,PASS),DSN=&&CLIST(ISPFCMD), // UNIT=VIO,SPACE=(TRK,(1,1,1)), // DCB=(RECFM=FB,BLKSIZE=0,LRECL=80) //SYSIN DD DUMMY //* //ISPFRUN EXEC PGM=IKJEFT01,DYNAMNBR=256 //SYSPROC DD DISP=(OLD,DELETE),DSN=&&CLIST //ISPPROF DD UNIT=SYSDA,SPACE=(TRK,(15,1,10)), // DCB=(RECFM=FB,BLKSIZE=6160,LRECL=80) //ISPLLIB DD DISP=SHR,DSN=ISP.SISPLOAD //ISPPLIB DD DISP=SHR,DSN=ISP.SISPPENU //ISPMLIB DD DISP=SHR,DSN=ISP.SISPMENU //ISPTLIB DD DISP=SHR,DSN=ISP.SISPTENU //ISPSLIB DD DISP=SHR,DSN=ISP.SISPSLIB // DD DISP=SHR,DSN=ISP.SISPSENU //SYSTSPRT DD SYSOUT=* //* //PRTLIST EXEC PGM=IEBGENER,COND=(0,NE,ISPFRUN) //SYSPRINT DD DUMMY //SYSUT1 DD DISP=(OLD,DELETE),DSN=ISPFJOB.&SYSUID..SPFLOG1.LIST //SYSUT2 DD SYSOUT=* //SYSIN DD DUMMY // PEND //********************************************************************* //IEFPROC EXEC ISPBATCH //BLDCLST.SYSUT1 DD *,DLM='++' /* MOVE PDS MEMBER */ ISPEXEC LMINIT DATAID(DDVAR1) DATASET('WORK.PDS1') ENQ(SHR) ISPEXEC LMINIT DATAID(DDVAR2) DATASET('MY.JCLWORK') ENQ(SHR) ISPEXEC LMMOVE FROMID(&DDVAR1) TODATAID(&DDVAR2) FROMMEM(MEMBER1) ISPEXEC LMMOVE FROMID(&DDVAR1) TODATAID(&DDVAR2) FROMMEM(MEMBER2) ISPEXEC LMMOVE FROMID(&DDVAR1) TODATAID(&DDVAR2) FROMMEM(MEMBER3) END //ISPFRUN.SYSTSIN DD * PROFILE PREFIX(ISPFJOB) /* AVOID ISPF-LOG ENQ CONTENTION */ ISPSTART CMD(%ISPFCMD) /* ISPF EXECUTION COMMANDS CLIST */ // //
JCLは少し複雑ですが、ISPFのライブラリーアクセスサービスをバッチで実行する方法もあります。サンプルではメンバー毎にLMMOVEサービスを呼び出していますが、FROMMEM(MEMBER*)と指定すれば名前の先頭がMEMBERとなっているすべてのメンバーが移動の対象となります。
いろいろな方法がありますが、バッチ処理で自動化するような場合はIEBCOPYで移動したいメンバーをコピーし、コピーの処理が正しく終了した場合のみ元のデータセットからコピー済みメンバーを消す方法がわかりやすいでしょう。この方法はMVSだけでなくMSPでもVOS3でも共通に利用できます。