Public MVS Software - THE PDS PROGRAM - Part Two Sam Golob MVS Systems Programmer (845) 362-2287 This series of several installments deals with a tremendously useful productivity aid, the PDS Program Product, Version 8.0, which can be found on the CBT mods tape for MVS. Besides introducing revolutionary new extensions to IBM's ISPF/PDF, it has capabilities of pds member manipulation that truly boggle the mind. It is (literally) one hundred utilities, or more, rolled into one. If you spend some time studying how to install and use PDS, the payback is guaranteed! To my knowledge, this series of articles is the first attempt to create a systematic course of study to guide the reader through the many PDS SUBCOMMANDS. It is our aim to provide as full an overview as possible. To this end, we have grouped the PDS subcommands into FIVE SECTIONS, according to their functionality (see Figure 1). In our last article, we introduced some of the special concepts connected with using the PDS product. We talked about the "CURRENT DATASET", which is the dataset that PDS is pointing to and acting upon. Every time PDS executes, it has to point to a CURRENT DATASET. The PDS SUBCOMMANDS we talked about last time dealt mostly with finding (or changing) the attributes of the current dataset as a whole. Commands of that type were grouped together in SECTION ONE of our list of PDS subcommands. This month's installment will concentrate on SECTIONS TWO AND THREE of the PDS subcommands. We will spend most of the discussion on how to manipulate MEMBER GROUPS, and we will see how the ISPMODE enhancements to PDS increase this capability in our hands. In addition, we will try and complete our overview of the ISPMODE features, and to start opening your eyes to the productivity that they will buy you. PDS deals mainly with two types of datasets, partitioned and sequential. If the current dataset is partitioned, there is always a "CURRENT MEMBER GROUP", which is a subset of the members of the current dataset. This CURRENT MEMBER GROUP can contain ALL members of the pds, or it can be a PROPER SUBSET of members, or it can be a NULL subset. Much of the great strength of the PDS program lies in its ability to manipulate GROUPS OF PDS MEMBERS very delicately. The other half of this strength is the LARGE VARIETY OF FUNCTIONS that can easily be performed on ALL THE MEMBERS OF THE GROUP IN ONE OPERATION. We will discuss commands to select which members will comprise a member group at any given time. We will look at how PDS commands DEAL WITH GROUPS. And we will see how ISPMODE OPERATION OF PDS extends our power with groups very much and very exquisitely. To start, we'll have to review a few basic facts about PDS which were discussed last time. PDS is a TSO COMMAND PROCESSOR, and being such, it can operate directly from the READY prompt that TSO users are familiar with. You simply enter: PDS 'dataset.name' This will begin execution of PDS and point it to 'dataset.name' as the CURRENT DATASET. We talked about the details of how this works in the last issue. PDS can also operate interactively with ISPF/PDF. This mode of PDS operation is called ISPMODE. If ISPF is in the environment of the TSO session, ISPMODE can be entered using the "ISPMODE" or "ISPM" subcommand, even though PDS was originally entered in native TSO or "LINE MODE", without ISPF. When the ISPMODE subcommand is entered, the PDS program attempts to use all the datasets allocated for ISPF, and it invokes itself again as a dialog manager. PDS can also be entered in ISPMODE initially through ISPF menus, or directly from TSO READY through a generation option. To see how to set these up, please refer to the installation instructions included in the PDS package. What does ISPMODE operation of PDS look like? We have supplied a number of sample screens. SCREEN #1 ---------------------- ISPMODE SESSION DISPLAY ---------------- ROW 1 OF 6 COMMAND ===> SCROLL ===> CSR Enter an ISPF command, a PDS subcommand or a special control code: LA Lista 1 Suspend ISPF 9 Swap panels R Recall LV Listv 6 MEMLIST all F Find X Above/Below/All ML Memlist 7 Output log O Options * Memlist * - DSN=TST2SSG.SMP.CNTL,VOL=SER=TSO001 MEM= -------------------------------- PDS80 -- VERSION 8.0 DISP UNIT OPT RECFM LRECL BLKSIZE ALLOCTRK FREETRK SECONDARY FREEDIR SHR 3380 W FB 80 3120 3X 66 31 30 TRK 46 ENTER OPTION -- DSN=TST2SSG.SMP.CNTL,VOL=SER=TSO001 MEM= SCREEN #2 ------------------- MEMLIST Source Member List 1 ------------- ROW 1 OF 273 COMMAND ===> SCROLL ===> CSR Enter an ISPF command, a PDS subcommand or a special control code: 8 View log 1 Suspend ISPF 6 MEMLIST all F Find R Recall LA Lista 4 Sublist = 7 Output table L Locate SO Sort LV Listv 5 Check aliases 9 Swap panels O Options X Above/Below/All - DSN=TST2SSG.SMP.CNTL,VOL=SER=TSO001 MEM=(ACCEPCHK ------------------------ CMD NAME DATA VER.MOD CREATED LAST MODIFIED SIZE INIT ID ACCEPCHK 01.03 85/03/21 85/11/18 18:45 15 17 TST2SSG ACCEPCK2 01.00 86/09/02 86/09/02 15:46 21 21 TST2SSG ACCEPT 01.02 85/03/25 87/09/14 23:42 15 15 TST2SSG SCREEN #3 ------------------- MEMLIST Source Member List 2 ------------- ROW 1 OF 273 COMMAND ===> SCROLL ===> CSR Enter an ISPF command, a PDS subcommand or a special control code: 8 View log 1 Suspend ISPF 6 MEMLIST all F Find R Recall LA Lista 4 Sublist = 7 Output table L Locate SO Sort LV Listv 5 Check aliases 9 Swap panels O Options X Above/Below/All - DSN=TST2SSG.SMP.CNTL,VOL=SER=TSO001 MEM=(ACCEPCHK ----------------------- CMD NAME DATA ALIASOF TTR VER.MOD LAST MODIFIED SIZE ID ACCEPCHK 001310 01.03 85/11/18 18:45 15 TST2SSG ACCEPCK2 001701 01.00 86/09/02 15:46 21 TST2SSG ACCEPT 001E19 01.02 87/09/14 23:42 15 TST2SSG SCREEN #4 -------------------- MEMLIST Load Member List 1 ------------- ROW 32 OF 98 COMMAND ===> SCROLL ===> CSR Enter an ISPF command, a PDS subcommand or a special control code: 8 View log 1 Suspend ISPF 6 MEMLIST all F Find R Recall LA Lista 4 Sublist = 7 Output table L Locate SO Sort LV Listv 5 Check aliases 9 Swap panels O Options X Above/Below/All - DSN=TST2SSG.LOAD,VOL=SER=TSO001 MEM=($$PALIST --------------------------- CMD NAME DATA ALIASOF LEN/LKED -- ATTRIBUTES -- APF MODE MAIN IGC0022H 85/07/23 RENT REUS AC=1 IKJEFF53 85/06/06 RENT REUS INTTBIPO 86/06/13 SCREEN #5 -------------------- MEMLIST Load Member List 2 -------------- ROW 32 OF 98 COMMAND ===> SCROLL ===> CSR Enter an ISPF command, a PDS subcommand or a special control code: 8 View log 1 Suspend ISPF 6 MEMLIST all F Find R Recall LA Lista 4 Sublist = 7 Output table L Locate SO Sort LV Listv 5 Check aliases 9 Swap panels O Options X Above/Below/All - DSN=TST2SSG.LOAD,VOL=SER=TSO001 MEM=($$PALIST ---------------------------- CMD NAME DATA ALIASOF TTR MAIN MATCH LENGTH ENTRY SSI IGC0022H 000926 000448 000000 EFB00000 IKJEFF53 000820 000008 000000 INTTBIPO 007326 000368 000000 SCREEN #6 -------------------- MEMLIST Load Member List 3 -------------- ROW 32 OF 98 COMMAND ===> SCROLL ===> CSR Enter an ISPF command, a PDS subcommand or a special control code: 8 View log 1 Suspend ISPF 6 MEMLIST all F Find R Recall LA Lista 4 Sublist = 7 Output table L Locate SO Sort LV Listv 5 Check aliases 9 Swap panels O Options X Above/Below/All - DSN=TST2SSG.LOAD,VOL=SER=TSO001 MEM=($$PALIST ---------------------------- CMD NAME DATA ALIASOF LEN/LKED -- ATTRIBUTES -- APF MODE MAIN MATCH LENGTH TTR ENTRY SSI ---- -------- -------- -------- -------- ---- ---- ---- ---- ---- ---- -------- IGC0022H 85/07/23 RENT REUS AC=1 000448 000926 000000 EFB00000 ---- -------- -------- -------- -------- ---- ---- ---- ---- ---- ---- -------- IKJEFF53 85/06/06 RENT REUS 000008 000820 000000 ---- -------- -------- -------- -------- ---- ---- ---- ---- ---- ---- -------- SCREEN #7 ----------------------- LIST ALLOCATIONS --------------------- ROW 1 OF 46 COMMAND ===> SCROLL ===> CSR Enter an ISPF command or a special control code: LV Listv 7 Output table 9 Swap panels O Options ML Memlist 8 View log F Find X Above/Below/All ---------------------------------------------------------------------------- CMD DDNAME DATA TYPE O# VOLUME MEMBER ------ DATA SET NAME --------- STEPLIB 1 MVSRES IPO1.LINKLIB 1 TSO001 TST.TSO.CMDLIB 1 TSO001 TSP.TSO.CMDLIB SYSPRINT TERM 0 NULLFILE SYSTERM TERM 0 NULLFILE SYSIN TERM 0 NULLFILE SYSABEND JES 0 CLS= L JES2.TSU09137.SO000103 SYS00001 CTLG 1 MVSRES TS.ICFUCAT.VMVSRES ISPPROF PO 1 TSO001 TST2SSG.ISPF.ISPPROF SCREEN #8 ------------------------ LIST VOLUMES ------------------------- ROW 1 OF 70 COMMAND ===> SCROLL ===> CSR Enter an ISPF command or a special control code: LA Lista 7 Output table 9 Swap panels O Options ML Memlist 8 View log F Find S Sort X Above/Below/All ------------------------------------------------------------------------------- CMD VOLUME DATA DEV DEV MOUNT USE ---- TOTAL FREE --- LARGEST STATUS ---- NAME -------- ADR TYPE ATTR CNT CYLS TRKS NUM DSCB CYLS TRKS --INDC-- MVSARS 9BA 3380 PRIV 0 31 122 15 428 17 18 SI MVSRES 9A9 3380 PRIV 113 33 281 34 429 8 13 A SI RESCUE 9A7 3380 PRIV 0 0 131 18 492 0 14 SIV TSO001 9B7 3380 STOR 49 81 745 131 633 8 2 A SI VSAM01 9A4 3380 PRIV 74 0 2 1 47 0 2 A S V WORK01 9AA 3380 PUB 1 745 22 6 574 480 0 A S SCREEN #9 ------------------------ SET MEMLIST DEFAULTS ------------------------------ OPTION ===> MEMLIST prompt ===> NO (Yes/No) LKED date for load ===> YES (Yes/No) Alias check ===> YES (Yes/No) Hierarchical panels ===> NO (Yes/No) Function prompt ===> YES (Yes/No) Save in profile ===> YES (Yes/No) Notes: 1. MEMLIST prompt: etc. (There follows a brief explanation of each option. ) SCREEN #10 ------------------------- PDS Function Selection ---------------------------- OPTION ===> Choose one of the following options: Option Function -- Description -- ---- Status ----- 8 - View Log View session log Active ML - MEMLIST Member list Active LA - LISTA Allocation list Active LV - LISTV Volume list Inactive OR choose one of the following special functions: CAN ML - Cancel pending MEMLIST line commands CAN LA - Cancel pending LISTA line commands CAN LV - Cancel pending LISTV line commands SETLOG - Set log defaults SETML - Set MEMLIST defaults END - Terminate PDS QUIT - Terminate PDS Screen #1 is the introductory screen that is displayed when ISPMODE is first entered. All ISPMODE screens consist of two parts, a "TITLE" part and a "TABLE" or "LOG" part. The TITLE part, at the top of the screen, is composed of the fixed prompting information and the variable DSN line of information, with the CURRENT DATASET name, its VOLUME, and an indication of the DEFAULT MEMBER GROUP, to the right of the "MEM=" field. Below the TITLE part of the screen is the LOG or TABLE information which is scrollable, using the usual ISPF commands for scrolling a member list, plus a few that were added by the authors of PDS. Screen #1, which one sees immediately upon entering ISPMODE, has the same information in the LOG portion as if one entered a "DSN" command initially. The results of any new PDS commands entered from the "command line" appear consecutively in the ISPMODE log, and this log is positioned to view the last command that was just entered. This action thus approximates how PDS in line-mode appears to the TSO user, but the "VIEW LOG" has a complete record of the past actions that occurred. It can be SCROLLED and (with Option 7) OUTPUTTED to SYSOUT or a dataset, or previous commands in the log can be RECALLed with the "RECALL" OR "R" command. The capacity of the ISPMODE view log can be controlled using the "SETLOG" ISPMODE command. So we have glimpsed the "VIEW MODE" ISPMODE function. In PDS Version 8.0, there are three more ISPMODE functions: "MEMLIST", "LISTA", and "LISTV". These exist in parallel, that is, one can switch within ISPMODE from one function to another through special control codes from the "prompt" part of the screen. The four functions exist internally to the session as four separate ISPF tables which are maintained by the PDS program. PDS, at the 8.0 level, is cleverly constructed so that the user can dynamically keep track of these four sessions. How is this done? Enter the "SETML" command from an ISPMODE screen. There will appear a special screen, part of which is displayed as Screen #9. Answer YES to "Function prompt" and exit the screen with PF3. A new screen will appear; this is illustrated as Screen #10, the "FUNCTION PROMPT" screen. On that screen, the four ISPMODE functions in the session can be tracked. The user can go in to any one of the modes by entering an appropriate command. For convenience, one may want to skip this prompt screen during his everyday work. To do so, just enter the SETML command and answer NO to "Function prompt". An explanation of "HIERARCHICAL PANELS" is in order at this point, and then we'll go on to the other ISPMODE functions. The previous level of PDS, Version 7.3, did not have the four ISPMODE functions arranged in parallel, as does Version 8.0. The two functions LISTA and LISTV were add-ons from what existed in previous levels of the product. Also, in Version 7.3, the ISPF internal processing involved in managing the tables was different. The resulting structure was such, that one had to get into VIEW MODE first. Even if he entered a prompt to get into MEMLIST mode first, he would always go back into VIEW MODE before exiting from PDS altogether. The other two functions LISTA and LISTV could never be entered directly, but only from either VIEW MODE or MEMLIST mode. Thus the hierarchy. VIEW MODE always came first, then MEMLIST mode, then the other two, LISTA or LISTV. In Version 8.0, there is still the option of keeping this kind of relation between modes. Just answer YES in the SETML screen to the question about hierarchical panels. Now to MEMLIST. MEMLIST is what the name implies, a list of members of the current dataset, if it is partitioned. The list of members DOES NOT HAVE TO BE A COMPLETE LIST, as in ISPF (versions 2.2 and below). An important question is: "Which members are listed?" This will be dealt with later. For now, and for simplicity, lets assume that all the members are listed. First we want to know what MEMLIST will do for us. Look at Screen #2 and Screen #4. The first thing you'll probably notice is that MEMLIST displays as much useful information for a LOAD MODULE pds as for a SOURCE-TYPE pds. At a glance, in neat table form, one can look at groups of members and see what they're really like. It doesn't end there. The alternate screens #3 and #5 show even more stats for the same members. For load modules, the third alternate, Screen #6, shows the information from screens #4 and #5 TOGETHER, so one can glance at all the attributes of particular modules at once. Option "9" in MEMLIST screens toggles between these alternate displays. The added convenience of OUTPUTTING the entire MEMLIST log with option "7" is extremely attractive if one wants to see stats for entire libraries or subgroups of members. That isn't really the main purpose of MEMLIST. Although they are great, the statistics displays are very secondary when you look at MEMLIST as a whole. Its real clout is its ability to give UPWARDS OF 20 SEPARATE FUNCTIONS FROM THE SAME MENU, plus THE ABILITY TO CHANGE LIBRARIES VERY QUICKLY. ISPF/PDF doesn't offer that, even in the latest releases, although it's come a bit closer lately. In regular ISPF as shipped from IBM, if you want to edit a source member, you have to get into the "EDIT" option first. If you want to browse the same member, you have to GET OUT of the EDIT OPTION and GO INTO the "BROWSE" option. Then, more often then not, you have to choose the name of the member a second time. If you want to RENAME or DELETE the member, it's the same pain in the neck over again--you have to get out of BROWSE and go into UTILITIES option 3.1. Even the new Option 3.4 doesn't eliminate this hassle, although it saves some of the work involved. With PDS MEMLIST, ALL OF THIS AND MORE, IS DONE WITH THE SAME MEMBER LIST. Enter a "B" next to the member and you "browse" it. Enter "E" or "S", and you SPFEDIT it. Enter "REN" and you have the option to rename the member. Enter "DEL" or "SC" or "SCR" and you delete the member. There are fifteen-or-so other things one can do from a MEMLIST screen. Enter "O" next to a member name, and one gets a panel of OPTIONS available from there. Enter "O" from the command line, and there appears another panel of options for manipulating members and the dataset itself. We have to go on. LISTA or "LA", the third ISPMODE function, shows the datasets allocated to the TSO session, by DDNAME. "LISTA" is much better than IBM's LISTA TSO command. LISTA is not merely a list. One can DO things from the list. For example, to free a ddname allocation, type "FREE" or "F" in the command area next to the ddname. To change the "current dataset" for the PDS session to one of the other allocated datasets, merely enter "C" next to that dataset name on the LISTA screen. There is also an alternate screen to toggle into by entering "9". This shows additional info about the allocated datasets. LISTV or "LV", the fourth ISPMODE function, is a table of mounted disk volumes. One must enter an operand with the LV command. Enter LV followed by a partial name. A list appears with stats of mounted disk volumes whose names begin with those characters. The stats are very good (see Screen #8 in the illustrations). LISTV accepts generic volume names. One must add the keyword "GENERIC". Upon entering: LV SYSDA GENERIC, all mounted volumes in the SYSDA group are shown. The screen is set up so that upon pressing your "HELP" PFKEY (usually PF1) from the LISTV screen, you can get help on the possible options. If there is a TSO command with the name "VTOC" installed on your system, (see file 300 of the CBT tape) you get a vtoc list upon entering "VTOC" in the command slot next to the volume name. These facilities can come in handy. Remember that all the lists can be OUTPUTTED with option "7". (PDS 8.1 note: The "line command" facility for both LISTA and LISTV is greatly expanded in Version 8.1 of PDS.) This cursory discussion of the four ISPMODE functions will have to suffice for now. We turn our attention to the several concepts of MEMBER GROUPS that are connected with the PDS product. Member subgroups account for much of the heart and power of PDS. In its old form, the attractiveness of PDS was in the variety of its utility functions operating on members. This has grown to bulldozer power in the current product, when all these abilities can be thrown on tens, or hundreds of members at once. When one sees the delicacy with which the groups can be handled, increased, decreased, trimmed, adjusted--the possibilities truly confound the imagination. Basic member manipulation rests on two subcommands, "MEMBERS" (or "MEM"), and "SUBLIST" (or "SUBL"). These are the rock-bottom elementary commands that define subgroups of pds members. There is a basic difference between them. Once one understands this difference, it is easy to follow the workings of the other subcommands that affect the default, or current MEMBER GROUP. Yes, yes. Not only do we have a CURRENT DATASET, we also have a CURRENT MEMBER GROUP, which stays with us in our session as long as the current dataset is partitioned. If we change the current dataset with a CHANGE command, as a rule the CURRENT MEMBER GROUP REMAINS THE SAME. The current member group changes only if a SUBCOMMAND that changes it is issued, not if the current dataset is changed. Now we are in a position to understand why MEMBERS is different from SUBLIST. Groups are initially defined by means of RULES. We can either use RANGES of member names, such as "A:C", all members beginning with letters A thru C. Or we can use PATTERNS of member names, such as "ABC/", which specifies that all members containing the string "ABC" anywhere in the member name, will qualify. We can use combinations of the above rules to define a subgroup. See the special PDS HELP entry called HELP GROUP, for details. If one used the MEMBERS command to initially define the subgroup, the DEFINITION STAYS AS A RULE. For example, if one entered "MEMBERS A:C", the default member group is characterized as "A:C", NOT as a LIST of members, but merely as A:C. Upon looking at the "MEM= " field of the PDS header display, one will see the RULE DEFINING THE GROUP displayed there if the MEMBERS command was used. Now if a CHANGE command is issued to change to another current dataset, the RULE still is displayed, but in this new dataset, a different LIST OF MEMBERS will qualify as satisfying the rule. All this is NOT true if "SUBLIST A:C" was the command first issued. In that case, the rules are immediately compared to the list of members in the current dataset, and a SUBGROUP LIST OF MEMBER NAMES is generated. THIS LIST OF NAMES, and not the original rule defining them, remains as the default member subgroup. The first NAME in the list, and NOT the defining rule, will now appear in the "MEM=( " field of the PDS header display, and an open-paren "(" will be included in the "MEM=" field. If the current dataset is now changed, the OLD LIST OF NAMES WILL REMAIN as the subgroup list, EVEN IF NO SUCH MEMBERS EXIST in the new current dataset. The default group now is the LIST, not the RULES. There it is in a nutshell. We have now learned how to set the member group that we want. But how do we specify a member group when issuing a PDS subcommand? The asterisk "*" is the member group designation character. Remember that PDS subcommands are issued in the format: SUBCOMMAND MEMBERS PARAMETERS where the "MEMBERS" field designates WHICH MEMBERS ARE OPERATED UPON. (This field is omitted if the current dataset is not partitioned.) The "members" field can be a range or a pattern, an individual member, a colon ":" for ALL MEMBERS, or an asterisk "*" for all the members in the CURRENT SUBGROUP. By using the asterisk to denote the current member group in a PDS subcommand, WE CAN PERFORM OPERATIONS ON ALL MEMBERS IN THE ENTIRE GROUP AT ONCE. This capability gives the PDS product much of its power. Now we'll discuss more commands which can create the current member group. These are "MEMLIST", "IF", and "FIND". The "MEMLIST" or "ML" subcommand operates in ISPMODE only, and causes the session to enter the MEMLIST function and display a member list. You may specify which members you want to display, by entering a range or pattern, or a colon, or an asterisk after the subcommand. The default is to display the members in the CURRENT MEMBER GROUP. Be it known that the LIST OF MEMBERS displayed by MEMLIST is stored by the PDS program in a table, known as the MEMLIST TABLE. This table is DIFFERENT from the table which stores the members in the current group, if the group is defined by a list. That table is known as the SUBLIST TABLE. When the MEMLIST subcommand is first invoked, the default is to set the memlist table EQUAL to the sublist table. You can always reset the memlist table equal to the sublist table by issuing the command: MEMLIST * RESET. When you issue another MEMLIST command after the first one, PDS acts to MERGE the NEW member list generated by the second MEMLIST command with the member list already in the memlist table. The MEMLIST TABLE keeps on growing larger, unless the RESET parameter is issued with an "ML" invocation. However, EVERY MEMLIST COMMAND INVOCATION RESETS THE SUBLIST TABLE (and consequently the current group) to contain ONLY those members from THAT MEMLIST COMMAND, wiping out what was there before. For instance, if you would say: "ML A:A" followed by "ML C:E", the MEMLIST TABLE would contain all members starting with the letters A, C, D, and E. The SUBLIST TABLE would contain ONLY the members starting with C, D, and E, as specified by the LAST MEMLIST COMMAND issued. However, we can only perform operations on all members of the current group if they are in the SUBLIST TABLE. Therefore we need some command to MAKE THE SUBLIST TABLE EQUAL TO THE MEMLIST TABLE. This command is: "SUBLIST = MEMLIST" which cannot be abbreviated. To make its use easier, so you don't have to type the whole thing, you can enter option "4" from an ISPMODE screen to get the same effect. In brief: "ML * RESET" makes the MEMLIST TABLE EQUAL TO THE CURRENT SUBLIST TABLE. "SUBLIST = MEMLIST" or ISPMODE option "4" makes the SUBLIST TABLE EQUAL TO THE CURRENT MEMLIST TABLE, so the group of members in the MEMLIST TABLE can be made into the current subgroup. Once the CURRENT SUBGROUP is made EQUAL TO THE MEMLIST, then ALL THE MEMBERS IN THE MEMLIST TABLE can be operated upon by PDS subcommands in one shot. All of this means that you can CREATE A CURRENT SUBGROUP from the MEMLIST members, using option "4". MEMLIST has one more trick up its sleeve. If you enter an "X" next to a member in a MEMLIST, the member gets EXCLUDED from the MEMLIST TABLE. By entering option "4", we then exclude that member individually from the CURRENT SUBGROUP, so it will NOT be acted upon when we perform a subsequent group operation. Thus, we have CONTROL OF INDIVIDUAL MEMBERS in designating the members of the current subgroup. This shows the power of MEMLIST in fine-tuning group PDS operations. The "IF" subcommand. This is another super power-packed tool. It is one of the unbelievably powerful things included in this incredible package. The "IF" subcommand allows selection of a member subgroup, followed by an action of another PDS subcommand, designated by a THEN keyword parameter. The format is: IF memgroup criterion THEN(subcommand) ELSE(subcommand). If we look at the PDS HELP entry for the IF subcommand, we can only gape in wonderment at the huge number of criteria we have. We can pick only those members created or changed most recently. Or we can select only those load modules linkedited within a certain time interval. The selection of possibilities is enormous and mind-boggling. The time and effort that this can save a person can only be appreciated by personal experience and practice with the "IF" subcommand. "FIND". This is a global command that acts on all members of a group. Its power is enormous. The "FIND" subcommand can be used on load module libraries as well as source-type libraries, to find all occurrences of any character string, in all the members. Just thinking about this a bit will blow your mind with possibilities. I use FIND to scan SYS1.LPALIB to figure out which modules can issue a certain system message. There are many far-out and hitherto undreamed of applications of this subcommand. The FIND subcommand also has the THEN-ELSE capability. Full format is similar to that of the IF subcommand. It is: FIND memgroup /string/ THEN(subcommand) ELSE(subcommand). The default action of the FIND command is to display all occurrences of the string in a beautiful display, member by member. FIND can be used for other purposes, however, such as to pick out all members from a large library which contain a certain string, or all load modules which contain a company's logo, for instance. This is accomplished by a command of the form: FIND : /string/ THEN(SUBLIST). The current member group is reset to include only those members containing the specified character string. Again, we have only begun to scratch the surface. A referral to the HELP member should start to set the creativity a-flowing. Finally, if you can FIND a string, then you can REPLACE the string also, or so you would think. In PDS you CAN do this. The REPLACE subcommand changes the found string for a different string, globally in the partitioned dataset, over the ENTIRE MEMBER GROUP that has been specified. It even works for load modules and other RECFM=U datasets, although for those, there is no capability of replacing a string with one of different length (an obvious safety measure for load modules). REPLACE allows for trial runs before doing the rewrites, to make sure it will accomplish the desired result. Full format of the REPLACE command is: REPLACE memgroup /from string/to string / |WRITE|. If "WRITE" or "W" is specified, the replace operation will actually be performed and the data blocks rewritten. The resulting display will mention this fact. If the WRITE keyword is omitted, then there will be a trial run and a display only. Mighty powerful stuff. In this installment, we have learned about the powerful PDS features of ISPMODE and member group control. In the next and final phase of this introduction to PDS, we will examine the many subcommands in the PDS product that are available to manipulate the dataset members themselves. * * * * * * * * * * * * * * FIGURE 1. PDS SUBCOMMANDS - Organized by Type - (for PDS version 8.0) SECTION ONE. General Commands concerning the CURRENT DATASET. OPTIONS - Display the list of subcommands HELP - HELP for PDS subcommands END - STOP THE PROGRAM DSNAME - Display allocation of the "CURRENT DATASET" USAGE - "CURRENT DATASET" STATISTICS (very comprehensive) CHANGE - Change the "CURRENT DATASET" RECALL - Display a PREVIOUS SUBCOMMAND DISPLAY - Display MEMBER NAMES of the "CURRENT PDS" by RANGE PATTERN - Display MEMBER NAMES matching a PATTERN TSO - Invoke a TSO COMMAND from within PDS COMPRESS - Compress the "CURRENT DATASET" in place VERIFY - VALIDITY CHECK the "CURRENT DATASET" FIXPDS - Modify DATA SET ATTRIBUTES (very very powerful) CONTROL - Set PROGRAM CONTROLS for general PDS execution SECTION TWO. ISPMODE Commands. ISPMODE - Put this PDS session into ISPMODE VIEW - View the ISPMODE log MEMLIST - ISPF DISPLAY TABLE of members (very versatile) LISTA - Display DATASET ALLOCATIONS for this TSO session LISTV - Display statistics for MOUNTED DISK VOLUMES (Each of these has options and subcommands of its own) SECTION THREE. MEMBER GROUP Manipulation Commands. MEMBERS - DISPLAY/DEFINE a MEMBER GROUP SUBLIST - Define a MEMBER LIST SUBGROUP MEMLIST - ISPF DISPLAY TABLE of "MEMLIST SUBSET" of members IF - Conditionally Execute a PDS SUBCOMMAND (powerful) FIND - LIST occurrences of a STRING for members in a GROUP REPLACE - CHANGE occurrences of a STRING for members in a GROUP ATTRIB - LIST/CHANGE ATTRIBUTES of all members in a GROUP VERIFY - VALIDITY CHECK a MEMBER GROUP COPY - COPY MEMBER GROUP to another Data Set OUTCOPY - Generate IEBCOPY MEMBER SELECT STATEMENTS for a GROUP SECTION FOUR. Individual MEMBER Manipulation Commands. EDIT - EDIT a member using ISPF EDIT BROWSE - BROWSE a member with ISPF BROWSE REVIEW - BROWSE a member using REVIEW (doesn't need ISPF) LIST - DISPLAY a member RENAME - RENAME a member DELETE - DELETE a member ATTRIB - LIST/CHANGE ATTRIBUTES of a member (Source or Load) ALIAS - ASSIGN AN ALIAS to a member (Source or Load) HISTORY - LIST HISTORY of a LOAD MODULE CSECTS and ZAPS MAP - MAP A LOAD MODULE COPY - COPY a member to another Data Set CONTROL - Set PROGRAM CONTROLS for display of MEMBERS COMPARE - COMPARE TWO MEMBERS from the Data Set FIND - LIST LINES containing a STRING REPLACE - CHANGE LINES containing A STRING REPRO - RECOPY A MEMBER in this Data Set RESTORE - RESURRECT a PREVIOUSLY DELETED member PRINTOFF - PRINT A HARDCOPY of a member SUBMIT - SUBMIT JCL VERIFY - VALIDITY CHECK a dataset member DIRENTRY - DUMP a DIRECTORY ENTRY of a member and DISPLAY FIELDS SECTION FIVE. Other Commands. "UNDOCUMENTED" OPTIONS - See member $$$UNDOC in install pds EXEC - Execute PDS subcommands from a CLIST ISPF - Invoke ISPF Primary Panel from PDS TSOEDIT - EDIT using TSO EDIT TSOLIST - LIST DATA with TSO LIST FSE - EDIT using FSE (vendor product or free product) DSPRINT - Print a HARDCOPY with DSPRINT (vendor product) VPSPRINT - Print a HARDCOPY with VPSPRINT (vendor product) "There is more. You have to explore."