区分データセットのメンバーを移動するには、いくつかの方法があります。以下に、その方法をいくつか示します。「PDSメンバー 移動」というキーワードだけで、どのOSかがわかりませんでしたので、MVS(z/OS)の例で示します。
ISPFを使う
最も手軽な方法です。ISPFのオプション3.1(LIBRARYユーティリティー)、3.4(DSLISTユーティリティー)などから、移動元の区分データセットを選択してメンバーリストを表示し、メンバーリスト・パネルから移動したいメンバーを選択できます。複数のメンバーを移動したい場合でも、簡単な操作で行うことができます。MSPならPFD、VOS3ならASPENを利用できます。
IEHMOVEユーティリティーを使う
1 2 3 4 5 6 7 8 9 10 |
//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が互換ユーティリティーです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
//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をバッチで実行する
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
//******************************************************************** //* TSO BACTH SESSION --- ISPF SERVICE--- //******************************************************************** //ISPBATCH PROC //BLDCLIST EXEC PGM=IEBGENER --- GENERATE CLIST MEMBER --- //SYSPRINT DD DUMMY //SYSIN DD DUMMY //SYSUT2 DD DISP=(,PASS),DSN=&&CLIST(ISPCMDS),UNIT=SYSDA, // SPACE=(TRK,(1,,1)),DCB=(RECFM=FB,LRECL=80) //* //ISPBATCH EXEC PGM=IKJEFT01,DYNAMNBR=256 //ISPLOG DD SYSOUT=*,DCB=(RECFM=VBA,LRECL=125,BLKSIZE=0) //ISPLIST DD SYSOUT=*,DCB=(RECFM=FBA,LRECL=121,BLKSIZE=0) //SYSPROC DD DISP=(OLD,DELETE),DSN=&&CLIST //ISPPROF DD DISP=(,PASS),UNIT=SYSDA, // SPACE=(CYL,(1,1,10)),DCB=(RECFM=FB,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 //SYSPRINT DD SYSOUT=* //SYSTSPRT DD SYSOUT=* //SYSTSIN DD * ISPSTART CMD(%ISPCMDS) /* EXECUTE CLIST MEMBER */ // PEND //*=================================================================== //STEP1 EXEC ISPBATCH //BLDCLIST.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 // // |
JCLは少し複雑ですが、ISPFのライブラリー・アクセス・サービスをバッチで実行する方法もあります。サンプルでは、メンバー毎にLMMOVEサービスを呼び出していますが、FROMMEM(MEMBER*)と指定すれば名前の先頭がMEMBERとなっているすべてのメンバーが移動の対象となります。
いろいろな方法がありますが、バッチ処理で自動化するような場合は、IEBCOPYで移動したいメンバーをコピーし、コピーの処理が正しく終了した場合のみ、元のデータセットからコピー済みメンバーを消す方法がわかりやすいでしょう。その方法なら、MVSだけでなくMSPでもVOS3でも共通に利用できます。