Kenneth, lady and gentlemen,.
I do thankyou for your responses. There was much there that I have put to
use, SYSDSN, apostrophes, DELETE, use of EXECIO *, Got most of the coding
done, now to wait for mainframe access (hopefully IBM VIC), getting a good
lesson in 'proper'.REXX. Lizette, here in general what it has to do ..
The REXX accepts two parms.
The first is a four letter word e.g. HOBB and must match 1-4 of a record in
the flat file SUPPORT.PDS(ZY4LW).
The second is the path/name of a copybook e.g.PUBMAST.CPYBKS.PROD(AGM002),
must be checked for existence, if exists then is then read to extract some
info.
Next is to prepare are three empty PDS's being:
SYSUID.HOBB
SYSUID.HOBB.BMS
SYSUID.HOBB.JOBS
If they exist they MUST be deleted (empty or not)(deleting is necessary, not
REUSE).
Then ALLOCATE'd and thus created.
Then into SYSUID.HOBB must be copied the copybook (the second parm), also
three known flat files.
Then churn out a msg to the user on the Option 6 screen that their
environment has been built and they may submit the next job (another REXX)
which will do stuff with the second/third PDS's.
That's it, works fine on my laptop.
cheers, thanks again.
Graham
----- Original Message -----
From: "Kenneth Klein (TEMA TPC)" <kenneth.kl...@tema.toyota.com>
Newsgroups: bit.listserv.ibm-main
To: <IBM-MAIN@LISTSERV.UA.EDU>
Sent: Thursday, March 28, 2013 9:26 AM
Subject: Re: PDS processing in REXX
The I/O routines in mainframe REXX and ooRexx on an intel chip must be
different for many inherent reasons. We're talking records and blocks on the
mainframe and byte streams on the PC for one thing.
Here is a working example of a rexx exec I run in a batch job. The files are
allocated in the JCL so that part will not help you unless you choose that
option. I just wanted to show you how to use an array to hold all your data
from the file without loading and running the execio code in a loop. In this
code you read the file once, and write the output file in one operation. The
writing is done using the REXX QUEUE, another very powerful feature of REXX.
/* REXX */
trace r
ADDRESS TSO
"EXECIO * DISKR INDD (STEM lineread. FINIS)"
IF RC ^= 0 THEN do
SAY 'THERE IS A PROBLEM WITH YOUR DATASET.' rc
EXIT
END
SAY lineread.0 'RECORDS READ FROM input file'
outline = ""
system_id = "s_id"
interval_date = " date "
interval_time = " time "
total_dispatch_time_CP1A = " cp1a"
total_dispatch_time_CP1C = " cp1c"
total_dispatch_time_CP1D = " cp1d"
total_dispatch_time_CP1F = " cp1f"
total_dispatch_time_CP1H = " cp1h"
total_dispatch_time_CP1K = " cp1k"
total_dispatch_time_CP1L = " cp1l"
total_dispatch_time_CP1S = " cp1s"
total_dispatch_time_CP1U = " cp1u"
total_dispatch_time_CP1Z = " cp1z"
outline =,
system_id || ", ",
interval_date || ", " || interval_time || ", " ||,
total_dispatch_time_CP1A || ", " ||,
total_dispatch_time_CP1C || ", " ||,
total_dispatch_time_CP1D || ", " ||,
total_dispatch_time_CP1F || ", " ||,
total_dispatch_time_CP1H || ", " ||,
total_dispatch_time_CP1K || ", " ||,
total_dispatch_time_CP1L || ", " ||,
total_dispatch_time_CP1S || ", " ||,
total_dispatch_time_CP1U || ", " ||,
total_dispatch_time_CP1Z /* end of building the outline. */
queue outline
outline = ""
DO I = 1 TO LINEREAD.0
select
WHEN substr(LINEREAD.I,48,26) = 'P A R T I T I O N D A T A' &,
system_id \= 's_id' then do
outline =,
system_id || ", ",
interval_date || ", " || interval_time || ", " ||,
total_dispatch_time_CP1A || ", " ||,
total_dispatch_time_CP1C || ", " ||,
total_dispatch_time_CP1D || ", " ||,
total_dispatch_time_CP1F || ", " ||,
total_dispatch_time_CP1H || ", " ||,
total_dispatch_time_CP1K || ", " ||,
total_dispatch_time_CP1L || ", " ||,
total_dispatch_time_CP1S || ", " ||,
total_dispatch_time_CP1U || ", " ||,
total_dispatch_time_CP1Z /* end of building the outline. */
queue outline
outline = ""
end /* do */
WHEN SUBSTR(LINEREAD.I,6,14) = 'PARTITION NAME' THEN
system_id = substr(lineread.i,40,4)
when SUBSTR(LINEREAD.I,64,7) = ' DATE ' THEN
interval_date = substr(lineread.i,71,10)
when SUBSTR(LINEREAD.I,64,7) = ' TIME ' THEN
interval_time = substr(lineread.i,71,8)
when substr(LINEREAD.I,2,4) = 'CP1Z' THEN
total_dispatch_time_CP1Z = substr(lineread.i,58,12)
when substr(LINEREAD.I,2,4) = 'CP1A' THEN
total_dispatch_time_CP1A = substr(lineread.i,58,12)
when substr(LINEREAD.I,2,4) = 'CP1C' THEN
total_dispatch_time_CP1C = substr(lineread.i,58,12)
when substr(LINEREAD.I,2,4) = 'CP1D' THEN
total_dispatch_time_CP1D = substr(lineread.i,58,12)
when substr(LINEREAD.I,2,4) = 'CP1F' THEN
total_dispatch_time_CP1F = substr(lineread.i,58,12)
when substr(LINEREAD.I,2,4) = 'CP1H' THEN
total_dispatch_time_CP1H = substr(lineread.i,58,12)
when substr(LINEREAD.I,2,4) = 'CP1K' THEN
total_dispatch_time_CP1K = substr(lineread.i,58,12)
when substr(LINEREAD.I,2,4) = 'CP1L' THEN
total_dispatch_time_CP1L = substr(lineread.i,58,12)
when substr(LINEREAD.I,2,4) = 'CP1S' THEN
total_dispatch_time_CP1S = substr(lineread.i,58,12)
when substr(LINEREAD.I,2,4) = 'CP1U' THEN
total_dispatch_time_CP1U = substr(lineread.i,58,12)
otherwise say "Skip--->" substr(lineread.i,1,122)
END /* select */
END I
"EXECIO * DISKW OUTFILE (FINIS"
IF RC = 0 THEN SAY 'RETURN FROM WRITE IS FINE ===' RC
else IF RC = 1 THEN SAY 'WROTE OVER EXISTING MEMBER.'
else SAY 'RETURN FROM WRITE IS NOT GOOD' RC
EXIT
PS: You may want to check out Netrexx (also written by Cowlishaw). It's very
REXX-like and generates java byte code that can run on a pc and a mainframe
and any platform that supports the JVM, Java Virtual Machine. To be clear:
the very same .class file can be executed with "java moduleName.class" from
the windows command line and an OMVS terminal.
-----Original Message-----
From: IBM Mainframe Discussion List [mailto:IBM-MAIN@LISTSERV.UA.EDU] On
Behalf Of Graham Hobbs
Sent: Wednesday, March 27, 2013 9:34 PM
To: IBM-MAIN@LISTSERV.UA.EDU
Subject: PDS processing in REXX
Hello,
OK to ask for some help please, or where might I go?:-) Am not a sysprog,
hope to be back on a z/OS machine in a short while, have to convert several
ooREXX's to mainframe acceptability so, to save some mainframe time $'s, if
I may, will ask neophyte questions (have googled); that said ..
.. this REXX CJM1 will run from TSO/ISPF Option 6 and is:
/* REXX CJM1 */
CALL PARA1
CALL PARA2
CALL PARA3
EXIT
/* this needs to delete an empty or non-empty PDS from existence, do I need
to allocate etc, or will the following work? */
PARA1:
F1 = '"ENCORE.CBL.SOURCE"'
"DELETE "'F1'"" /* TRYING TO GET MY HEAD AROUND THESE QUOTE'Y THINGS */
RC_REASON = 'DELETE 'F1; CALL RETCODE
RETURN
/* this needs to
1. create a new PDS if it's not there
2. empty it if it is there
*/
PARA2:
F2 = '"CONRAD.TEST.CPYBKS"'
"ALLOC DA("'F2'") NEW REUSE RECFM(F B) LRECL(80)",
"DIR(255) SPACE(50,10) TRACKS UNIT(SYSDA)"
RC_REASON = 'ALLOC I 'F2; CALL RETCODE
/* WISE TO FREE THIS FIRST?; IF ALLOC FAILS, CAN I ASSUME FILE NOT THERE
*/
RETURN
/* this needs to read and print a PDS member; is there a 'not so crude' way
*/
PARA3:
F3 = '"SUPPORT.FILE.PDS(FDQKVS)"'
"ALLOC DDNAME(INFILE1) DSN("'F3'") SHR REUSE"
RC_REASON = 'ALLOC I 'F3; CALL RETCODE
/* WISE TO FREE THIS FIRST?; IF ALLOC FAILS, CAN I ASSUME FILE NOT THERE
*/
F3_EOF = 'NO'
DO WHILE F3_EOF = 'NO'
"EXECIO 1 DISKR INFILE1"
IF RC = 0 THEN DO
PULL WS_INB
SAY SUBSTR(WS_INB,1,79)
END
ELSE DO
F3_EOF = 'YES'
END
END
"EXECIO 0 DISKR INFILE1 (FINIS"
RC_REASON = 'FINIS 'F3; CALL RETCODE
"FREE DDNAME(INFILE1)"
RC_REASON = 'FREE 'F3; CALL RETCODE
RETURN
RETCODE:
IF RC \= 0 THEN DO
SAY 'E: 'RC_REASON' PROBLEM'; EXIT
END
ELSE DO
SAY 'I: 'RC_REASON' OK'
END
RETURN
.. thanks in advance,
Graham Hobbs
PS. Not being 'deep' .. why is I/O coding different between mainframe and
ooREXX? Did it have to be?
----------------------------------------------------------------------
For IBM-MAIN subscribe / signoff / archive access instructions, send email
to lists...@listserv.ua.edu with the message: INFO IBM-MAIN
----------------------------------------------------------------------
For IBM-MAIN subscribe / signoff / archive access instructions,
send email to lists...@listserv.ua.edu with the message: INFO IBM-MAIN
----------------------------------------------------------------------
For IBM-MAIN subscribe / signoff / archive access instructions,
send email to lists...@listserv.ua.edu with the message: INFO IBM-MAIN