世代管理されるメンバーが格納されたPDSEデータセット内のメンバー一覧を出力するREXX execです。指定したPDSEデータセット内の各メンバーについて、下記に示した内容のリストを出力します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
PDSE Version2 MEMBER List of Exist Generations, DSN=userid.PDSEVER2 MAXGENS=20 MEMBER 0----+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8----+----9----+----A ASMCACHE * ASMEX1B *** ASMEX1C ***** ASMEX2B **** ASMSIMD1 * ASMSIMD2 * ASMTEST1 * ASMTX ** ASMTXC ************ ASMTX2 ** ASMTX3 * ASMTX4 * FILEMGR * IEFBR14 * JCLEX2 * JCLEX4A * JCLEX4B ***** JCLEX6 ********************* JCLEX7 * JCL2 * JCL3 * REXXEX7 * |
メンバー名右側の*表示は、データセット内に保管されている相対世代番号を示したスケールです。目盛りは0からの1目盛りが相対世代番号1つに対応し、1、2、… 9、Aと続き、それぞれ相対世代番号-10、-20、-90、-100を示します。上記例のASMTXCは、最も古い相対世代番号-11迄世代別にメンバー内容が保管されています。JCLEX6はこのデータセットの上限の20世代分が保管されています。相対世代番号0だけのメンバーは、登録後まだ更新されていないことを示します。
REXX execの内容
REXXですがバッチ・ジョブで実行します。JCL上部のSETステートメントでARG1にPDSEデータセット名を指定してサブミットします。
メンバー毎だけではなく、各々のメンバーの各世代についてISPF VIEWERを内部で起動して世代が存在するかをテストしているので、メンバー数が多いと実行時間が掛かります。
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 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 |
// JOB (ACCT),'NAME',NOTIFY=&SYSUID //********************************************************************* // EXPORT SYMLIST=* // SET ARG1=target pdse dsname //********************************************************************* //* TSO BACTH SESSION --- DO REXX AND ISPF SERVICE --- //********************************************************************* //PDSUPDTE PROC //DOUPDTE EXEC PGM=IEBUPDTE,PARM=NEW --- GENERATE PDS MEMBER --- //SYSPRINT DD DUMMY //SYSUT2 DD DISP=(,PASS),DSN=&&TMPPDS,UNIT=SYSDA, // SPACE=(TRK,(1,,1)),DCB=(RECFM=FB,LRECL=80) // PEND //*-------------------------------------------------------------------- //ISPBATCH PROC //DOISPF 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=&&TMPPDS //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 *,SYMBOLS=JCLONLY ISPSTART CMD(%REXXEXEC &ARG1 &ARG2 &ARG3) /* EXECUTE COMMAND NAME */ // PEND //********************************************************************* //ADDMEMBR EXEC PDSUPDTE //SYSIN DD *,DLM='++',SYMBOLS=JCLONLY ./ ADD NAME=CANCEL ISREDIT MACRO ISREDIT CANCEL ISREDIT END ./ ADD NAME=REXXEXEC /* REXX */ /* ================================================================= Print The Member List with The Relative Generation number in PDSE2 Version2. (This REXX exec valid for z/OS v2r4 or later. If you have z/OS v2r3 or earlier, set the maximum generations number of target PDSE dataset instead of the system variable SYSMAXGENS.) ================================================================= */ ARG dsn /* GET DSNAME */ rc=LISTDSI("'"dsn"' DIRECTORY") /* GET MAXGENS */ IF rc /= 0 THEN exit(4) /* IF NO DATASET FOUND... */ maxgens = SYSMAXGENS /* SET MAX GENERATIONS */ ADDRESS ISPEXEC "CONTROL ERRORS RETURN" SAY "PDSE Version2 MEMBER List of Exist Generations, DSN="dsn, "MAXGENS="maxgens scale = "MEMBER 0----+----1----+----2----+----3----+----4----+----" scale = scale||"5----+----6----+----7----+----8----+----9----+----A" SAY scale /* SHOW SCALE LINE */ x=OUTTRAP('memlist.') ADDRESS TSO "LISTDS PDSEVER2 MEMBERS" /* BUILD MEMBER LIST */ DO i=7 TO memlist.0 /* TEST EXISTENCE FOR MEMBERS */ member = STRIP(memlist.i) /* OF EACH GENERATION */ genmark = '*' DO j=1 TO maxgens /* EXECUTE ISPF VIEW FUNCTION FOR EACH MEMBER */ ADDRESS ISPEXEC "VIEW DATASET('"dsn"("member")')", "MACRO(CANCEL) GEN(-"j")" /* ESCAPE FROM LOOP WHEN REACHED HIGHEST GENERATION */ IF RC > 0 THEN LEAVE genmark = insert('*',genmark,j,1) /* PLACE '*' FOR EXIST MEMBER */ END SAY SUBSTR(member,1,8) genmark /* SHOW MEMBER GENERATION SCALE */ END exit(0) ++ //********************************************************************* //DOREXX EXEC ISPBATCH // // |
REXXコード内のコメントにも記していますが、z/OS V2R3以前のバージョンでは、PDSEデータセットの最大世代数を求める為のLISTDSIのSYSMAXGENS変数がサポートされていないので、REXX内のmaxgens変数に直接最大世代数を設定して下さい。「maxgens = SYSMAXGENS」の次に「maxgens = 100」の行を追加します。(100はPDSEデータセットの最大世代数に合わせて下さい。スケールは最大100世代までにしてあるので100のままでもいいです)
サンプルのREXXコードでは、最大世代数の上限はチェックしていません。最大世代数が100を超えたデータセットで実際に保管された世代数も100を超えている場合は、目盛り行を超えて*記号が伸びていくような出力になると思いますが、SYSTSPRTのレコード長の範囲内に収まらなければI/Oエラーになるか切り捨てられるかも知れません。必要なら最大世代数のチェックを入れて下さい。(z/OSが許容する上限数は20億ですが現実には多くても数百程度迄に設定されていると思います)