I have an macro, please find the attachment, where i am applying a macro on a sequential file, if the macro is applied on PDS,
ADDRESS ISPEXEC
"ISREDIT (MEMNAME) = MEMBER"
The above piece of code helps to get the member name where the macro is applied. For Sequential file(PS) is there anyway to get the dataset name? Please suggest.
The macro is run with the help of runmacro.Please find the attachment for the same.
/*******REXX**********/
ADDRESS ISPEXEC
"ISREDIT MACRO"
ADDRESS ISPEXEC
"CONTROL ERRORS RETURN"
CNTS1 = 00000000
CNTS2 = 00000000
CNTS3 = 00000000
USEID = USERID()
DS = USEID||'.R107YB.REXX.OUTPUT'
ADDRESS TSO
"ALLOC F(OUT) DA('"DS"') MOD"
ADDRESS ISPEXEC
"ISREDIT (MEMNAME) = MEMBER"
ADDRESS ISPEXEC
"ISREDIT F IDENTIFICATION 8"
IF RC <> 0 THEN
DO
OUT.1 = MEMNAME 'IS NOT A COBOL PGM'
ADDRESS TSO
'EXECIO * DISKW OUT(STEM OUT. FINIS)'
'FREE F(OUT)'
CALL PGM_EXIT
END
/* macro to filter only the comments in a cobol pgm */
ADDRESS ISPEXEC
"ISREDIT X ALL"
"ISREDIT F ALL '*' 7 "
IF RC = 0 THEN
DO
/* macro to get the count value for comments */
ADDRESS ISPEXEC
"ISREDIT (CNTS1) = FIND_COUNTS"
"ISREDIT (MEMNAME) = MEMBER"
END
ADDRESS ISPEXEC
/* macro to find the total lines used in a cobol pgm */
"ISREDIT X ALL"
"ISREDIT F ALL P'=' 7 "
IF RC = 0 THEN
DO
/* macro to get the count value for total lines */
ADDRESS ISPEXEC
"ISREDIT (CNTS2) = FIND_COUNTS"
"ISREDIT (MEMNAME) = MEMBER"
END
/* macro to find the blank lines used in a cobol pgm */
ADDRESS ISPEXEC
"ISREDIT X ALL"
"ISREDIT F ALL P'@' 7 72"
"ISREDIT DEL ALL NX"
"ISREDIT F ALL X'40' 7"
IF RC = 0 THEN
DO
/* macro to get the count value for blank lines */
ADDRESS ISPEXEC
"ISREDIT (CNTS3) = FIND_COUNTS"
"ISREDIT (MEMNAME) = MEMBER"
END
IF RC = 0 THEN
DO
L1= SUBSTR(MEMNAME,1,10)
X1= SUBSTR(COMMENTS,1,10)
X2= SUBSTR(CODE,1,10)
X3= SUBSTR(BLANKS,1,10)
Y1= SUBSTR(CNTS1,1,10)
Y2= SUBSTR(CNTS2,1,10)
Y3= SUBSTR(CNTS3,1,10)
OUT.1 = L1 || X1 || Y1
OUT.2 = ' ' || X2 || Y2
OUT.3 = ' ' || X3 || Y3
ADDRESS TSO
'EXECIO * DISKW OUT(STEM OUT. FINIS)'
'FREE F(OUT)'
END
PGM_EXIT:
ADDRESS ISPEXEC "ISREDIT CANCEL"
EXIT
and Run macro.
Code:
/***********REXX******************/
SAY 'Enter Input PDS'
PULL DSNNAME
USRID = USERID()
DS = USRID||'.R107YB.REXX.OUTPUT'
MACLIST = N242712.R107YB.REXX.MACLIST
MAC = "'N242712.R107YB.REXX.MACLIST'"
DSNNAME = STRIP(DSNNAME)
MACLIS = STRIP(MACLIST)
DSN = "'"DSNNAME"'"
SAY DSN
DSORG = LISTDSI(DSN)
SAY 'DSORG=' DSORG
SAY 'SYSDSORG=' SYSDSORG
/* IF SYSDSORG = 'PS' */
ADDRESS ISPEXEC
"ISREDIT MACRO"
PARM1 = ''
ADDRESS ISPEXEC
"CONTROL ERRORS RETURN"
X = SYSDSN("'"DS"'")
IF X = 'OK' THEN
DO
ADDRESS TSO
"DELETE '"DS"'"
END
ADDRESS TSO
"ALLOC DA ('"DS"') NEW ",
"LRECL(80) RECFM(F B) ",
"DSORG(PS) SPACE(10,10) TRACKS"
/*********************************************************************
MEMBER = ' '
LMRC = 0
/*********************************************************************
CALL T0001_LMINIT
CALL T0002_LMOPEN
/********************************************************************/
DO WHILE LMRC = 0
IF SYSDSORG= 'PO' THEN
DO
CALL T0003_LMLIST
END
SELECT
WHEN LMRC = 8 THEN
DO
SAY 'END OF PROCESSING DATASET: ' DSNNAME
EXIT
END
WHEN LMRC = 0 THEN
DO
IF SYSDSORG = 'PS' THEN
CALL T0004_EDITMACRO DSNNAME MACLIST
ELSE NOP
IF SYSDSORG = 'PO' THEN
CALL T0005_LISTMACRO MEMBER MACLIST
ELSE NOP
END
/*
IF LENGTH(STRIP(PARM1)) > 0 THEN
CALL T0004_EDITMACRO MEMBER PARM1
ELSE NOP
IF LENGTH(STRIP(PARM1)) = 0 THEN
CALL T0005_LISTMACRO MEMBER MACLIST
ELSE NOP
END */
OTHERWISE
DO
SAY 'ERROR IN PROCESSING PDS: ' DSNNAME 'MEMBER :' MEMBER
SAY 'FAILED IN (LMMLIST) MEM LISTING'
CALL T9999_LMENDING
END
END
END
EXIT
/*********************************************************************/
T0001_LMINIT:
ADDRESS ISPEXEC
"LMINIT DATAID("MYDI") DATASET('"DSNNAME"') ENQ(SHR)"
RETURN
/*********************************************************************/
T0002_LMOPEN:
ADDRESS ISPEXEC
"LMOPEN DATAID("MYDI") OPTION(INPUT)"
IF RC = 0
THEN
NOP
/* SAY '*** SUCCESSFULLY OPENED PDS :' DSNNAME '***' */
ELSE
DO
SAY 'PROBLEM IN OPENING DATASET : ' DSNNAME
"LMFREE DATAID("MYDI")"
EXIT
END
LMRC = RC
RETURN
/*******************************************************************
T0003_LMLIST:
ADDRESS ISPEXEC 'LMMLIST DATAID('MYDI') OPTION(LIST),
MEMBER(MEMBER) STATS(NO)'
LMRC = RC
RETURN
/******************************************************************
T0004_EDITMACRO:
SAY 'ENTERED INTO T0004_EDITMACRO'
ARG MBR1 MCFILE
SAY 'MBR1=' MBR1 'MACLIST=' MCFILE
ADDRESS TSO
"ALLOC F(INDD) DA('"STRIP(MCFILE)"') SHR REUSE"
ADDRESS TSO
"EXECIO * DISKR INDD (STEM VAR. FINIS)"
ADDRESS TSO
"FREE F(INDD)"
DO I = 1 TO VAR.0
ADDRESS ISPEXEC 'VIEW DATAID('MYDI')
MACRO('SUBSTR(STRIP(VAR.I),1,8)')'
IF RC = 0 | RC = 4
THEN
DO
LMRC = 8
END
ELSE
DO
SAY 'PROBLEM IN MACRO :' MCFILE 'MEMBER :'
MEMBER 'RC :' RC
CALL T9999_LMENDING
END
END
RETURN
/*******************************************************************/
T0005_LISTMACRO:
SAY 'ENTERED INTO T0005_LISTMACRO'
SAY 'MBRN=' MBRN 'MCFILE=' MCFILE
ARG MBRN MCFILE
DISMAC = ''
ADDRESS TSO
"ALLOC F(INDD) DA('"STRIP(MCFILE)"') SHR REUSE"
ADDRESS TSO
"EXECIO * DISKR INDD (STEM VAR. FINIS)"
ADDRESS TSO
"FREE F(INDD)"
DO I = 1 TO VAR.0
/* SAY '*** PROCESSING MEMBER & APPLYING MACRO :' MEMBER */
ADDRESS ISPEXEC 'VIEW DATAID('MYDI') MEMBER('MBRN')
MACRO('SUBSTR(STRIP(VAR.I),1,8)')'
DISMAC = SUBSTR(STRIP(VAR.I),1,8)
IF RC = 0 | RC = 4
THEN
DO
/* SAY '*** PROCESSED MEMBER :' MEMBER 'MACRO :' DISMAC ,
'RC :' RC '***'*/
LMRC = 0
END
ELSE
DO
/* SAY 'WARNING IN MACRO :' PARM1 'MEMBER :' MEMBER 'RC :' RC*
CALL T9999_LMENDING
END
END
RETURN
after 84 posts haven' t You learned yet to use the code tags ??
for Your request , to post the code is of no use,
as I said before, search the forums, or read the docs
when i executed the above piece of code using TSO EXEC command it is working fine. when i tried it in batch mode it is not working, may be i missed some libraries in the jcl.
You missed some the ISPF libraries
or You invoked the rexx in the wrong way
it should have been something in the style "ISPSTART command(....)"
but it would be better to check the manual
I ran other rexx program with the same jcl it went fine. but for this code i am using edit macros which i feel is not entertained because of some library being missed i guess. The RC is -3 for the commands with EDIT Macros.
I have added the ISPSTART CMD(%RUNLOC), But it is till giving RC(20) for
ADDRESS ISPEXEC
"ISREDIT MACRO"
ADDRESS ISPEXEC
"CONTROL ERRORS RETURN"
Code:
READY
ISPSTART CMD(%RUNLOC)
ISPF system data set allocation error - press Enter to continue.
Log file allocation error - ISPF will operate without a log data set.
Data set 'N141129.AE31.SPFLOG1.LIST' in use by another user, try later.
Enter Input PDS
4 *-* /**/
5 *-* DSNNAME='N242712.RETRIEVE.PDS'
>>> "N242712.RETRIEVE.PDS"
6 *-* DSNNAME = STRIP(DSNNAME)
>>> "N242712.RETRIEVE.PDS"
7 *-* Y = SYSDSN("'"DSNNAME"'")
>>> "OK"
8 *-* IF Y <> 'OK'
>>> "0"
13 *-* USRID = USERID()
>>> "N141129"
14 *-* DSNNAME = STRIP(DSNNAME)
>>> "N242712.RETRIEVE.PDS"
15 *-* DS = USRID||'.R107YB.REXX.OUTPUT'
>>> "N141129.R107YB.REXX.OUTPUT"
16 *-* MACLIST = N242712.R107YB.REXX.MACLIST
>>> "N242712.R107YB.REXX.MACLIST"
17 *-* MAC = "'N242712.R107YB.REXX.MACLIST'"
>>> "'N242712.R107YB.REXX.MACLIST'"
18 *-* MACLIS = STRIP(MACLIST)
>>> "N242712.R107YB.REXX.MACLIST"
19 *-* DSN = "'"DSNNAME"'"
>>> "'N242712.RETRIEVE.PDS'"
20 *-* DSORG = LISTDSI(DSN)
>>> "0"
21 *-* /**/
22 *-* PARM1 = ''
>>> ""
23 *-* ADDRESS ISPEXEC
24 *-* "ISREDIT MACRO"
>>> "ISREDIT MACRO"
[b]+++ RC(20) +++ [/b]
25 *-* ADDRESS ISPEXEC
26 *-* "CONTROL ERRORS RETURN"
>>> "CONTROL ERRORS RETURN"
27 *-* X = SYSDSN("'"DS"'")
>>> "OK"
28 *-* IF X = 'OK'
>>> "1"
*-* THEN
29 *-* DO
30 *-* ADDRESS TSO
31 *-* "DELETE '"DS"'"
>>> "DELETE 'N141129.R107YB.REXX.OUTPUT'"
ENTRY (A) N141129.R107YB.REXX.OUTPUT DELETED
32 *-* END
33 *-* ADDRESS TSO
34 *-* "ALLOC DA ('"DS"') NEW ","LRECL(80) RECFM(F B) ","DSORG(PS) SPACE(10,
>>> "ALLOC DA ('N141129.R107YB.REXX.OUTPUT') NEW LRECL(80) RECFM(F B)
37 *-* /**/ 38 *-* MEMBER = ' '
>>> " "
39 *-* LMRC = 0
>>> "0"
40 *-* /**/
41 *-* CALL T0001_LMINIT
82 *-* T0001_LMINIT:
83 *-* ADDRESS ISPEXEC
84 *-* "LMINIT DATAID("MYDI") DATASET('"DSNNAME"') ENQ(SHR)"
>>> "LMINIT DATAID(MYDI) DATASET('N242712.RETRIEVE.PDS') ENQ(SHR)"
85 *-* RETURN
42 *-* CALL T0002_LMOPEN
87 *-* T0002_LMOPEN:
88 *-* ADDRESS ISPEXEC
89 *-* "LMOPEN DATAID("MYDI") OPTION(INPUT)"
>>> "LMOPEN DATAID(ISR00001) OPTION(INPUT)"
+++ RC(8) +++
90 *-* IF RC = 0
>>> "0"
93 *-* /**/
94 *-* ELSE
95 *-* DO
96 *-* SAY 'PROBLEM IN OPENING DATASET : ' DSNNAME
>>> "PROBLEM IN OPENING DATASET : N242712.RETRIEVE.PDS"
PROBLEM IN OPENING DATASET : N242712.RETRIEVE.PDS
97 *-* "LMFREE DATAID("MYDI")"
>>> "LMFREE DATAID(ISR00001)"
98 *-* EXIT
READY
END
I have corrected the issue but the contention message is troubling me again
Code:
READY
ISPSTART CMD(%RUNLOC)
ISPF system data set allocation error - press Enter to continue.
Log file allocation error - ISPF will operate without a log data set.
Data set 'N141129.AE31.SPFLOG1.LIST' in use by another user, try later.