Using EXECIO makes the original requirement simpler:
/* REXX Convert PDS to sequential file */
/* */
/* */
/* JCL to restore the seq file back to a PDS */
/* //........ JOB ................... */
/* //STEP00 EXEC PGM=IEBUPDTE,PARM=NEW */
/* //SYSPRINT DD SYSOUT=* */
/* //SYSIN DD DISP=SHR,DSN=userid."SEQFILE".expds */
/* //SYSUT2 DD DISP=SHR,DSN=your.output.pds */
/* REXX */
/* -------------------- REXX ** ------------------- */
/* Syntax for expds: */
/* %pdstosam hlq.pdsname off */
/* ------------------------------------------------ */
ARG libparm ver
IF ver = ON THEN
TRACE ALL
user = USERID()
ctr = 0
If libparm = '' Then Do While libparm = ''
SAY 'Library not entered '
SAY 'Enter Library name ===>'
Pull libparm
End
SAY 'Enter OUTPUT FILE qualifier '
PULL seqfile
temp_grc = "00"
tot_mem = 0
CALL read_dir
CALL all_utl
DO I = 7 TO libmem.0
MEMBER = STRIP(libmem.I)
CALL copy_mem
END
CALL end_expds
/* ------------------------ */
all_utl:
"LISTDS '"user"."SEQFILE".EXPDS'"
IF RC = 0 THEN DO
" DEL '"user"."SEQFILE".EXPDS'"
END
" ALLOC FI(OUT) DA('"user"."SEQFILE".EXPDS') MOD CATALOG",
" RECFM (F B) DSORG(PS) SP(200 100) CYL ",
" LRECL(80) BLKSIZE(8000) UNIT(3390) "
IF RC > 0 THEN
DO
temp_rc = RC
temp_ftc = "ALLOC ERROR"
CALL rou_rc
END
RETURN
copy_mem:
tot_mem = tot_mem + 1
ctr = ctr + 1
ROUT.0 = ctr
ROUT.ctr = "./ ADD LEVEL=00,SOURCE=0,NAME="MEMBER
" ALLOC FI(TMP) DA('"libparm"("MEMBER")' ) SHR REUSE"
"EXECIO * DISKR TMP (FINIS STEM TMP."
IF RC > 0 THEN
DO
temp_rc = RC
temp_ftc = "EXECIO ERROR ON TMP"
CALL rou_rc
END
" FREE FI(TMP) "
* DO J = 1 TO TMP.0*
* ctr = ctr + 1*
* ROUT.ctr = TMP.J*
* END*
*RETURN*
read_dir:
X = OUTTRAP("libmem.")
"LISTDS '"libparm"' M"
IF RC > 0 THEN
DO
temp_rc = RC
temp_ftc = "LISTDS ERROR"
CALL rou_rc
END
X = OUTTRAP("OFF")
IF libmem.0 < 8 THEN
DO
temp_ftc = "PDS IS EMPTY"
temp_rc = 4
CALL rou_rc
END
RETURN
rou_rc:
IF temp_rc > 0 THEN
temp_grc = temp_rc
SAY " > ERROR < "
SAY " > FUNCTION/REXX < " temp_ftc
SAY " > RETURN CODE < " temp_rc
temp_rc = 0
temp_ftc = ""
RETURN
end_expds:
"EXECIO * DISKW OUT (FINIS STEM ROUT."
" FREE DATASET('"user"."SEQFILE".EXPDS')"
SAY 'Output file written name - 'user"."SEQFILE".EXPDS"
IF temp_grc = 0 THEN DO
SAY "MEMBERS SUCCESSFULLY PROCESSED: "tot_mem
END
EXIT temp_grc
Just add the logic in this code in the routine:
* DO J = 1 TO TMP.0*
* ctr = ctr + 1*
* IF POS('BLAH',TMP.J) > 0 THEN DO......*
* END*
* ROUT.ctr = TMP.J*
* END*
*RETURN*
On Thu, May 28, 2020 at 11:23 AM Wayne Bickerdike <[email protected]> wrote:
> This is the IDCAMS version:
>
> /* REXX Mainframe Week - Code */
> /* */
> /* A REXX routine to convert PDS to sequential datasets */
> /* */
>
> /* -------------------- REXX ** ------------------- */
> /* Syntax for expds: */
> /* %pdstoseq hlq.pdsname off */
> /* ------------------------------------------------ */
> ARG libparm ver
> IF ver = ON THEN
> TRACE ALL
> user = USERID()
> SAY 'Enter DSN qualifier '
> PULL seqfile
> temp_grc = "00"
> tot_mem = 0
> CALL read_dir
> CALL all_utl
> DO I = 7 TO libmem.0
> MEMBER = STRIP(libmem.I)
> CALL copy_mem
> END
>
> CALL end_expds
> /* ------------------------ */
>
> all_utl:
>
> "LISTDS '"user"."SEQFILE".EXPDS'"
> IF RC = 0 THEN DO
> " DEL '"user"."SEQFILE".EXPDS'"
> END
>
> " ALLOC FI(OUT) DA('"user"."SEQFILE".EXPDS') MOD CATALOG",
> " RECFM (F B) DSORG(PS) SP(10 10) CYL ",
> " LRECL(80) BLKSIZE(8000) UNIT(3390) "
> IF RC > 0 THEN
> DO
> temp_rc = RC
> temp_ftc = "ALLOC ERROR"
> CALL rou_rc
> END
> RETURN
>
> copy_mem:
>
> tot_mem = tot_mem + 1
> ROUT.0 = 1
> ROUT.1 = "./ ADD LEVEL=00,SOURCE=0,NAME="MEMBER
> "EXECIO * DISKW OUT (FINIS STEM ROUT."
> IF RC > 0 THEN
> DO
> temp_rc = RC
> temp_ftc = "EXECIO ERROR"
> CALL rou_rc
> END
>
> " REPRO INDATASET('"libparm"("MEMBER")' ) OUTFILE(OUT) "
> IF RC > 0 THEN
> DO
> temp_rc = RC
> temp_ftc = "REPRO ERROR"
> CALL rou_rc
> END
> RETURN
>
> read_dir:
> X = OUTTRAP("libmem.")
> "LISTDS '"libparm"' M"
> IF RC > 0 THEN
> DO
> temp_rc = RC
> temp_ftc = "LISTDS ERROR"
> CALL rou_rc
> END
> X = OUTTRAP("OFF")
> IF libmem.0 < 8 THEN
> DO
> temp_ftc = "PDS IS EMPTY"
> temp_rc = 4
> CALL rou_rc
> END
> RETURN
>
> rou_rc:
>
> IF temp_rc > 0 THEN
> temp_grc = temp_rc
> SAY " > ERROR < "
> SAY " > FUNCTION/REXX < " temp_ftc
> SAY " > RETURN CODE < " temp_rc
>
> temp_rc = 0
> temp_ftc = ""
>
> CALL end_expds
> RETURN
>
> end_expds:
>
> " FREE DATASET('"user"."SEQFILE".EXPDS')"
>
> IF temp_grc = 0 THEN DO
> SAY "MEMBERS SUCCESSFULLY PROCESSED: "tot_mem
> END
> EXIT temp_grc
>
> On Thu, May 28, 2020 at 11:13 AM Wayne Bickerdike <[email protected]>
> wrote:
>
>> I have used REXX to do this. One flavour uses IDCAMS REPRO, the other
>> uses EXECIO.
>>
>> It builds the member list from a LISTDS MEMBERS.
>>
>> It adds ./ADD IEBUPDTE statements to the flat file in order to move to
>> other systems. It's a readable option compared to using XMIT on a PDS>
>>
>>
>>
>> On Thu, May 28, 2020 at 11:05 AM Lizette Koehler <[email protected]>
>> wrote:
>>
>>> Personally I would use REXX and LM functions to read through PDS members
>>> and
>>> action them.
>>>
>>> I did that when I needed to update all Members in a PDS to insert some
>>> additional control cards
>>>
>>> REXX with ISPF LM (Library Management) functions work very well for this.
>>>
>>> Lizette
>>>
>>>
>>> -----Original Message-----
>>> From: IBM Mainframe Discussion List <[email protected]> On
>>> Behalf Of
>>> Sri h Kolusu
>>> Sent: Wednesday, May 27, 2020 3:08 PM
>>> To: [email protected]
>>> Subject: Re: Sort extracting values in PDS members
>>>
>>> ITschak,
>>>
>>> I already responded to this topic. Not sure where it went, but I did
>>> respond
>>> before your email. You can use IEPTPCH to flatten the PDS to a sequential
>>> file. If you use STOPAFT=5 then it will only print the 5 lines of the
>>> PDS.
>>> So don't have to use SUPERC
>>>
>>> Thanks,
>>> Kolusu
>>> DFSORT Development
>>> IBM Corporation
>>>
>>> IBM Mainframe Discussion List <[email protected]> wrote on
>>> 05/27/2020 02:50:28 PM:
>>>
>>> > From: ITschak Mugzach <[email protected]>
>>> > To: [email protected]
>>> > Date: 05/27/2020 02:51 PM
>>> > Subject: [EXTERNAL] Re: Sort extracting values in PDS members Sent by:
>>> > IBM Mainframe Discussion List <[email protected]>
>>> >
>>> > I would start with creating a single file using a ISRSUPC (it works
>>> outside
>>> > of ISPF, try opt 3.14 background option to generate the JCL) searching
>>> for
>>> > the two keywords you are looking for.
>>> >
>>> > ITschak
>>> > ITschak Mugzach
>>> > *|** IronSphere Platform* *|* *Information Security Continuous
>>> > Monitoring for z/OS, x/Linux & IBM I **| z/VM comming son *
>>> >
>>> >
>>> >
>>> >
>>> > On Wed, May 27, 2020 at 11:41 PM Billy Ashton <[email protected]>
>>> > wrote:
>>> >
>>> > > Hi again! This group has been so helpful - especially Kolusu - and I
>>> > > have one more question as I learn how to use SORT more creatively.
>>> > >
>>> > > I have a bunch of PDS files where I have to read through each member
>>> and
>>> > > create some control cards based on the content in the member (due to
>>> the
>>> > > nature of these files, the request needs to be vague). So here are
>>> > > the
>>> > > questions:
>>> > > 1. Is there a way to automatically read all members of a PDS? If
>>> > > not, I can generate the individual file names with member in a
>>> > > separate process.
>>> > > 2. When I read each member, I will be looking for KEYWORD(value) -
>>> > > the keyword will be either "KEYWORD1" or "LONGKEYWORD2" and will be
>>> > > within the first 5 lines of the member, at which point I stop
>>> > > reading (some of the members have 25000 lines!), and the Keyword
>>> > > could be anywhere on
>>> the
>>> > > line, in column 1 or with a space delimiter. Keyword can be 8 or 12
>>> > > characters long, and Value can be 2 to 8 characters.
>>> > > 3. I then need to create a string of -ADD- Value.Keyword.Dyyyymmdd
>>> > > (Today's date) that I will use in my further processing.
>>> > >
>>> > > Note that I could write a program to manage this, but am trying to
>>> > > keep the processing in a control member rather than a program, as
>>> > > utility programs seem to get lost around here.
>>> > >
>>> > > Since I can't show you the real input, here is some contrived data:
>>> > >
>>> > > Member1:
>>> > > KEYWORD1(val) Otherkw(val) Otherkey2(anothervalue)
>>> > > Line2
>>> > > Line3
>>> > > etc.
>>> > >
>>> > > Member 2:
>>> > > Line 1
>>> > > Line 2
>>> > > Otherkw(val) Otherkw2(val) LONGKEYWORD2(longvalu) Otherkw3(val) etc.
>>> > >
>>> > > Member 3:
>>> > > Line 1
>>> > > Otherkw1(withitslongvalue) LONGKEYWORD2(valu) Line 3 etc.
>>> > >
>>> > > Member 4:
>>> > > Line 1
>>> > > Line 2
>>> > > Line 3
>>> > > Line4
>>> > > KW(val) Anotherkw(anditsvalue) Alongkeywordhere(withalongvalue)
>>> > > KEYWORD1(va)
>>> > > etc.
>>> > >
>>> > > This would create the output (either in a single MOD file, or
>>> > > separate files I can put together myself:
>>> > > VAL.KEYWORD1.D20200527
>>> > > LONGVALU.LONGKEYWORD2.D20200527
>>> > > VALU.LONGKEYWORD2.D20200527
>>> > > VA.KEYWORD1.D20200527
>>> > >
>>> > > Can something like this be done in a DFSORT step? If not, I can
>>> > > write the various utilities myself in Rexx and/or COBOL, so you
>>> > > don't need to suggest that.
>>> > >
>>> > > Thanks for your help once more!
>>> > > Billy
>>> > >
>>> > > --------------------------------------------------------------------
>>> > > -- For IBM-MAIN subscribe / signoff / archive access instructions,
>>> > > send email to [email protected] with the message: INFO
>>> > > IBM-MAIN
>>> > >
>>> >
>>> > ----------------------------------------------------------------------
>>> > For IBM-MAIN subscribe / signoff / archive access instructions, send
>>> > email to [email protected] with the message: INFO IBM-MAIN
>>> >
>>>
>>> ----------------------------------------------------------------------
>>> For IBM-MAIN subscribe / signoff / archive access instructions, send
>>> email
>>> to [email protected] with the message: INFO IBM-MAIN
>>>
>>> ----------------------------------------------------------------------
>>> For IBM-MAIN subscribe / signoff / archive access instructions,
>>> send email to [email protected] with the message: INFO IBM-MAIN
>>>
>>
>>
>> --
>> Wayne V. Bickerdike
>>
>>
>
> --
> Wayne V. Bickerdike
>
>
--
Wayne V. Bickerdike
----------------------------------------------------------------------
For IBM-MAIN subscribe / signoff / archive access instructions,
send email to [email protected] with the message: INFO IBM-MAIN