Scaling API-first – The story of a global engineering organization
TSO Productivity
1. 1
TSO Productivity:
Making your (TSO) life easier
By Dan O'Dea
Last Update March 23, 2005
∆ΦΟ
2. 2
Table of Contents
Introduction and Goals 3 The ISPF Editor continued
Primary Commands continued
In The Beginning 4 External Data Commands 28
Starting ISPF. . . . . 4 Create and Replace. . 28
Copy and Move . . . . 29
Setting up ISPF. . . . . 5 Cut and Paste . . . . 30
ISPF settings. . . . . 5 Models. . . . . . . . 30
Log and List settings. 6 Line Commands 31
Stringing Commands . . 8 Insert, Delete, Replace,
The ISPF Main Menu . . 9 Copy, and Move. . . . 32
Column Shifting . . . . 33
Getting Around in ISPF . 10 Data Shifting . . . . . 34
The JUMP function. . . 10 Exclude and “Show”. . . 35
The Action Bars. . . . 11 Text Handling 36
ISPF Commands. . . . . 11 Case, Text Split. . . 36
Text Flow and Entry . 37
The ISPF Editor. . . . . 13 Miscellaneous (BNDS,
A Word on View . . . . 13 MASK, TABS, COLS) . . 38
Labels . . . . . . . . 14 MakeData (MD) . . . . 38
Line Numbers . . . . . 14 Edit Macros 39
Scrolling. . . . . . . 14 Coding and Example. . . 40
Command Abbreviation . 14 Edit Examples 41
The EDITSET command. . 15 JCL and Masking . . . . 41
Member Lists . . . . . 16 Highlighting. . . . . . 43
Member Selection . . . 17 Sort, Exclude, BNDS . . 44
Edit Profiles. . . . . 17 Edit/Member List Tricks 48
Profile Settings (MASK, Wild Cards. . . . . . . 48
BOUNDS, RECOVERY, Member Masks. . . . . . 49
SETUNDO, NULLS). . . 19 “Many Member” commands. 49
Tabs . . . . . . . . . 20 Copy and Paste. . . . . 49
Primary Commands . . . 21
Delete and Sort. . . 21 DSLIST function . . . . . . 50
Undo, Locate, Reset, Getting a list of files . 50
Flip, and Bounds . . 22 Primary Commands (Find,
Submit . . . . . . . 22 Locate, Member, Reset,
Profile, Compare, and Sort, SRCHFOR . . . . . 50
Exclude. . . . . . . 24 Line Commands . . . . . . 51
Find . . . . . . . . 26 Cheats 52
Change . . . . . . . 27 Using the “/” and “=” . 52
Hilite . . . . . . . 27 Cut and Paste . . . . . 52
The Final Word . . . . 53
3. 3
Introduction
This course is intended for an intermediate to advanced TSO/ISPF audience.
It assumes you know what TSO and ISPF are and how to get around in them. It
also assumes you have a basic understanding of the ISPF editor and either
CLISTs or the REXX language. You will learn about:
• Mod-4 and Mod-5 3278 logmodes.
• The ISPF SETTINGS set.
• The ISPF commands table.
• EDIT tools, including edit macros, picture strings, little-used but useful line
commands, etc.
• Tips and tricks to using ISPF option 3.4, the dataset list.
Goals of the Course
After this course you should be able to:
• Describe and log on using mod2, mod4, and mod5 3278 terminals.
• Start ISPF using different options.
• Understand ISPF settings.
• Set your function keys to use one or more commands.
• View ISPF commands tables and read them.
• Select multiple PDS members at once.
• Use bounds, masks, and tabs effectively.
• Use picture strings with FIND and CHANGE.
• Use highlighting effectively.
• Pass data to and from an edit session.
• Exclude and show lines.
• Handle text properly.
• Write a simple edit macro.
• Handle datasets from the DSLIST option.
• Use the slash and equals sign in DLIST.
Format Note
The basic font for this document is Arial 12. TSO commands are given in
Courier New 12. Screen prints are shown in Courier New 9, with comments in
Arial 10. Sidebars or extra comments are in Times New Roman 12.
4. 4
A Word About Logging On
Nearly everyone logs on using the default LTERM of a 3279 model 2. That
terminal type displays 24 lines of 80 bytes each. There are other terminal types;
two useful ones are 3278-4 and 3278-5.
The Model 4 terminal is less familiar to people. I find it useful because it
displays 43 lines instead of the usual 24. Seeing more lines in the dataset I’m
editing lets me do less scrolling, and I get to see more code when I’m trying to
create or modify REXX execs or JCL.
To log on using a Mod-4 terminal, on the stag screen type:
LOGON APPLID(<TSO ID>) LOGMODE(SNX32704)
The Model 5 terminal displays 24 lines of 132 characters, which is useful for
displaying sysouts or wide datasets. The logmode to use is SNX32705.
“In The Beginning”
We do just about all our work in ISPF. It seems a waste of keystrokes to log
on and then type ISPF. I start ISPF as part of my first TSO command. Here is a
brief example.
CLRSCRN
TERM NOBREAK /* for file transfers */
ISPF
ISPF starts at its main menu by default. That may be all right, but usually you
want to start doing something right away. Maybe, most of the time, you want to
go right to EDIT. You can start ISPF in any valid menu option. For example,
ISPF 3.4 will go first to option 3 (Utilities) of the main menu, then option 4 of
the Utilities menu (DSLIST), giving you control at the DSLIST panel.
There are other ways to start ISPF, but they deal with creating ISPF
commands or Dialog Manager programming. They are discussed later.
Dialog Manager is beyond the scope of this course. I have a course on
Dialog Manager if you’re interested in really improving your productivity.
5. 5
“All Right, I’m In, Now What?”: ISPF Settings
The first thing to do in ISPF is to make sure your settings are what you want.
The settings menu looks like this:
Log/List Function keys Colors Environ Workstation Identifier Help
-----------------------------------------------------------------------
ISPF Settings
Command ===>
More: +
Options Print Graphics
Enter "/" to select option Family printer type 2
Command line at bottom Device name . . . .
/ Panel display CUA mode Aspect ratio . . . 0
/ Long message in pop-up
Tab to action bar choices
Tab to point-and-shoot fields General
/ Restore TEST/TRACE options Input field pad . . N
Session Manager mode Command delimiter . ;
/ Jump from leader dots
Edit PRINTDS Command
Always show split line
Enable EURO sign
Terminal Characteristics
Screen format 2 1. Data 2. Std 3. Max 4. Part
Terminal Type 3 1. 3277 2. 3277A 3. 3278 4. 3278A
5. 3290A 6. 3278T 7. 3278CF 8. 3277KN
My preferences are above. Your settings may be different depending on how
you want to use ISPF. I chose to change the defaults for these reasons:
• Command line at bottom off, tab to action bar choices off: I prefer to get to
the command line with a single keystroke (the HOME key). If the
command line is at the bottom, or if the action bar is tab-able, there is no
way to do that. Even with the “tab to action bar” off, you can still use the
action bar by placing your cursor on it and hitting ENTER.
• Long message in pop-up lets ISPF display long messages at the bottom of
the screen rather than restricting it to the line immediately following the
command line. In the latter case the long message may not always be
displayed in its entirety. On a Mod2 terminal, though, the message box
may obscure too many lines (a minimum of three) for your taste.
• Always show split line off gives me another line on full-screen splits. The
split line always shows up on non-full screen splits.
One other thing to keep in mind from this screen is the “Command delimiter,”
the character used to separate ISPF commands. Remember what it is; we’ll
refer to it later.
6. 6
Settings 2: the Log and List Datasets
Let’s look at the settings action bar. The first choice is Log/List. ISPF
defaults to logging ISPF commands and errors from your session. There’s no
need to log your ISPF session unless you’re running into problems. Go into the
Log/List pull-down menu and choose option 1, Log Defaults. To turn off the ISPF
log, set the process option to 4 (just in case you need it) and change the primary
and secondary pages to 0. That prevents ISPF from allocating a log.
To log your ISPF session, go back into this settings menu and increase the
number of pages to 200 or so. Get out of ISPF, and then go back in and work as
you normally would.
When the log allocations are done, go back into the same menu and choose
option 2, List Defaults. Increase the number of pages to 200 and change the
process option to 3. The list dataset will not be created unless you need it, and
process option 3 will keep it when you leave ISPF.
Settings 3, Keys 24
The second choice on the action bar is the Function Keys. You can get to the
function keys via the KEYS command and the key lists via the KEYLIST
command. This is where you set your function keys. The main defaults are:
F1 . . . HELP
F2 . . . SPLIT
F3 . . . EXIT synonym for “END”
F4 . . . RETURN go back to main menu
F5 . . . RFIND
F6 . . . RCHANGE
F7 . . . BACKWARD synonym for “UP”
F8 . . . FORWARD synonym for “DOWN”
F9 . . . SWAP
F10 . . LEFT
F11 . . RIGHT
F12 . . CRETRIEV Conditional retrieve. If on command line, retrieve the previous
command. If not on the command line, place the cursor at the beginning of the first input field on
the panel.
The second set of function keys (13 – 24) is identical to the first.
Primary function key values are shown at the bottom of a panel by default. I
turn that off because it blocks part of the display. To turn off this display, use the
command PFSHOW OFF. To turn the key display back on, use PFSHOW.
7. 7
Function Key Settings continued
I’ve changed my function keys and set up some quirks with my keyboard.
Here are my primary function keys; my changes are in lower case.
F1 . . . HELP
F2 . . . SPLIT;
F3 . . . end
F4 . . . tso
F5 . . . RFIND
F6 . . . nop
F7 . . . up
F8 . . . down
F9 . . . SWAP
F10 . . LEFT
F11 . . RIGHT
F12 . . sub;end;tso ej;st
Look at F2. Remember the semicolon (;) as the command delimiter? The “;”
on the end of the SPLIT command lets me split the screen and do something.
For example, if I want to split from an edit session and get into DSLIST on the
other screen, I enter “3.4” on the command line and hit my F2 key.
The semicolon lets me run many commands from a single function key. Note
F12; this single key
• Submits the JCL I’m currently editing, then saves it;
• Puts me into EJES;
• Selects the STATUS command.
You can run a TSO command from the command line by prefixing the
command with the letters TSO. I have set my F4 key to TSO so I don’t have to
type those letters. That reduces my keystrokes by three.
I’ve set my keyboard so the F6 key is “Erase End of Line” (EOL). The EOL
key is “End” by default, but I use “End” to refer to the end of the field I’m on. I
don’t use the RCHANGE key, so that was a good candidate to use as EOL. To
make sure nothing else happens when using this key, I change the function to No
Operation (NOP).
8. 8
Function Key settings continued
Most people ignore their second set of function keys (keys 13 – 24). There’s
nothing wrong with that, but these keys can be set to less-used but still useful
commands or command strings. Here are a few examples:
• Set function key 19 to TOP and function key 20 to BOTTOM. Those
commands scroll to the top and bottom of any data list immediately, just
like UP MAX or DOWN MAX.
• Set a commonly-used edit macro.
• Set F24 to RETURN. That command gets you out of the application
you’re in back to the previous application.
• Set a key to any CLIST, REXX exec, or TSO command you often use,
prefixed by TSO (e. g. TSO LISTC);
• If you commonly create or edit IDCAMS commands, then submit them in
an IDCAMS job, you can set up a function key to END;SUB IDCAMS;TSO
EJ;ST. That string of commands will save and exit the command parm,
submit the JCL to run it, go into EJES, and bring up the STATUS on your
submitted job. If your parms are in a separate PDS from your JCL, simply
alter the member name to a fully qualified dataset name (e. g. TSO
SUBMIT ‘<yourid>.CNTL(IDCAMS)’).
In short, a function key can be set to anything you can type on an ISPF
command line.
A Bonus: Command Line Strings
The reverse is also true: you can type a string of commands on the command
line, separated by semicolons, and repeat it using the RETRIEVE command.
Here’s an example.
Say you need to create five copies, numbered 1 – 5, of a job to read five
partitions of a database. Assume the database name is PDB0.AD1010xD, where
“x” is 1 – 5. Once the first member (say, SCANAD01) is done and saved, on the
command line type:
s SCANAD02;copy SCANAD01;c AD10101D AD10102D all;end
Then hit RETRIEVE, change the 02s to be 03, 04, and 05 in succession, hitting
ENTER after each one. Now you have all five members created. This works as
long as you plan carefully.
9. 9
The ISPF Main Menu
The default setting of the main panel displays session information:
0 Settings Terminal and user parameters User ID . : @TSSQ04
1 View Display source data or listings Time. . . : 10:32
2 Edit Create or change source data Terminal. : 3278
3 Utilities Perform utility functions Screen. . : 1
4 Foreground Interactive language processing Language. : ENGLISH
5 Batch Submit job for language processing Appl ID . : DBA
6 Command Enter TSO or Workstation commands TSO logon : TMP
7 Dialog Test Perform dialog testing TSO prefix: @TSSQ04
8 LM Facility Library administrator functions System ID : SR1
9 IBM Products IBM program development products MVS acct. : **NONE**
10 SCLM SW Configuration Library Manager Release . : ISPF 5.2
There are other settings, set under the STATUS pull-down menu. I use the
Calendar option.
0 Settings Terminal and user parameters < Calendar >
1 View Display source data or listings October 2004
2 Edit Create or change source data Su Mo Tu We Th Fr Sa
3 Utilities Perform utility functions 1 2
4 Foreground Interactive language processing 3 4 5 6 7 8 9
5 Batch Submit job for language processing 10 11 12 13 14 15 16
6 Command Enter TSO or Workstation commands 17 18 19 20 21 22 23
7 Dialog Test Perform dialog testing 24 25 26 27 28 29 30
8 LM Facility Library administrator functions 31
9 IBM Products IBM program development products Time . . . . : 10:34
10 SCLM SW Configuration Library Manager Day of year. : 299
There are two advantages to this display. One is the ability to see Julian date
equivalents for Gregorian dates. Use the “<” and “>” point and shoot fields to
select a calendar month, then put the cursor on a day and hit ENTER. A pop-up
panel shows you the Julian date for that day.
Another thing you can do is to place your cursor on the “Day of year” field
and hit ENTER. A pop-up panel lets you enter any Julian date and convert it to a
Gregorian date. Hit F3 to exit the panel.
There are two STATUS settings. When the screen is split, the second
setting operates in the second screen. You must set this option twice, once in
each screen.
10. 10
Getting around in ISPF
There are two main ways to get around in ISPF: going through the menus
and using the JUMP function. There is an annoying problem with those
methods: you have to completely stop what you’re doing. There are two ways to
do something without losing your current task.
One way is to use the action bars displayed above most panels. For
example, on the EDIT main panel (in bold):
Menu RefList RefMode Utilities Workstation Help
-----------------------------------------------------------------------
Edit Entry Panel
Command ===>
ISPF Library:
Project . . . @TSSQ04
Group . . . . SN1 . . . . . . . . .
Type . . . . CNTL
Member . . . (Blank or pattern for member selection list)
Other Partitioned, Sequential or VSAM Data Set:
Data Set Name . . .
Volume Serial . . . (If not cataloged)
Workstation File:
File Name . . . . .
Options
Initial Macro . . . . Confirm Cancel/Move/Replace
Profile Name . . . . . Mixed Mode
Format Name . . . . . Edit on Workstation
Data Set Password . . Preserve VB record length
If “Tab To Action Bar Choices” is enabled, the HOME key takes you to the
left-most action bar item. If you’ve turned that off you can still use the action bar
by placing the cursor manually over your choice. When you hit ENTER a pull-
down menu is displayed.
The action bar eliminates the problem of the jump function by bringing you
back to your active task when the chosen task is complete. However, the action
bars do not list all possible choices, so you are limited to what you can do. As
with most things, fortunately, there are ways around this limit.
11. 11
Getting around in ISPF Redux:
The Commands Table
You can write your own ISPF commands to run existing or new functions. To
manage ISPF commands, use option 3.9 to create a commands table. The first
screen for the ISPF commands table interface looks like this:
.------------------------------- Commands --------------------------------.
| Command Table Utility |
| Command ===> |
| |
| Specifications Command search order |
| Application ID . . DBA Application table : DBA |
| Enter "/" to select option User table . . . . : |
| Show description field Site table . . . . : |
| System table . . . : ISP |
| |
| If no application ID is specified, the current application ID will be |
| used. The name of the command table to be processed is formed by |
| prefixing the application id to the string 'CMDS'. For example: |
| Application ID . . TST results in a command table name of 'TSTCMDS'. |
| |
| |
| |
'-------------------------------------------------------------------------'
The Application ID field tells ISPF the name of the commands table. You can
choose any two-, three-, or four-character application ID you want as long as it’s
not ISR or ISP. In the print above DBACMDS is the commands table for the
DBSS Toolbox.
This utility displays your active commands table without allowing changes. To
make changes you must run under a different application ID, make the changes,
and then restart ISPF with the correct applid.
12. 12
The Commands Table continued
Here are a few commands from the ISR/ISP command list display:
Verb T Action
BACKWARD 0 ALIAS UP BACKWARD = UP
BOTTOM 0 ALIAS DOWN MAX
FORWARD 0 ALIAS DOWN
TOP 0 ALIAS UP MAX
ACTIONS 0 ACTIONS
AUTOTYPE 0 SETVERB This is an existing command
CANCEL 3 CANCEL Provides the abbreviation CAN
CMDE 0 SELECT PGM(ISPCCMDE) Calls a dialog program
To invoke a commands table, ISPF must be started with that application ID.
Unfortunately, the ISPF or PDF commands do not allow you to easily specify the
application ID. You must write your own ISPF-equivalent command to do that
using the ISPSTART command. As an example, the command to start ISPF
using the DBA commands table is:
ISPSTART PANEL(ISR@PRIM) NEWAPPL(DBA)
ISR@PRIM is the primary menu panel for ISPF. The NEWAPPL argument must
be the same as the application ID you gave your commands table.
It’s up to you to determine whether coding this (and remembering a different
ISPF command) is better than working without a separate commands table.
Here is the DBA commands table. Note the execution calls are to the Dialog
Manager Select service:
Verb T Action
DLIST 0 SELECT PGM(ISRUDL) PARM(ISRUDLP)
PANVALET 4 SELECT PGM(PSPILINI) NOCHECK
PRS 0 SELECT CMD(PRB#PRS)
QW 0 SELECT CMD(QW)
DEBUG 0 SELECT CMD($DEBUG ON)
NODEBUG 0 SELECT CMD($DEBUG OFF)
TON 0 SELECT CMD($DEBUG ON)
TOFF 0 SELECT CMD($DEBUG OFF)
BM 0 SELECT CMD(BOOKMGR)
DBTOOLS 3 SELECT PANEL(DO$TOOLS)
AFMON 3 SELECT CMD(AFMON)
FAMVS 0 SELECT CMD(FAMENU)
FAIMS 0 SELECT CMD(FIMENU)
SUPPORT 0 SELECT CMD(SUPPORT)
EJ 0 SELECT PGM(EJ) PARM(&EJTRAIL) NEWAPPL(EJES) NOCHECK
If you’d like to implement this concept I’d be happy to help.
13. 13
Getting the Most from the ISPF Editor
Whether we realize it or not, the majority of our work is done in the ISPF
editor. The editor is a very powerful tool, with many features we can use with a
minimum of training.
But First, a Word on View
View lets you use the editor commands on a file without the risk of
accidentally changing it. Almost everything said about Edit applies to View.
Edit and Line Labels
The numbers on the left of any edit session are not true line numbers; they
are line labels. This is where line commands go. Although they are renumbered
when you renumber your data, they are valid only in a given edit session.
Line labels are used for messages as well as marking locations. Some
examples of messages are =NOTE=, ==CHG> (the line has one or more
changes on it), or dashes (one or more excluded lines). Three labels are defined
but are not displayed: .ZFIRST, .ZLAST, and .ZCSR (for first, last, and
cursor’s line). First and last can be abbreviated as .ZF and .ZL respectively.
You can create your own labels. Just start the label line with a period and
type a name for that line. For example, in bold below:
File Edit Edit_Settings Menu Utilities Compilers Test Help
-------------------------------------------------------------------------------
EDIT @TSSQ04.SN1.EXEC(DFOICF) - 01.03 Columns 00001 00072
Command ===> Scroll ===> CSR
****** ***************************** Top of Data ******************************
000001 /* REXX DFO's copy of ICF to preserve my own allocations. */
000002 /* */
000003 /* Original code in 'TSOPROC.CLIST(ICF)'. */
000004 /*--------------------------------------------------------------------*/
.HERE "PROF MSGID" Label “HERE”
000006 CVT = C2X(STORAGE(10,4))
000007 CVT_154 = D2X(X2D(CVT) + X2D(154))
000008 CVT_M20 = D2X(X2D(CVT_154,8))
000009 SID = STRIP(STORAGE(CVT_154,8))
.THERE PID = SUBSTR(SID,2,1) Label “THERE”
Labels are useful to set ranges for primary commands or to quickly get to one
or more areas in your dataset. This topic is discussed further under the primary
commands section.
14. 14
Data Line Numbers
Data line numbers are optional. If you want data line numbers, you must use
the NUMBER ON command. Numbers are often used in COBOL, Assembler, or
JCL. Respectively, NUMBER ON COB or NUMBER ON STD sets the proper
numbers. To automatically maintain line numbers, use the AUTONUM command.
Scrolling
The scrolling amount is displayed in the upper right of the session. I’ve found
it useful to set this to CSR, or cursor. That lets me decide how much to scroll.
You can always override the scroll amount by typing the amount on the
command line and hitting the scroll key, or by typing the scroll command followed
by the amount. For example, to scroll down five lines:
Command ===> down 5
Command ===> 5 followed by the F8 key.
Scrolling obeys BOUNDS (see below). If the scroll amount exceeds the
BOUNDS limit, scrolling stops at the bound. To scroll past the bound hit the
same scroll key again. The upper limit to scrolling (except MAX) is 9,999 lines or
columns.
Command Abbreviations
Almost all primary commands can be abbreviated. The abbreviation is usually
the shortest number of characters used to exclusively identify the command. For
example, two commands begin with “RE”: RESET and RENUM. Specifying RE
as your command will result in an error. However, you can use RES and REN
respectively instead of typing the command name completely.
The abbreviation for some commands is not the first three characters. An
example is C or CHG for the CHANGE command. Some commands use both;
for example, EX and X are both valid abbreviations for the EXCLUDE command.
15. 15
The EDITSET command
Some edit parameters can be set using the EDITSET (EDSET) command.
The command displays a pop-up menu to set up your edit session defaults.
.-----------------------------------------------------------------------------.
| Edit and View Settings |
| Command ===> |
| More: + |
| Settings for current and future Edit and View sessions: |
| |
| User session initial macro . . . . . . . . . . . . . . DFOIMAC |
| Maximum initial storage allowed for Edit and View . . 0 |
| Target line for Find/Change/Exclude string . . . . . . 1 |
| Enter "/" to select option |
| Always position Find/Change/Exclude string to target line |
| / Remove action bars in ISPF edit and view panels |
| |
| CUT default . . 2 1. Append PASTE default . . 2 1. Delete |
| 2. Replace 2. Keep |
| |
| Settings for future sessions. Select Apply Setting Immediately for the |
| setting to affect the current session as well. |
| |
| Enter "/" to select option |
| Confirm Cancel/Move/Replace Apply Setting Immediately |
| Preserve VB record length Apply Setting Immediately |
| |
'-----------------------------------------------------------------------------'
To give me more room in my edit sessions I check the “Remove action
bars…” field. Action bars remain on the main edit panel and member lists but do
not appear when I’m editing data.
I also change the target line for find/change to be 1 (the first displayed line).
That’s a personal preference, not a suggestion.
16. 16
Member Selection
The “%” and “*” characters represent a single character and many characters
respectively. This can be done anywhere you can specify a member name.
Keep in mind, using a single asterisk in place of a member name or mask is
considered the entire member list. Some examples:
• %%ABC selects all 5-letter member names ending in ABC;
• ABC* selects all members beginning with ABC;
• A*B*C selects all members beginning with A, ending in C, and having a B
somewhere between the first and last characters.
Additional Member List Commands
REFRESH resets the member list to what’s currently there. RESET clears the
line command and prompt fields.
SAVE prints the member list to the LIST dataset or a dataset named on the
SAVE command. For example, SAVE BASE creates a dataset called
<yourid>.BASE.MEMBERS.
SELECT can be used as a line or primary command. Where it is appropriate
(e. g. resetting statistics, copying), you can use the mask characters to select a
group of members (e. g. S ABC*).
SORT can sort the member list on any of these fields:
PDSes with formatted records: PDSes with unformatted records:
Field Sort Sequence Field Sort Sequence
---------------------------- -----------------------------
NAME Ascending NAME Ascending
LIB Ascending LIB Ascending
VV Ascending SIZE Descending
MM Ascending TTR Ascending
CREATED|CRE Descending ALIAS-OF|ALIAS Descending
CHANGED|CHA Descending AC Ascending
SIZE Descending ATTRIBUTES|ATTR Descending
INIT Descending AM Descending
MOD Descending RM Descending
ID Ascending SSI Ascending
This suggests a couple of little tricks. To edit the most recently changed
member, do SORT CHANGED before looking for the member. To see all
members edited by a person, type SORT ID.
17. 17
You can also sort on these fields by placing a cursor on the column header
and hitting ENTER.
18. 18
“Make Sure You Get My Best Side:” Edit Profiles
When you edit a dataset, the editor wants to know how to handle the data. It
also has many features to help you code JCL and programs. ISPF stores this
information in edit profiles.
ISPF uses a profile based on 1) the dataset type and 2) the LRECL of the file.
Dataset type is based on the last qualifier of the dataset name. You can have a
profile called DATA (Fixed 80), another called DATA (Fixed 133), and so on.
ISPF limits you to 25 profile types by default; installation defaults can be different.
When a profile beyond the limit is needed, the least recently used profile is dropped from
the list to make room for the new one. If you edit many different file type/LRECL
combinations, it is possible to lose one and have to “set it up” again.
Some useful profile options are:
RECOVERY Recover if edit session breaks, plus allows UNDO; default is OFF
NULLS NULLS ON allows easy insertion of characters; default is OFF
TABS Logical, hardware or software tabs are available; default is OFF
STATS Keeps statistics for PDS members
SETUNDO Are UNDO capabilities on?
HILITE Alters colors of specific characters or words
BOUNDS and MASK settings are also stored in the profile. MASKs can be
used to preset data on inserted lines. BOUNDS defines limits for the following
primary commands: FIND, CHANGE, EXCLUDE and SORT. Bounds also affect
the operation of the text line, data shifting, and scrolling commands.
The default lines for MASK and TAB lines are all blanks. The default bounds
are the first and last bytes of the dataset record length, minus numbers if it
applies. For example, a DATA LRECL of 80 sets the right bound to 80; a JCL
member with numbers sets the right bound to 72.
19. 19
Edit Profiles continued
The PROFILE command displays the current profile. It can also lock the
profile from further changes (PROFILE LOCK). The profile is displayed as a
series of =>PROF lines, which can be removed using the D/DD line commands or
the RESET primary command.
MASK: when turned on, causes a mask to be presented on every inserted
line. For example, setting the MASK in a CNTL PDS as “//” begins each line with
the slashes. If you don’t want the mask on a line, it can be overtyped.
BOUNDS: the BOUNDS primary or line command sets limits for scrolling,
text, and many other commands. The primary command BOUNDS with no
arguments resets them to the default.
RECOVERY: when turned on, ISPF keeps track of your edit session. You
can then recover your changes if your edit session crashes. Recovery is
automatic, but you have a choice of deferring or skipping the recovery.
RECOVERY also allows use of the UNDO edit command. UNDO works the
same way as the undo you find in Microsoft products such as Word or Excel. It
backs out all changes made since the previous ENTER or edit command.
To turn on edit recovery, type RECOVERY ON. This is recommended.
SETUNDO: when turned on, the edit session can use the UNDO command
without turning RECOVERY on. The command is either SETUNDO STG (do the
undo on the in-storage copy) or SETUNDO REC (do the undo in the recovery
copy). There are two advantages to SETUNDO STG:
1. It’s faster;
2. It does not turn recovery on.
NULLS: by default, blanks on the end of a line are considered valid
characters (spaces). With NULLS OFF, if you try to insert characters on a line,
the insertion is not allowed. You must delete characters or erase to end-of-line
before inserting any characters. I set NULLS ON so I don’t have to constantly
delete or erase characters.
20. 20
Edit: Using Tabs
With TABS ON, the editor can determine where to put the cursor. You can let
the editor decide where to put the cursor, or use the TAB keys on your keyboard
to position the cursor. Because the tab line is used for all tabs, it may contain
asterisks, dashes, or underscores. All tabs are set using the TABS line
command.
• Software tabs are set by typing dashes or underscores on the TABS line
over the areas you want to tab to. For example, this sets three tab areas:
TABS ---------- ------- --------
Software tabbing does not provide tab locations, therefore the TAB key
does not work with these tabs. The editor uses these tabs to position the
cursor in the general area it needs to be in.
• Hardware tabs are accessed using the keyboard’s TAB key. The edit
screen has two hardware tabs set: one at the line labels and one at the
first byte of the data line. You can set more hardware tabs by placing an
asterisk on the tab line just before you want your field to start. The editor
will not let you type on top of a hardware tab. For example, this sets three
tabs at positions 10, 16, and 36:
=COLS> ----+----1----+----2----+----3----+----4----+---
TABS * * *
To turn off hardware (or logical) tabs, type TABS OFF (clears all tabs) or
space out the asterisk(s) on the TABS line.
• Logical tabs are represented by a character, e. g. “TAB ¬”. To set data
areas as 1-9, 10-15, 16-35, and 36-72, set up your TABS line as:
=COLS> ----+----1----+----2----+----3----+----4----+---
=TABS> - * * *
When you enter lines like this:
000100 ¬la¬0,0¬clear counter register
000200 *¬¬¬to initial value
the result is:
=COLS> ----+----1----+----2----+----3----+----4----+---
000100 LA 0,0 CLEAR COUNTER REGISTER
000200 * TO INITIAL VALUE
21. 21
Edit Primary Commands
In no particular order, here are some useful commands you enter on the
command line. Note:
• Primary command operands are separated by commas or spaces.
• Trailing blanks are treated as nulls (you can’t use the cursor keys to make
spaces between operands).
• If an error occurs, the command remains on the command line.
• To force the command to remain on the command line, prefix it with an
ampersand (&).
DELETE deletes selected lines. Lines can be selected by exclusion, non-
exclusion, or by labels. Here are two examples:
DELETE ALL X deletes all excluded lines;
DELETE ALL .a .b deletes all lines between label A and label B,
inclusive.
SORT sorts data, observing bounds. The entire record is subject to sorting
unless bounds are set. If bounds are on, only the data within the bounds is
sorted and moved; other data is not moved. This is a way to sort columned data
separately.
Sort lets you sort fields in either ascending or descending order. The
maximum number of sort fields is five. When using multiple fields, both start and
end columns must be provided. Default is ascending sort. If one field specifies
ascending or descending, all fields must specify it. Here are a few examples:
SORT 10 sorts from column 10 to the right bound;
SORT 1 8 sorts based on the data within columns 1 through 8 inclusive;
SORT 1 15 X sorts all excluded lines based on the data in columns 1
through 15;
SORT 1 15 A 20 20 D sorts all lines based on two fields, the first field
in ascending order and the second in descending order. Note the second field is
a single byte.
EDIT calls the editor recursively. If you are editing a member and need to
briefly edit another member, and then return to your original member, typing
EDIT <member> on the command line does that. BROWSE and VIEW are similar
commands for browsing and viewing members respectively.
22. 22
More Edit Primary Commands
UNDO undoes all changes made since the previous ENTER or function key
was pressed. You can continue to undo changes until all changes have been
reversed. However, you cannot undo initial macro changes. UNDO is available
only if RECOVERY or SETUNDO is on.
LOCATE finds a line label. The label can be the “line number”, any special
label (e. g. =NOTE=, ==ERR>), your own label, or a pending line command.
Here are a few examples:
• LOCATE ERR FIRST locates the first error line;
• LOC CHG NEXT locates the next changed line;
• L .HERE locates the label “.HERE”
• L 450 locates line label 000450;
• L SPECIAL locates the next special line (e. g. COLS, MASK, etc.);
• L LABEL PREV locates the previous label.
RESET clears all line commands, reshows excluded lines, deletes special
lines, clears all line flags, and turns off the last FIND highlight. RESET with no
operands cleans up everything except line labels. Operands can be provided to
specify exactly what to reset:
label remove line labels
command (CMD) remove pending line commands
error remove ERROR notes
change (CHG) remove CHANGED notes
excluded (X) redisplays excluded lines
special Deletes all special lines (=PROF>, =BNDS>, =TABS>,
==MSG>, =NOTE=, =MASK>, =COLS>, and ======)
find reset FIND highlighting
FLIP swaps excluded and included lines.
BOUNDS with no operands sets boundaries to the default. You can set left,
right, or both boundaries. Both left and right bounds must be supplied; an
asterisk is used as the placeholder. To set the right bound to 60 you’d type
BOUNDS * 60; to set the left bound to 10, type BOUNDS 10 *.
23. 23
Edit Primary Command: Submit
SUBMIT passes the data to the TSO SUBMIT command. You can submit all
the JCL or just that within a range. If the LRECL is greater than 80 bytes, each
record is truncated to 80 bytes. If the LRECL is less than 80 bytes, it is padded
with blanks up to 80 bytes.
The editor submits all job streams in a single member. Job cards separate
job streams; the null statement (“//”) is not required. If you have members set up
like this and you want to submit only one of the job streams, you can mark the
job stream with labels (e. g. .HERE and .THERE) and then type SUB
.HERE .THERE to submit only that JCL.
Command ===> sub .here .there Scroll ===> CSR
****** ***************************** Top of Data ******************************
000001 //SPDO001T JOB SP218ZZDFO9999A044,'ODEA 77184',USER=@TSSQ04,
000002 // MSGLEVEL=1,MSGCLASS=H,PRTY=4,NOTIFY=@TSSQ04
000003 //*FORMAT PR,DDNAME=,DEST=TMNODE1.RM005
000004 //*MAIN CLASS=TSS04
000005 //**
000006 //STEP01 EXEC PGM=IKJEFT01,DYNAMNBR=90
000007 //**********************************************************************
000008 //* RUN TSO AND DO WHAT IT SAYS.
000009 //**********************************************************************
000010 //SYSTSIN DD *
000011 LISTC LEVEL(@TSSQ04) ALL
000012 //SYSTSPRT DD SYSOUT=*
000013 //
.here //SPDO002T JOB SP218ZZDFO9999A044,'ODEA 77184',USER=@TSSQ04,
000015 // MSGLEVEL=1,MSGCLASS=H,PRTY=4,NOTIFY=@TSSQ04
000016 //*FORMAT PR,DDNAME=,DEST=TMNODE1.RM005
000017 //*MAIN CLASS=TSS04
000018 //**
000019 //STEP01 EXEC PGM=IKJEFT01,DYNAMNBR=90
000020 //**********************************************************************
000021 //* RUN TSO AND DO WHAT IT SAYS.
000022 //**********************************************************************
000023 //SYSTSIN DD *
000024 LISTC LEVEL(@TSSQ03) ALL
.there //SYSTSPRT DD SYSOUT=*
****** **************************** Bottom of Data ****************************
24. 24
More Edit Primary Commands
PROFILE displays the current edit profile. To prevent permanent changes,
use PROFILE LOCK. PROFILE UNLOCK unlocks the profile to allow changes. If
you specify a number from 0 – 8 ISPF displays that many lines of the profile.
Even if a profile is locked, you can change it for the current session. Changes
are temporary and are dropped when you leave the session.
You can change which profile you’re using for the current dataset by naming it
with the command. For example, to use a text profile, type PROFILE TEXT. If
the profile does not exist, ISPF creates a new one for you. To change profiles
without displaying the new one, type PROFILE <name> 0.
COMPARE calls SuperC to compare the current edit session with another file.
Lines existing only in the current file are marked with labels. Lines existing only
in the other file are shown as information lines. You can add those lines to the
current file using the MAKEDATA command (see Edit Line Commands, MD).
COMPARE with no arguments presents the Edit Compare Settings panel.
Otherwise a DSN or member name is required for the file to be compared to. In
place of the DSN you can use SESSION or an asterisk to compare the current
edit session with the same dataset stored on disk. Other keywords are:
• EXCLUDE or X excludes matching lines, leaving only differences visible;
• SAVE saves the output to a dataset called ISPFEDIT.COMPARE.LIST;
• SYSIN does not free the SYSIN DD before invoking SuperC. That lets
you pass more parameters to SuperC.
EXCLUDE excludes from view any lines you choose. When used as a primary
command, EXCLUDE functions as a FIND command might (see below):
1. EXCLUDE ALL “C” 72 excludes all lines with a “C” in column 72;
2. EX WHILE ALL excludes all lines with the text WHILE on them;
3. X ALL excludes every line in the dataset.
A FIND command unexcludes any lines with the find string on it. For
example, in a JCL member, to show only those lines with program names on
them (X ALL;F PGM= ALL):
****** ***************************** Top of Data ******************************
- - - - - - - - - - - - - - - - - - - 11 Line(s) not Displayed
000012 //ACBA EXEC PGM=DFSRRC00,PARM='UPB,'
- - - - - - - - - - - - - - - - - - - 15 Line(s) not Displayed
000028 //ACBB EXEC PGM=DFSRRC00,PARM='UPB,'
- - - - - - - - - - - - - - - - - - - 15 Line(s) not Displayed
****** **************************** Bottom of Data ****************************
25. 25
The FIND Command
FIND is usually used with the operands NEXT (the default), PREVIOUS, ALL,
FIRST, or LAST. Special characters (e. g. the “*” or quotes) must be surrounded
by quotes. Sometimes the string may be a keyword to the FIND command, in
which case it needs to be quoted (for example, FIND ‘NEXT’ or FIND
‘FIRST’ ALL).
One FIND option many people are not familiar with is the picture string. Here
is a list of the types of picture strings and their explanation:
= any character . invalid characters
@ alphabetic characters - non-numeric characters
# numeric characters < lower case alphabetics
$ special characters > upper case alphabetics
¬ non-blank characters
Picture strings are called using the letter P followed by the quoted character. For
example, FIND P’.’.
Strings are located regardless of case. The following are the same:
1. F TEXT
2. FIND Text
3. f teXt
If you need to find the exact match, including case, use the letter C as a prefix
or suffix to the quoted string, e. g. F c’Text’.
Finds are restricted by columns or labels. For example, F JUNK .HERE
.THERE finds the first occurrence of JUNK beginning at the label .HERE. If
there is no such text between the labels, the message JUNK NOT FOUND is
displayed, even if that text exists outside the labels. See the example on the
next page.
If you get the “But I can see it, it’s right there!” feeling when doing a FIND,
check the bounds to make sure Edit is actually looking everywhere.
26. 26
The FIND Command continued
In this example a left boundary is set at column 12 and a right boundary is set
at column 60. The F DBD command with the default bounds would find the DBD
in DBDLIB on line 3. Since FIND observes boundaries, the first one found is the
DBD on line 4 (highlighted on the screen, in bold here).
Command ===> f DBD Scroll ===> CSR
****** ***************************** Top of Data ******************************
000001 /* REXX IMS Database DDname retriever */
=BNDS> < >
=COLS> ----+----1----+----2----+----3----+----4----+----5----+----6----+----7--
000002 /**************************************/
000003 Arg DBDLIB
000004 If DBDLIB = "" Then Do /* Assume DBD is gotten from IMS table */
000005 Address ISPEXEC "VGET (BDBDLIB) SHARED"
Other parameters FIND can use are CHARS, PREFIX, SUFFIX, and WORD.
Using those, and assuming this line:
DO DONT ADO ADOPT 'DO' $ADO (DONT) ADO-
FIND DO CHARS finds all these words;
FIND DO PREFIX finds only DONT and (DONT);
FIND DO SUFFIX finds only ADO, $ADO, and ADO-;
FIND DO WORD finds only DO and ‘DO’.
FIND operands may be entered in any order; for example, FIND ALL X DOG
and F DOG X ALL are the same.
27. 27
The CHANGE Command
The CHANGE command has the same operands, working the same way, as
the FIND command. Refer to the FIND command description for more
information on CHANGE.
All picture strings can be used as the FROM operand in a CHANGE
command. Only the ‘=’, ‘>’, or ‘<’ characters may be used in the TO operand.
This suggests the following: to change all lower-case characters in a dataset to
uppercase, use the command c p'<' p'>' (might be a good idea to set up a
function key for that…).
FROM strings are located regardless of case. The following are equivalent:
1. C TEXT DOC
2. C Text DOC
3. C teXt DOC
If you need to make an exact match, including case, you can use the letter C
as a prefix or suffix to the quoted string, e. g. c c’Text’ Doc all.
However, the TO operand will be passed as-is. The following are NOT the
same:
1. C TEXT DOC
2. C TEXT Doc
3. C TEXT doc
As with FIND, CHANGE operands may be entered in any order. There is only
one exception: the FROM and TO fields must remain in that order. In other
words the FROM operand must always be immediately followed by the TO
operand.
28. 28
Highlighting
Highlighting is an excellent way of checking your code (REXX, JCL, COBOL
etc.). HILITE is not a true command parser and sometimes gives strange results,
but it can be useful to identify what may be wrong with a given line of code.
HILITE ON turns on highlighting without logic checks (i. e. IF/THEN or
DO/END). HILITE LOGIC turns on logic highlighting only. You can specify
IFLOGIC or DOLOGIC to highlight only IF or DO logic.
HILITE AUTO lets ISPF determine, based on the file type, what keywords or
characters are highlighted. You can specify the language ISPF is to use (e. g.
HILITE COBOL). Valid HILITE languages are:
AUTO ASM C COBOL DTL IDL JCL PANEL
PASCAL PLI OTHER REXX BOOK SKEL DEFAULT
OTHER is similar to PLI but with only the most basic logic and command
structure. DEFAULT is used when HILITE AUTO is typed but the language
cannot be determined. CNTL is JCL and EXEC is REXX.
Other HILITE options are:
1. HILITE PAREN toggles the highlighting of mismatched parentheses;
2. HILITE FIND toggles the highlighting of the FIND command;
3. HILITE CURSOR toggles the highlighting of the current cursor word;
4. HILITE SEARCH highlights the first unmatched END, ELSE, }, or )
between the first line of the dataset and the line the cursor is on. This is
most useful when you’re on the last line of the dataset.
Entering HILITE with no operands displays a panel to set up the highlighting
coloring options.
29. 29
External Data Commands:
Create, Replace, Copy, Move, and Model
The external data commands are alike in two ways:
• they require line references (using C/CC, M/MM, B, A, etc.);
• they can be used with dataset names, members, or no operands.
If a member name is specified it must be in the PDS being edited. If no member
name or dataset name is provided, a screen is displayed to enter a source or
destination dataset.
Rather than scrolling around to find a place to put the data on a COPY or
MODEL, you can specify AFTER or BEFORE and a label. Labels can be used to
mark the data rather than using line commands.
The line commands are described in more detail in the next section. For
external data commands, you need to know only Copy (C/CC), Move (M/MM),
Before (B) or After (A).
Remember .ZF and .ZL? You can use those labels to copy or move the
entire contents of the dataset instead of entering C/M99999 on the first line label.
Create and Replace
CREATE makes a new member or dataset from within the current edit
session. These can be either copies using the C/CC line commands, moves
using the M/MM commands, or a range using labels. When lines are moved they
are deleted from the current dataset as if you’d deleted them manually.
If the destination member or dataset exists, CREATE fails. You can replace
the destination using the REPLACE command, which works exactly as the
CREATE command does.
To create a member in the current PDS, type the member name. To create a
new dataset, type the DSN after the CREATE command. Some examples:
• CREATE opens a screen to enter a member name or dataset to create;
• CREATE JUNK creates a member in the current PDS called JUNK;
• CREATE JUNK .ZF .ZL copies all lines into the member JUNK;
• CREATE MYJCL.EXTRACT creates a sequential file called
<yourid>.MYJCL.EXTRACT;
• CREATE JUNK .HERE .THERE creates the member JUNK using only the
data delimited by the two labels. The lines are not deleted.
30. 30
External Data Commands: Copy and Move
COPY inserts one or more lines from another dataset into the current edit
session. Use the A or B line commands, or the AFTER or BEFORE keywords
with a label, to tell Edit where to put the new lines.
You are not required to copy the entire dataset when using COPY. You can
choose which lines to copy from the source file. Simply type the start and end
line from within the source file as part of the copy command.
As with CREATE/REPLACE, if you don’t type a file name on the command,
you are shown a screen to enter the information the command needs. At the
bottom is the place to enter the line numbers. Be careful here. Since it will let
you use line numbers if the dataset has them (e. g. COBOL or JCL), you must
type an “R” in the “Number Type” field (for relative record numbers) or the copy
command may not do what you want.
If the MOVE command is used, once the data from the source file is copied in,
the source file or member is deleted.
Some examples of COPY/MOVE commands are below.
• COPY opens a screen to enter a member name or dataset to copy in;
• COPY JUNK copies in the member JUNK from the current PDS;
• MOVE JUNK copies the data from the member JUNK and deletes it;
• COPY MYJCL.EXTRACT AFTER .HERE locates the label .HERE and
copies the entire contents of MYJCL.EXTRACT following that line;
• MOVE MYJCL.EXTRACT 1 6 BEFORE .ZF copies lines 1 through 6 of
MYJCL.EXTRACT into the current edit session as the first six lines of the
file, then deletes MYJCL.EXTRACT.
31. 31
Cut and Paste
Edit provides CUT and PASTE commands similar to the PC cut and paste
commands. ISPF provides a default clipboard to hold data items cut. The syntax
for CUT is essentially the same as that for CREATE; the syntax for PASTE is
essentially the same as that for COPY.
The following operands apply to CUT:
• REPLACE replaces the contents of the clipboard;
• APPEND adds the cut text to the bottom of whatever is on the clipboard;
• DISPLAY shows what’s on the clipboard. Other operands are ignored.
The following operands apply to PASTE:
• DELETE clears the clipboard contents;
• KEEP keeps the clipboard as-is.
Use the EDITSET command to set up cut and paste.
A Word on Models
ISPF provides skeletal models of many different types of data. You can call in
a model of a dialog function (e. g. panel, skeleton, or table define), a program (e.
g. COBOL, REXX exec), or function call (e. g. VPUT).
Most people do not use models because it’s simpler to copy in a similar piece
of data and modify it to suit. The ISPF models are generic, and useful if you’ve
forgotten the syntax of some command.
To call in a model use the MODEL command. Provide the name of the model
(and its sub-name, if needed), and tell ISPF where to put it using either A or B
line commands or labels (a la COPY).
32. 32
Edit Line Commands
Edit line commands are entered on the line labels to the left of the data
section. Many line commands act with primary commands. Line commands fall
into seven families:
• Basic commands (e. g. insert);
• Move/Copy commands;
• Shifting commands (e. g. shift left);
• Exclude/Show commands;
• Text handling commands (e. g. text splitting);
• Data command (MD);
• Miscellaneous commands.
If you have created your own labels it’s OK to type line commands over them.
Your labels will not be removed by doing so; the primary command RESET
LABELS is needed to do that.
Line commands can take one of three forms:
1. a single character referring to a single line;
2. the command followed by a number refers to the number of lines, starting
at the line the command is on. For example, D3 deletes three lines;
3. the character entered twice indicates a block is to be handled. For
example, the CC command begins or ends a block copy operation.
As many line commands as desired can be entered as a single operation as
long as they don’t interfere with each other.
A Caveat
The editor uses a combination of blanks and cursor location to decide what
the number entered should be. Trailing blanks are ignored, as are any numbers
or letters following the cursor position in the label field. A common problem is to
type a number corresponding to the line number. Say, when shifting right 1 byte,
you type “))1” on line 001200, resulting in “))1200". If the cursor is moved
away before ENTER is hit it appears as if the line numbers were not changed.
The result ends up being the same as if “))” were hit, so the numbers are shifted
two bytes rather than one. To avoid that, type a blank after the 1, as “))1 00”.
33. 33
Basic Line Commands: I, D, and R
The “I” command inserts lines, the “D” command deletes lines, and the “R”
command repeats lines. These three commands provide the most basic edit
functions. The D and R commands may be blocked (DD and RR respectively).
All three commands may be followed by numbers to insert, delete or repeat that
many lines.
Copy and Move commands
The “C” command copies, and the “M” command moves, lines within an edit
session. Both may be blocked using CC and MM respectively. Both commands
require the use of the “A” and “B” line commands to determine where the copied
or moved lines are to be placed. A number can follow “A” or “B” commands to
indicate how many times the line or lines are to be copied or moved. For
example, this takes the first line and copies it twice after the fourth line
(commands in bold).
****** ***************************** Top of Data ******************************
C 0001 /* REXX COPYOVER coded December 2001 */
000002 /**********************************************************************/
000003 /* Do an ISPF EDIT-like copy with overlay when there are many */
A2 004 /* alternating lines of data. Saves wear and tear on the carpal */
Both the copy and move commands can be used to overlay other lines. The
“O” line command indicates where to overlay. “O” can also be blocked (OO). In
this example the third line will overlay the fourth as a move.
****** ***************************** Top of Data ******************************
000001 /* REXX COPYOVER coded December 2001 */
000002 /**********************************************************************/
m 0003 /* */
o 0004 Do an ISPF EDIT-like copy with overlay when there are many
000004 /* alternating lines of data. Saves wear and tear on the carpal */
As a block overlay, do this.
****** ***************************** Top of Data ******************************
000001 /* REXX COPYOVER coded December 2001 */
000002 /**********************************************************************/
m 0003 /* */
oo 004 Do an ISPF EDIT-like copy with overlay when there are many
oo 004 alternating lines of data. Saves wear and tear on the carpal
34. 34
Edit Line Commands: Shifting
Two kinds of data shifting are provided: column shifting and data shifting.
The column shift characters are parentheses; data shift characters are the angle
brackets (greater than or less than signs). Data shifting is used on indented
code.
Column Shifting
Column shifting moves data left or right the specified number of columns. The
default movement is two columns. A single parenthesis shifts a single line;
double parentheses shift a block of lines. Bounds are observed as left or right
limits.
=BNDS> < >
)5 300 DATA1 DATA2 DATA3 (' ') DATA4 DATA5
results in
=BNDS> < >
000300 DATA1 DATA2 DATA3 (' ') DATA4 DATA5
The text DATA1 has not moved since it’s out of the boundaries.
The editor does not consider loss of data an error on shifting. Here’s the
result of the shift if we shifted ten columns instead of five.
=BNDS> < >
000300 DATA1 DATA2 DATA3 (' ') DATA4
The text DATA5 has vanished since it’s been shifted beyond the LRECL limits.
This feature is useful to mass delete data. Set an appropriate left or right
bound, then shift characters in that direction using a number larger than the
number of characters.
35. 35
Data Shift Line Commands: Data Shifting
Data shifting moves data left or right the specified number of columns, but the
logic is different. Data shifting takes the first non-blank field after the first blank
and shifts it to a) accommodate the shift request and b) remove blanks from the
line.
The default movement is two columns. A single angle bracket moves a single
line; double angle brackets shift a block of lines. Bounds are observed as left or
right limits.
=BNDS> < >
>5 300 DATA1 DATA2 DATA3 (' ') DATA4 DATA5
results in
=BNDS> < >
000300 DATA1 DATA2 DATA3 (' ') DATA4 DATA5
DATA1 is not shifted because it is outside the current bounds. DATA2 is not
shifted because it starts in the left column. DATA3 is shifted five columns as
requested by >5. (' ') is shifted but the blanks inside are unchanged.
DATA5 does not require shifting and is left unchanged.
What happens when the requested movement is too large? In a column shift
data is lost. When data shifting data is not lost; shifting is changed to match that
requirement. If we shifted ten characters instead of five, this happens.
=BNDS> < >
=ERR=> DATA1 DATA2 DATA3 (' ') DATA4 DATA5
DATA3 is shifted as far as it can be shifted without:
• losing data,
• shifting data beyond the right bound,
• deleting single blanks,
• deleting blanks within apostrophes.
The line is marked with an error flag since shifting was not completed as
requested.
36. 36
Edit Line Commands: Exclude and Show Lines
We’ve talked about excluding lines using the EXCLUDE primary command,
and how the RESET command reshows excluded lines. The line commands X,
S, F, and L provide better control over this process.
The “X” command excludes one or more lines based on a number. For
example, X3 excludes the current line and the following two lines. You can
exclude a block of lines using “XX”.
The “F” and “L” commands show the first and last lines of the excluded block
respectively. While they cannot be blocked, you can provide a number. For
example, F5 unexcludes the first five lines of the excluded block. If the number
requested is larger than the number of excluded lines, all lines are unexcluded.
The “S” command shows the “most significant line(s)” of the excluded block.
Significance is determined by the amount of indenting. If all lines requested by
the “S” command are equally indented, the first lines are shown.
37. 37
Edit Line Commands: Text Handling
There are five text-handling commands: TS (text split), TF (text flow), TE (text
enter), LC (lower case), and UC (upper case).
Case
The two text line commands dealing with case are LC (lower case) and UC
(upper case). LC converts all characters on the line to lower case; UC converts
all characters on the line to upper case.
Text Split
Let’s say we have these two lines (the – is the cursor).
ts 400 This line will be split in two to allow insertions
000500 into the text. -
The result is:
000400 This line will be split in two
''''''
000410 to allow insertions
000500 into the text.
Each time a text split occurs, a blank insert line appears between the results of
the split. That allows more typing and less use of the TS line command. If you
want more than one line, add a number on the end of the TS command.
As with many commands, bounds are observed. That allows print column-
type processing, e. g. from this.
=BNDS> < >
ts 400 This is text data on the This is text data on the
000500 left side. - right side.
to this:
=BNDS> < >
000400 This is text data This is text data on the
'''''' -
000410 on the
000500 left side. right side.
38. 38
Edit Line Commands: Text Handling continued:
Text Flow
Text flow combines sentences into a more-or-less clean paragraph. The flow
is stopped at a blank line, or at indentations. Let’s say we have these three lines:
tf 400 These lines illustrate the text flow command, in
000500 which text is connected to other text
000600 on other lines to make paragraphs.
The result is:
000400 These lines illustrate the text flow command, in which text is
000500 connected to other text on other lines to make paragraphs.
Flowed words are connected by a single blank. Periods are followed by two
blanks. Extra blanks embedded in a line are not compressed out.
Using a number with TF indicates the width of the text being flowed. In the
above example, if we used TF40 instead of TF the result is:
000400 These lines illustrate the text flow
000500 command, in which text is connected to
000600 other text on other lines to make
000700 paragraphs.
Text Entry
The TE line command formats the edit session to emulate a word processor
to allow power typing. In this mode, line labels are not displayed and your typing
remains only in the editor’s data window. When you’ve finished typing, your new
text is flowed together as if you entered the TF command. Here’s an example:
te 400 following this line.
The text entry command formats the display so that entr
y of text can be made without regard to end of line consider
ations.
When ENTER is hit, the result is:
000400 following this line.
000410 The text entry command formats the display so that
000420 entry of text can be made without regard to end of line
000430 considerations.
39. 39
Miscellaneous Line Commands
Three line commands are used in conjunction with your profile and primary
commands: BNDS, MASK, and TABS. A fourth line command, COLS, is used
as a reference.
COLS displays a column reference.
000008 //SYSIN DD *
=COLS> ----+----1----+----2----+--
000009 LIST.DB DBD(DPH01MD6) DBDS
The COLS line cannot be overtyped. It can be removed using the RESET
primary or D line command.
BNDS displays a line describing the current boundaries. The left bound is
marked by a left angle bracket (<), the right bound by a right angle bracket (>).
000400 //STEP01 EXEC PGM=DSPURX00
=BNDS> < >
000500 //STEPLIB DD DSN=IMSVS.GRUP.IMS.RESLIB,DISP=SHR
Bounds are changed by changing the location of either or both bound
markers. The BNDS line can be removed using the RESET primary or D line
command. However, removing the BNDS line does not change the current
bounds. The primary command BOUNDS with no operands resets bounds to the
default value.
The TABS and MASK line commands were discussed under Edit Profiles.
Performance note: in a large dataset, deleting individual TABS, MASK, BNDS, or
COLS lines is more efficient than the RESET command because all lines are processed
under RESET.
The MakeData Line Command
The MakeData (MD) line command takes some temporary lines (e. g. COLS
or NOTE) and converts each line to a data line. MD works on a single line; MDD
or MDMD marks blocks of lines to convert to data. To mark the next “X” lines,
use MD followed by the number of lines to make into data. MD does not convert
the following lines to data: PROF, BNDS, TABS, MASK.
40. 40
Not Your Father’s Editor
The ISPF editor is a very powerful tool. In addition to having a great many
useful functions, you can build your own in the form of edit macros. This course
does not go into detail on how to write edit macros; the advanced ISPF courses
do that. I will show you a few macros and explain them as I go; you can then
write your own to string many commands together.
On the main edit panel, there are a number of fields besides the dataset name
entry fields. I never use them unless I absolutely have to for a particular task, but
I do want to point out the Initial Macro field.
It is possible to start your edit session with a string of commands. For
example, you may hate those warning messages that come up every time
(“WARNING: the UNDO command will not be available…”). Or, in a PDS, you
always turn STATS on. A macro written to start an edit session is called an initial
macro.
You can specify an initial macro on the EDIT screen, but there is another way.
Once you’ve got an edit macro built you can set it “forever” by:
1. ZUSERMAC = 'DFOIMAC' sets the initial edit macro variable to the name
of your initial edit macro (mine is DFOIMAC);
2. The ISPEXEC command 'VPUT ZUSERMAC PROFILE' puts the variable
into the profile pool so it is always executed.
To clear the edit macro use this ISPEXEC command: 'VERASE ZUSERMAC
PROFILE'. You must use VERASE because directly editing your ISPF profile
could cause problems.
Here is a copy of my initial edit macro, with comments:
/* REXX */
Address ISREDIT
"MACRO"
"PROFILE UNLOCK" Unlock the edit profile.
"BOUNDS" Reset bounds in case I forgot before.
"NULLS ON" Nulls on for freedom of inserting.
"HILITE AUTO" HILITE based on file type.
"RECOVERY ON" Allow recovery.
"AUTOSAVE ON" Save when F3 is pushed.
CURMBR = ""
"(CURMBR) = MEMBER" Is this a PDS member?
If CURMBR <> "" Then “STATS ON” If so, turn on STATS.
"RESET" Get rid of all messages.
Exit
41. 41
A Few Good Edit Macros
• ALLLC convert all characters to lower case.
• ALLUC convert all characters to upper case.
• CHKPARM copy the selected SYSIN parm as comments into the JCL.
• COMMOUT comment out a section of JCL.
• DELDUPS delete duplicate records from dataset.
• DSU browse, edit, view, delete, or allocate dataset the cursor is on.
• HIDE exclude only those lines containing a string.
• CENTER center text on a line or group of lines.
• PUTPARM copy the selected parm contents to a dataset.
• SEEK undo a HIDE command.
• XFS exclude all and find a single string, parms allowed.
Coding Simple Edit Macros
Coding a simple macro is, well, simple. There are three things to remember.
1. The first statement must be ISREDIT MACRO.
2. Arguments are listed in parenthesis after the MACRO statement. Initial
edit macros cannot have arguments.
3. You may have an END or CANCEL command in your macro as long as
it’s the last statement.
Item 3 is important. You can code an edit macro to make a set of changes to
a file, then exit, without ever seeing an edit session. Suppose you have JCL
created in a generic PDS with the job name coded as “??????T”. You can code
an initial edit macro to change that to your user ID, submit the job, and then
cancel out of it without saving the changes. Here’s an edit macro to do that.
/* REXX IEDMAC */
Address ISREDIT Pass all commands to the editor
"MACRO"
"CHANGE ??????" Sysvar(SYSUID) Change the job name
"SUBMIT" Submit the job
"CANCEL" Get out without saving
Exit
The call to invoke the macro looks like this:
ISPEXEC EDIT DATASET(dsn(member)) MACRO(IEDMAC)
The call must be in a REXX exec or CLIST; it cannot be executed in TSO. This
lets an area create a set of generic JCL to be submitted using commands.
42. 42
“All Together Now:” Full Examples of an Edit Session
Let’s bring together some of the concepts we’ve learned about Edit. On the
following pages are some examples using the many commands and concepts
we’ve learned to do some actually useful things.
On this and the next page are some steps we might do to create and run a set
of JCL. Here’s an empty member of my JCL PDS after I’ve displayed my profile
and run some commands:
Command ===> Scroll ===> CSR
****** ***************************** Top of Data ******************************
=PROF> ....CNTL (FIXED – 80)....RECOVERY OFF WARN....NUMBER ON STD.............
=PROF> ....CAPS ON....HEX OFF....NULLS ON STD....TABS ON STD...................
=PROF> ....AUTOSAVE ON....AUTONUM OFF....AUTOLIST OFF....STATS ON..............
=PROF> ....PROFILE UNLOCK....IMACRO NONE....PACK OFF....NOTE ON................
=COLS> ----+----1----+----2----+----3----+----4----+----5----+----6----+----7—
=TABS> *
=MASK> // DD DISP=SHR,DSN=
=BNDS> < >
****** **************************** Bottom of Data ****************************
Here are the commands I entered and why I chose them:
1. PROFILE 8 displayed the profile for this PDS, including the TABS, MASK,
and BOUNDS lines;
2. TABS ON turns on tab capability;
3. NULLS ON allows me to insert anywhere;
4. NUMBER ON STD provides JCL numbers in columns 73-80;
5. Entered a hardware tab in column 12 (for the DD);
6. Created a mask for “//”, “DD”, and DISP fields, since those are the most
common things I use.
Notice the BOUNDS are set at 1 and 72. The editor did that because columns
73 – 80 are the line numbers. That makes the line numbers exempt from
commands like FIND and CHANGE.
43. 43
Edit Session Example continued
Now I enter the RESET command and insert 10 lines:
****** ***************************** Top of Data ******************************
'''''' // DD DISP=SHR,DSN=
'''''' // DD DISP=SHR,DSN=
'''''' // DD DISP=SHR,DSN=
'''''' // DD DISP=SHR,DSN=
'''''' // DD DISP=SHR,DSN=
'''''' // DD DISP=SHR,DSN=
'''''' // DD DISP=SHR,DSN=
'''''' // DD DISP=SHR,DSN=
'''''' // DD DISP=SHR,DSN=
'''''' // DD DISP=SHR,DSN=
****** **************************** Bottom of Data ****************************
Notice how the mask is propagated? I’ll enter some data, using the tabs and
my keyboard’s END key (I set that as end of field) when needed. This is the
screen after I’ve typed but before I’ve hit ENTER:
****** ***************************** Top of Data ******************************
'''''' //SP1002ST JOB SP218ZZDFO9999A044,'ODEA 77184',USER=@TSSQ04,
'''''' // MSGLEVEL=1,MSGCLASS=H,PRTY=4,NOTIFY=@TSSQ04
'''''' //*FORMAT PR,DDNAME=,DEST=TMNODE1.RM005
'''''' //*MAIN CLASS=TSS04
'''''' //**
'''''' //STEP01 EXEC PGM=IEFBR14
'''''' //dd01 DD DSN=@tssq04.junk.data,disp=(mod,delete),
'''''' // unit=d,space=(trk,0)
'''''' // DD DISP=SHR,DSN=
'''''' // DD DISP=SHR,DSN=
****** **************************** Bottom of Data ****************************
See how I’ve been able to overlay the mask wherever needed? Here’s the
same screen after I hit ENTER:
****** ***************************** Top of Data ******************************
000100 //SP1002ST JOB SP218ZZDFO9999A044,'ODEA 77184',USER=@TSSQ04,
000200 // MSGLEVEL=1,MSGCLASS=H,PRTY=4,NOTIFY=@TSSQ04
000300 //*FORMAT PR,DDNAME=,DEST=TMNODE1.RM005
000400 //*MAIN CLASS=TSS04
000500 //**
000600 //STEP01 EXEC PGM=IEFBR14
000700 //DD01 DD DSN=@TSSQ04.JUNK.DATA,DISP=(MOD,DELETE),
000800 // UNIT=D,SPACE=(TRK,0)
****** **************************** Bottom of Data ****************************
Now we’ll go ahead and submit the job. Since I’ve set up my F12 key as
submit;end;tso ej;st I can just hit F12 and I’m off and running. Otherwise I’d have
to type SUBMIT, and then hit F3, and then type TSO EJ, and then type ST.
Nineteen keys, or one key… you decide.
44. 44
HILITE: an Example
Now let’s check out some primary and line commands. Here’s a short REXX
exec to illustrate the HILITE command.
****** ***************************** Top of Data ******************************
000001 /* REXX QUIP program */
000003 "ALLOC DDNAME(QUIP) DA('DBIG.QUIPS.DATA') SHR REUSE"
000004 QNUM = RANDOM(1,747)
000005 "EXECIO 1 DISKR QUIP" QNUM "(FINIS"
000006 PARSE PULL QUIP; SAY QUIP
000007 "FREE F(QUIP)"
****** **************************** Bottom of Data ****************************
In the example bold characters are quoted text (white in Edit), italics are
comments (cyan), and underlined characters are “keywords” (red), used for
highlighting logic, language verbs, and so on. You can see how this might be
useful. Notice on Line 4 the “QNUM” variable is not in the quotes and is not
highlighted. If QNUM were supposed to be part of the command and not a
variable you would expect it to be highlighted as is the rest of the command.
Let’s change this a bit. I’ll drop the “*/” from the comment and remove one of
the quotes. Let’s see what happens.
****** ***************************** Top of Data ******************************
000001 /* REXX QUIP program
000003 "ALLOC DDNAME(QUIP) DA('DBIG.QUIPS.DATA') SHR REUSE
000004 QNUM = RANDOM(1,747)
000005 "EXECIO 1 DISKR QUIP" QNUM "(FINIS"
000006 PARSE PULL QUIP; SAY QUIP
000007 "FREE F(QUIP)"
****** **************************** Bottom of Data ****************************
Not what we expected, is it? Without the closing “*/” Rexx thinks the entire
code is a comment. Highlighting is smart enough to catch this. Let’s put the “*/”
back (but leave the quotes off) and see what happens.
****** ***************************** Top of Data ******************************
000001 /* REXX QUIP program */
000003 "ALLOC DDNAME(QUIP) DA('DBIG.QUIPS.DATA') SHR REUSE
000004 QNUM = RANDOM(1,747)
000005 "EXECIO 1 DISKR QUIP" QNUM "(FINIS"
000006 PARSE PULL QUIP; SAY QUIP
000007 "FREE F(QUIP)"
****** **************************** Bottom of Data ****************************
All the red is gone. The strings are quoted, so they’re no longer considered
REXX verbs. Note the left parenthesis next to “FINIS”; it’s pink! Highlighting is
expecting a matching right parenthesis because the left parenthesis is no longer
quoted. Unmatched parentheses are an error, so this one is highlighted even
though it’s perfectly legal in REXX.
45. 45
Sort, Exclude, and Bounds
We talked separately about using the SORT command, excluding lines, and
setting bounds. Let’s combine those concepts. Here’s a dataset with information
in columns:
Command ===> Scroll ===> CSR
****** ***************************** Top of Data ******************************
000001 NAME HR NAME HR NAME HR
000002 BONDS 49 HELTON 46 SOSA 51
000003 HELTON 46 SOSA 51 PALMIERO 48
000004 THOME 52 PALMIERO 48 GARCIAPARRA 30
000005
000006 NAME HR NAME HR NAME HR
000007 THOMAS 26 BAGWELL 34 KONERKO 38
000008 THOMAS 26 BURNITZ 38 BAGWELL 34
000009 BURNITZ 32 KONERKO 38 KOSKIE 16
****** **************************** Bottom of Data ****************************
Suppose we want to sort all three columns into HR order. There’s no obvious
way to do this and still preserve the separate order each column deserves.
Using “sort 16 17 a 38 39 a 60 61 a” results in:
Command ===> Scroll ===> CSR
****** ***************************** Top of Data ******************************
000001
000002 NAME HR NAME HR NAME HR
000003 NAME HR NAME HR NAME HR
000004 THOMAS 26 BAGWELL 34 KONERKO 38
000005 THOMAS 26 BURNITZ 38 BAGWELL 34
000006 BURNITZ 32 KONERKO 38 KOSKIE 16
000007 HELTON 46 SOSA 51 PALMIERO 48
000008 BONDS 49 HELTON 46 SOSA 51
000009 THOME 52 PALMIERO 48 GARCIAPARRA 30
****** **************************** Bottom of Data ****************************
We know that’s not right. The header and spacer lines have percolated to the
top and we’ve lost our data integrity. What can we do? Somehow we have to
ignore the lines we don’t want to sort.
46. 46
Sort, Exclude and Bounds continued
Let’s take the original data and apply the exclude line command (“X”) to mark
those lines we want sorted:
Command ===> Scroll ===> CSR
****** ***************************** Top of Data ******************************
000001 NAME HR NAME HR NAME HR
- - - - - - - - - - - - - - - - - - - 3 Line(s) not Displayed
000005
000006 NAME HR NAME HR NAME HR
- - - - - - - - - - - - - - - - - - - 3 Line(s) not Displayed
****** **************************** Bottom of Data ****************************
Now we’ll try the same sort, this time using the “X” operand on the SORT,
making the command sort x 16 17 a 38 39 a 60 61 a:
Command ===> Scroll ===> CSR
****** ***************************** Top of Data ******************************
000001 NAME HR NAME HR NAME HR
000002 THOMAS 26 BAGWELL 34 KONERKO 38
000003 THOMAS 26 BURNITZ 38 BAGWELL 34
000004 BURNITZ 32 KONERKO 38 KOSKIE 16
000005
000006 NAME HR NAME HR NAME HR
000007 HELTON 46 SOSA 51 PALMIERO 48
000008 BONDS 49 HELTON 46 SOSA 51
000009 THOME 52 PALMIERO 48 GARCIAPARRA 30
****** **************************** Bottom of Data ****************************
As Bullwinkle said, “Well, I’m getting close,” but it’s not good enough. Players
have switched teams and still only the first column is close to the proper order.
How do we do this?
An obvious solution is to “X” out those lines we want sorted, a section at a
time, and then sort only that section. The result of that is:
Command ===> Scroll ===> CSR
****** ***************************** Top of Data ******************************
000001 NAME HR NAME HR NAME HR
000002 HELTON 46 SOSA 51 PALMIERO 48
000003 BONDS 49 HELTON 46 SOSA 51
000004 THOME 52 PALMIERO 48 GARCIAPARRA 30
000005
000006 NAME HR NAME HR NAME HR
000007 THOMAS 26 BAGWELL 34 KONERKO 38
000008 THOMAS 26 BURNITZ 38 BAGWELL 34
000009 BURNITZ 32 KONERKO 38 KOSKIE 16
****** **************************** Bottom of Data ****************************
Much better, but still not right. While players haven’t switched teams and the
headers are still there, the sort order is still wrong.
47. 47
Sort, Exclude and Bounds continued
The first thought is to split the sort into three sorts. The result is still going to
be records not in sort order because, no matter what, the highest-order sort
controls the record order. Does this have to be done manually? Not at all!
What we have here, after line exclusion and sorting all the fields at once, is a
file with the left-most of three columns in the correct order. Using bounds in
conjunction with exclusion and sorting will accomplish what we want.
Remember, SORT works within boundaries only. Here again is our data,
sorted after using exclude and sort (sort x 16 17 a) so the first column is
correct. This time I’ve included a BNDS line command to limit the next sort to the
center column:
Command ===> Scroll ===> CSR
****** ***************************** Top of Data ******************************
=BNDS> < >
000001 NAME HR NAME HR NAME HR
000002 HELTON 46 SOSA 51 PALMIERO 48
000003 BONDS 49 HELTON 46 SOSA 51
000004 THOME 52 PALMIERO 48 GARCIAPARRA 30
000005
000006 NAME HR NAME HR NAME HR
000007 THOMAS 26 BAGWELL 34 KONERKO 38
000008 THOMAS 26 BURNITZ 38 BAGWELL 34
000009 BURNITZ 32 KONERKO 38 KOSKIE 16
****** **************************** Bottom of Data ****************************
Now we’ll re-exclude the lines and sort as we did the first time (hopefully you
remember to use the RETRIEVE key), the command being sort x 38 39 a.
The result of this second sort is:
Command ===> Scroll ===> CSR
****** ***************************** Top of Data ******************************
=BNDS> < >
000001 NAME HR NAME HR NAME HR
000002 HELTON 46 HELTON 46 PALMIERO 48
000003 BONDS 49 PALMIERO 48 SOSA 51
000004 THOME 52 SOSA 51 GARCIAPARRA 30
000005
000006 NAME HR NAME HR NAME HR
000007 THOMAS 26 BAGWELL 34 KONERKO 38
000008 THOMAS 26 BURNITZ 38 BAGWELL 34
000009 BURNITZ 32 KONERKO 38 KOSKIE 16
****** **************************** Bottom of Data ****************************
We’ll now repeat the same procedure sorting on columns 60 and 61. The
result is on the next page.
48. 48
Sort, Exclude, and Bounds continued
Here’s the result:
Command ===> Scroll ===> CSR
****** ***************************** Top of Data ******************************
=BNDS> < >
000001 NAME HR NAME HR NAME HR
000002 HELTON 46 HELTON 46 GARCIAPARRA 30
000003 BONDS 49 PALMIERO 48 PALMIERO 48
000004 THOME 52 SOSA 51 SOSA 51
000005
000006 NAME HR NAME HR NAME HR
000007 THOMAS 26 BAGWELL 34 KOSKIE 16
000008 THOMAS 26 BURNITZ 38 BAGWELL 34
000009 BURNITZ 32 KONERKO 38 KONERKO 38
****** **************************** Bottom of Data ****************************
In order, the steps to follow are:
1. Determine your sort fields;
2. Set appropriate bounds using the BNDS line command;
3. Exclude the lines you want sorted using the X/XX line command;
4. Code your sort command as SORT X <start> <end> a/d;RES X;
5. Return to number 2. and continue until you’re done sorting.
If you’re sorting in ascending order with only one field, you can leave off the “a”.
The “;RES X” on the end of the command resets the excluded lines to get ready
for the next exclude line commands. Don’t forget to use the RETRIEVE key to
relieve strain on your carpal tunnel.
When you’re done with this sort of process, you’ll want to execute the
BOUNDS primary command to reset any bounds you changed back to the
defaults. If you don’t you may end up surprised.
49. 49
Miscellaneous Edit Trick
On a dataset entry field you can limit the PDS member name list to certain
members using wildcards. We talked about them before; here’s a practical
example. To see only those members starting with ACB, on the main Edit screen
you can enter (see bold):
Menu RefList RefMode Utilities Workstation Help
------------------------------------------------------------------------------
Edit Entry Panel
Command ===>
ISPF Library:
Project . . . @TSSQ04
Group . . . . SN1 . . . . . . . . .
Type . . . . CNTL
Member . . . acb* (Blank or pattern for member selection list)
Other Partitioned, Sequential or VSAM Data Set:
Data Set Name . . .
Volume Serial . . . (If not cataloged)
Workstation File:
File Name . . . . .
Options
Initial Macro . . . . Confirm Cancel/Move/Replace
Profile Name . . . . . Mixed Mode
Format Name . . . . . Edit on Workstation
Data Set Password . . Preserve VB record length
This can be done anywhere you enter a dataset name, including on the
DSLIST panels (see the DSLIST section below).
The entire member list is always accessible. In the case above you could
select another member to edit, even if its name is not listed on the member list,
as long as the member is in the PDS.
50. 50
Miscellaneous ISPF Tricks
Use member masks to create any member list. Normally you’ll see a list of
members with selection fields to the left, and sometimes a PROMPT field to the
right. In the PROMPT field you can enter parameters to be passed to certain line
commands.
Member lists can have three types of selection fields:
1. A single dot indicates only one member can be processed at a time using
a single command (usually “S”);
2. A single underscore indicates only one member can be processed at a
time, using multiple function commands (e. g. “S”, “E”, “R”, etc.);
3. A line of underscores indicates many members can be processed using
multiple function commands.
In member lists with underscores, you can select a list of members to pass
to a line command. The result is as if you entered separate line commands. For
example, to edit all ACB* members in a PDS, use this command:
COMMAND ===> s ACB* e
where “e”, edit, is the command being passed.
This can also be done in the COPY function (option 3.3). To copy or move
members from one PDS or another you can enter a member name mask. You
may be tempted to type the “S” in each selection field. To reduce strain on your
fingers type “S *” on the command line instead.
Use the PC’s copy and paste functions to rename members in a PDS. For
example, to rename the ACB* members to ARB* members:
LIBRARY @TSSQ04.SN1.CNTL Row 00001 of 00092
Command ===> Scroll ===> CSR
Name Prompt Size Created Changed ID
R ACBJCL ArBJCL 58 2002/09/23 2002/09/23 11:30:37 @TSSQ04
R ACBJCLT ArBJCLT 47 2002/09/23 2002/10/09 09:42:25 @TSSQ04
R ACBSYSIN ArBSYSIN 13 2002/09/23 2002/11/04 15:35:05 @TSSQ04
For this example I typed “R” next to the members I wanted to rename, copied
the member names, and then pasted them into the PROMPT field. Then I
overtyped the “C” to be “r” and hit ENTER.
For a few members this works well. If you have many members, though, you
may not want to do things this way. I have a REXX exec designed to rename all
members in a PDS. If you’re interested you can have it.