We have a common menu (panel) that is mostly used by my team, but can also be used by others. Some of the options in the menu allow you to view jobs. When a user views a job I'd like them to have this as their starting (default) Profile but only for the life of viewing that member from within the panel menu.
This is a partial code snippet of what is executed to view a member.
How can I find the JCL80 Profile and create it for each user if they don't already have it created? I certainly don't want to overlay it if they already have a Profile named JCL80.
I read something in a manual (or web page...I don't know...I've looked at many dozens of both for the past couple days) that indicated that Editor Profiles are saved as Command Tables.
I've found that in the =3.16 ISPF Table Utility, I can see a table exists named ISPSPROF, which I cannot browse from within the utility because it says it's already open. So I wrote a little REXX program to use TBOPEN, TBQUERY, TBSKIP, TBCLOSE and discovered there are 2 rows in ISPSPROF, so I think they might be my two Editor Profiles (JCL80 and SQL80); however when I attempt to SAY the ZCTVERB, ZCTTRUNC, ZCTACT, ZCTDESC, I get nothing... The same REXX program works fine for other tables, such as USRCMDS.
Since JCL80 and SQL80 only exist under my userid, my assumption is that when someone else enters the option that views one of the files, they will at best find that the Editor Profile won't be applied, or get an ISPF error message, or at worst abort.
Hi Kolusu, I tried reading up on PROFILE_SHARING, but that seems to be for a user sharing his profile between multiple sessions, not sharing editor profiles.
The IBM z/OS V1R11.0 ISPF Planning and Customizing manual says:
Quote:
Profile sharing is intended to be used by the same user logging concurrently onto multiple systems. The contents of the ISPF profile are often user-specific.
But I'll go ahead and talk to our z/OS Systems Programmers and see what they say.
Do you know whether there are any other ways to do this? Where are my Editor Profile's hiding? Why can't I see the values when I read the Table? Is there a way to dynamically create a Profile behind the scenes when someone executes the panel?
and if you want to get fancy then may be you can use this exec Written by Chris Lewis
Code:
/* REXX PROFVARS Display all the Profile Variables for a
given application pool.
Written by Chris Lewis 20021220
Impact Analysis
. SYSEXEC LA
. SYSEXEC MEMBERS
. SYSEXEC TRAPOUT
Modification History
20030206 ctl Upgrade REXXSKEL from v19971030 to 20020513; Add
DEIMBED. Add ability to open an alternate profile;
20030206 fxc use LA to acquire ISPPROF dataset name;
20030207 fxc eliminate unnecessary VGET;
20050116 fxc major upgrade: adds display of all available profiles
for selection; reorganize structuring; adds detail
display of individual variable data; update REXXSKEL
to v.20040227; update Impact Analysis;
|**-***-***-***-***-***-***-***-***-***-***-***-***-***-***-***-**|
| |
| WARNING: EMBEDDED COMPONENTS. |
| See text following TOOLKIT_INIT |
| |
|**-***-***-***-***-***-***-***-***-***-***-***-***-***-***-***-**|
return /*@ A_INIT */
/*
Determine profile-dataset-name. Find all ..PROF members in that
dataset.
. ----------------------------------------------------------------- */
AI_ISPPROF: /*@ */
if branch then call BRANCH
address TSO
if profname <> "" then return /* we don't need a member list*/
"NEWSTACK"
"MEMBERS" "'"profdsn"'" "((STACK LINE"
parse pull mbrlist
"DELSTACK"
rmbr = Reverse(mbrlist)
mbr = ""
do Words(mbrlist) /* each word */
parse value rmbr mbr with mbr rmbr
if Left(mbr,4) <> "FORP" then, /* PROF reversed */
mbr = "" /* don't keep it */
end /* mbrlist */
mbrlist = Reverse(rmbr mbr) /* restore */
return /*@ AI_ISPPROF */
/*
. ----------------------------------------------------------------- */
AS_SETUP_ISPF: /*@ */
if branch then call BRANCH
address ISPEXEC
call DEIMBED /* extract ISPF assets -*/
dd = ""
do Words(ddnlist) /* each LIBDEF DD */
parse value ddnlist dd with dd ddnlist
$ddn = $ddn.dd /* PLIB322 <- PLIB */
"LIBDEF ISP"dd "LIBRARY ID("$ddn") STACK"
end
ddnlist = ddnlist dd
return /*@ AS_SETUP_ISPF */
/*
Load the PROFILE member names onto the primary selector panel and
present it for profile selection. If a profile name already exists
this section is redundant and we can branch directly to the inner
logic.
. ----------------------------------------------------------------- */
B_TABLE_OPS: /*@ */
if branch then call BRANCH
address ISPEXEC
if profname <> "" then do
call BDA_DETAILS /* */
return /* we're done... */
end
return /*@ BA_PROLOG */
/*
. ----------------------------------------------------------------- */
BB_LOAD_TABLE: /*@ */
if branch then call BRANCH
address ISPEXEC
do Words(mbrlist) /* each profile name */
parse var mbrlist profname mbrlist /* isolate */
"TBADD" $tn$
end /* mbrlist */
return /*@ BB_LOAD_TABLE */
/*
Show the primary selection table and allow the user to select one
or more profiles for display. Pass each selected "profname" to
BDA_DETAILS.
. ----------------------------------------------------------------- */
BD_DISPLAY_TABLE: /*@ */
if branch then call BRANCH
address ISPEXEC
"TBTOP" $tn$
do forever
sel = ""
"TBDISPL" $tn$ "PANEL(SELPROF)"
if rc > 4 then leave
do ztdsels
"CONTROL DISPLAY SAVE"
call BDA_DETAILS /* */
"CONTROL DISPLAY RESTORE"
if ztdsels > 1 then "TBDISPL" $tn$
end /* ztdsels */
end /* forever */
return /*@ BD_DISPLAY_TABLE */
/*
Process the selection made from the primary selection table
(profile name). Show the details of this profile. If the user
specified a profile name as a parm, control will branch directly
into this procedure.
. ----------------------------------------------------------------- */
BDA_DETAILS: Procedure expose, /*@ hide everything except... */
(tk_globalvars) profname profdsn
if branch then call BRANCH
address ISPEXEC
return /*@ BDA_DETAILS */
/*
. ----------------------------------------------------------------- */
BDAA_PROLOG: /*@ */
if branch then call BRANCH
address ISPEXEC
$tn$ = "AP"Right(time("S"),5,0)
"TBSTATS" profname "STATUS2(S2)"
if s2 > 1 then return /* table is already open */
"LIBDEF ISPTLIB DATASET ID('"profdsn"')"
"TBOPEN" profname "NOWRITE"
if rc <> 0 then do
sw.error_found = 1
zerrsm = "Table Error"
zerrlm = "Unable to open" profname". Is this a valid Profile?"
"SETMSG MSG(ISRZ002)"
end /* rc <> 0 */
"LIBDEF ISPTLIB" /* open table */
if sw.error_found then return
sw.0ClosePROF = 1 /* we opened it */
return /*@ BDAA_PROLOG */
/*
Load the profile variables from the xxxxPROF table onto the temp
table.
. ----------------------------------------------------------------- */
BDAB_VAR_LOAD: /*@ */
if branch then call BRANCH
address ISPEXEC
"TBTOP" profname
"TBSKIP" profname "NUMBER(1) SAVENAME(SAVES)" /* variable are stored*/
/* in an extension variable */
parse var saves "(" saves ")" . /* grab all variable names */
do while saves <> ""
parse var saves x4name saves
varval = Value(x4name)
len = Length(varval)
"TBADD" $tn$
end /* while */
return /*@ BDAB_VAR_LOAD */
/*
Show the list of variables. Allow the user to select one or more
for display.
. ----------------------------------------------------------------- */
BDAD_DISPLAY: /*@ */
if branch then call BRANCH
address ISPEXEC
"TBSORT" $tn$ "FIELDS(X4NAME,C,A)" /* sort and set crp to top */
do forever
"TBDISPL" $tn$ "PANEL(PROFVARS)"
if rc > 4 then leave
return /*@ BDAD_DISPLAY */
/*
A "varval" may have been truncated because of the screen width.
Show it here full-size.
. ----------------------------------------------------------------- */
BDADD_SHOW_DETAIL: Procedure expose, /*@ */
(tk_globalvars) varval x4name
if branch then call BRANCH
address ISPEXEC
"DISPLAY PANEL(PROFDETL)"
return /*@ BDADD_SHOW_DETAIL */
/*
. ----------------------------------------------------------------- */
BDAZ_EPILOG: /*@ */
if branch then call BRANCH
address ISPEXEC
"TBEND" $tn$
if sw.0ClosePROF then, /* we need to close it */
"TBEND" profname
sw.0ClosePROF = 0 /* reset */
return /*@ BDAZ_EPILOG */
/*
. ----------------------------------------------------------------- */
BZ_EPILOG: /*@ */
if branch then call BRANCH
address ISPEXEC
"TBEND" $tn$
return /*@ BZ_EPILOG */
/*
Tear down the LIBDEFs done for DEIMBEDded material.
. ----------------------------------------------------------------- */
Z_TERMINATE: /*@ */
if branch then call BRANCH
address ISPEXEC
dd = ""
do Words(ddnlist) /* each LIBDEF DD */
parse value ddnlist dd with dd ddnlist
$ddn = $ddn.dd /* PLIB322 <- PLIB */
"LIBDEF ISP"dd
address TSO "FREE FI("$ddn")"
end
ddnlist = ddnlist dd
return /*@ LOCAL_PREINIT */
/* subroutines below LOCAL_PREINIT are not selected by SHOWFLOW */
/*
Parse out the embedded components at the back of the source code.
. ----------------------------------------------------------------- */
DEIMBED: Procedure expose, /*@ */
(tk_globalvars) ddnlist $ddn. daid.
address TSO
fb80po.0 = "NEW UNIT(VIO) SPACE(5 5) TRACKS DIR(40)",
"RECFM(F B) LRECL(80) BLKSIZE(0)"
parse value "" with ddnlist $ddn. daid.
lastln = sourceline()
currln = lastln
if Left(sourceline(currln),2) <> "*/" then return
currln = currln - 1 /* previous line */
"NEWSTACK"
address ISPEXEC
do while sourceline(currln) <> "/*"
text = sourceline(currln) /* save with a short name */
if Left(text,3) = ")))" then do /* package the queue */
parse var text ")))" ddn mbr . /* PLIB PANL001 maybe */
if Pos(ddn,ddnlist) = 0 then do /* doesn't exist */
ddnlist = ddnlist ddn /* keep track */
$ddn = ddn || Random(999)
$ddn.ddn = $ddn
address TSO "ALLOC FI("$ddn")" fb80po.0
"LMINIT DATAID(DAID) DDNAME("$ddn")"
daid.ddn = daid
end
daid = daid.ddn
"LMOPEN DATAID("daid") OPTION(OUTPUT)"
do queued()
parse pull line
"LMPUT DATAID("daid") MODE(INVAR) DATALOC(LINE) DATALEN(80)"
end
"LMMADD DATAID("daid") MEMBER("mbr")"
"LMCLOSE DATAID("daid")"
end /* package the queue */
else push text /* onto the top of the stack */
currln = currln - 1 /* previous line */
end /* while */
address TSO "DELSTACK"
return /*@ DEIMBED */
/* subroutines below LOCAL_PREINIT are not selected by SHOWFLOW */
/*
. ----------------------------------------------------------------- */
HELP: /*@ */
address TSO;"CLEAR"
say ""
if helpmsg <> "" then do ; say helpmsg; say ""; end
ex_nam = Left(exec_name,8) /* predictable size */
say " "ex_nam" Display all the Profile Variables for a given application "
say " pool. "
say " "
say " Syntax: "ex_nam" APPL <applid> "
say " "
say " applid specifies a particular application prefix to be "
say " displayed. It may be fully-specified (ex: ZIPPROF)"
say " or as a prefix-only (ZIP). If not specified a list "
say " of all relevant profiles will be presented for "
say " selection. "
say " "
"NEWSTACK"; pull ; "CLEAR" ; "DELSTACK"
say " "
say " Debugging tools provided include: "
say " "
say " BRANCH: show all paragraph entries. "
say " "
say " TRACE tv: will use value following TRACE to place the "
say " execution in REXX TRACE Mode. "
say " "
say " "
say " Debugging tools can be accessed in the following manner: "
say " "
say " TSO "ex_nam" parameters (( debug-options "
say " "
say " For example: "
say " "
say " TSO "ex_nam" (( MONITOR TRACE ?R "
address ISPEXEC "CONTROL DISPLAY REFRESH"
exit /*@ HELP */
Thanks Kolusu. I was unable to get Chris's program to work. It gets an error because the TOOLKIT_INIT routine doesn't exist. I was able to ascertain how to display the rows and they are not the contents of my Editor Profiles: JCL80 and SQL80.
Joined: 26 Nov 2002 Posts: 12377 Topics: 75 Location: San Jose
Posted: Wed Jul 16, 2014 11:32 am Post subject:
RoyKMathur wrote:
Thanks Kolusu. I was unable to get Chris's program to work. It gets an error because the TOOLKIT_INIT routine doesn't exist.
RoyKMathur,
You might not really need the TOOLKIT_INIT but here is the explanation and the source code for that.
TOOLKIT_INIT establishes "info" by loading "opts", so that TV, TRAPOUT, BRANCH, MONITOR, and NOUPDT (the items parsed-out in TOOLKIT_INIT) are all derived by default from "opts", the portion of the argument following the "((". Before it returns control to the mainline, TOOLKIT_INIT calls LOCAL_PREINIT, a stub routine which may be used by the application programmer to process any locally-defined opts-values. (LOCAL_PREINIT is placed before HELP in the standard REXXSKEL to indicate that it is not intended to be replaced when upgrading to a more recent version.)
On return from TOOLKIT_INIT (into the mainline), "info" is refreshed from "parms", so that all other switches and keyword values will be determined from that portion of the argument preceeding the "((".
Thanks Kolusu. I went to Frank's webpage and he states that code has been removed from the rexx programs to save space because each of the programs uses the exact same code. All I had to do was copy all lines from the REXXSKEL member from the BRANCH routine to the end of the member after the line that says "REXXSKEL back-end removed to save space". I got it working, but it also can't display the contents of that ISPSPROF member; it works fine with the other members, such as USRCMDS, etc. I've sent an email to Frank about my "problem" as outlined in my original post. I'd have send it to Doug Nadel, but I don't have his email address, and I don't know what his status is. I hope he's okay.
Actually his message says he'd be happy to answer any questions...it's just he didn't leave his email address.
Quote:
I have retired from IBM and much of the MVS related content on this site was developed as part of my tenure there. It was published here with the permission of IBM during my employment. I was diligent about assigning copyright to IBM and I intend to respect that same copyright.
I would be happy to answer questions on MVS, ISPF, Rexx, etc, but will no longer be distributing any software that was created before my departure from IBM.
Note also that I no longer have any access to a mainframe or any z/OS installations so I can not test, try, prototype or verify any answers I give. Nonetheless, questions are welcome.
Hi Kolusu, No response from Frank. Maybe my email went into his Junk mail folder since it is a GEICO email address. Anyway, I figured out how to do what I wanted to do without using an Editor Profile. Instead I noticed on Mark Zelden's website that I can create an Edit Macro that'll set all the Profile options I wanted to set.
Then when I execute ISREPDF I just pass it the parm "VIEW MACRO JCL80". Works great!
For some unknown reason, the FIND, CURSOR and PAREN are already turned on and unfortunately they are toggle switches, so possibly it won't work for other people? but I'll cross that bridge if I reach it.
Edit profiles are stored in your profile data set in member xxxxEDIT, where xxxx is the applid. For PDF, the applid is ISR, so ISREDIT is where your normal option 2 profiles are stored. All profiles are in the same table, one profile per row. Once you have created customized profiles, you can copy the ISREDIT table from your profile data set to a shared ISPTLIB library and that table will become the default for all new users - they will then get your customized profiles. However, you cannot create new defaults or add new profiles for existing users who already have an ISREDIT in their profile data set.
You may be able do do what you want by starting a new applicatiion and creating a default table xxxxEDIT for your application in the shared ISPTLIB library - the first time the application is used, the table gets copied from ISPTLIB to the users profile data set.
P.S. You can also create a profile called ZDEFAULT, which wiill be used as the default when a user tries to use a profile that doesn't exist in his table - he will not get an error - but again, it has to be there when the table is first copied from ISPTLIB.
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum