Joined: 23 Dec 2005 Posts: 61 Location: Providence , US
Hi All,
I am facing problem with the rexx which have written for this problem ,
Problem:
I have a flat file which has 2 rows , first consists of number of members in
a particular PDS and the second row consists of the name of that PDS.
Now , My REXX code will read the flat file and will first check for the existence of that pds using LISTCAT , if the pds exists it will create 2 diff pds 's one for cobolsor and other one for copylib using the same name .
Now it scans the PDS and if the name starts with 'FWG0' it puts them in copylib pds else puts them in cobolsor pds which have been created in previous step.
MY REXX Code is :
Code:
/* REXX */
"EXECIO * DISKR INFILE(STEM INPUT."
PDSNAME = STRIP(INPUT.2)
CALL OUTTRAP "LISTC."
"LISTCAT ENTRIES('"PDSNAME"')"
IF RC \= 0 THEN DO
SAY "ERROR: DATA SET DOES NOT EXIST"
EXIT 12
END
CALL OUTTRAP "OFF"
PDSNAMEPGM = SUBSTR(PDSNAME,1,20)||'.COBOLSOR'
PDSNAMECPY = SUBSTR(PDSNAME,1,20)||'.COPYLIB'
"ALLOCATE DA('"PDSNAMEPGM"') LIKE('"PDSNAME"') NEW"
IF RC > 0 THEN DO
SAY "ERROR: FAILURE TO ALLOCATE DATASET" PDSNAMEPGM
EXIT 8
END
"ALLOCATE DA('"PDSNAMECPY"') LIKE('"PDSNAME"') NEW"
IF RC > 0 THEN DO
SAY "ERROR: FAILURE TO ALLOCATE DATASET" PDSNAMECPY
EXIT 8
END
CALL OUTTRAP "TRAP."
"LISTD'"||PDSNAME||"'MEMBERS"
CALL OUTTRAP "OFF"
I = 1
MEM_FOUND = "FALSE"
DO UNTIL MEM_FOUND = "TRUE"
SAY TRAP.I
IF TRAP.I = "--MEMBERS--" THEN DO
I = I + 1
MEM_FOUND = "TRUE"
END
ELSE DO
I = I + 1
END
END
J = 0
DO UNTIL I = TRAP.0
IF SUBSTR(STRIP(TRAP.I),1,4) = 'FWG0' THEN DO
X = STRIP(TRAP.I)
/* "ALLOC F(MYINDD) DS('"DSNAME"("X")') SHR REUSE"
"ALLOC F(MYOUTDD) DS('"PDSNAMECPY"("X")') SHR REUSE"
"EXECIO * DISKR MYINDD (FINIS"
"EXECIO * DISKW MYOUTDD (FINIS"
"FREE F(MYINDD) F(MYOUTDD)" */
END
ELSE DO
X = STRIP( TRAP.I)
/* "ALLOC F(MYINDD) DS('"DSNAME"("X")') SHR REUSE"
"ALLOC F(MYOUTDD) DS('"PDSNAMEPGM"("X")') SHR REUSE"
"EXECIO * DISKR MYINDD (FINIS"
"EXECIO * DISKW MYOUTDD (FINIS"
"FREE F(MYINDD) F(MYOUTDD)" */
END
I = I + 1
J = J + 1
END
IF J = INPUT.1 THEN DO
SAY 'SUCCESS'
END
ELSE DO
SAY "ERROR: INCOSISTENT DATA MOVEMENT"
EXIT 12
END
As far as using 'X' for a variable name, since it is the REXX representation for hexadecimal, that seems to be why there's a problem. Simple solution - use another variable, or use something like "_X" or "#X".
Rgearding your first issue: LISTD is not a TSO command. You probably need LISTDS.
For the second issue: Dont use X as a variable name. The fine manual says that every X followed by a single or double quotation mark is considered to be hexadecimal string. Try something more meaninfull (what's wrong with MEMNAME?)
If I may add: To check is a dataset is cataloged, you better use the TSO external function LISTDSI.
Unless the length of PDSNAME is pre-known, you might want to verify that the last character is not '.', to avoid two consecutive dots.
The first member in the output of LISTDS will always be in line 7. You can remove the first DO UNTIL.
Look in google for an article named "To address ot not to address". You will see that sometimes it's good to add "ADDRESS TSO" before each statement.
CHECKINPDS:
CALL OUTTRAP "LISTC."
"LISTCAT ENTRIES('"PDSNAME"')"
IF RC \= 0 THEN DO
SAY "ERROR " RC " WHEN TRYING TO ACCESS CATALOG FOR " PDSNAME
EXIT 08
END
CALL OUTTRAP "OFF"
RETURN
CHECKOUTPDS:
CALL OUTTRAP "LISTC."
"LISTCAT ENTRIES('"PDSNAMEPGM"')"
IF RC = 0 THEN DO
PDSEXIST = 'Y'
END
ELSE DO
"ALLOCATE DA('"PDSNAMEPGM"') LIKE('"PDSNAME"') NEW"
IF RC > 0 THEN DO
SAY "ERROR " RC " FAILURE TO ALLOCATE DATASET " PDSNAMEPGM
EXIT 8
END
END
"LISTCAT ENTRIES('"PDSNAMECPY"')"
IF RC = 0 THEN DO
CPYEXIST = 'Y'
END
ELSE DO
"ALLOCATE DA('"PDSNAMECPY"') LIKE('"PDSNAME"') NEW"
IF RC > 0 THEN DO
SAY "ERROR " RC " FAILURE TO ALLOCATE DATASET " PDSNAMECPY
EXIT 8
END
END
CALL OUTTRAP "OFF"
RETURN
MOVEMEMBERS:
DO UNTIL I > TRAP.0
IF SUBSTR(STRIP(TRAP.I),1,4) = 'FWG0' THEN DO
MEMNAME = STRIP(TRAP.I)
IF CPYEXIST = 'Y' THEN DO
CALL LISTCPYMEM
CALL AUDITTRAIL
END
CALL CPYCOPYBOOK
END
ELSE DO
MEMNAME = STRIP(TRAP.I)
IF PDSEXIST = 'Y' THEN DO
CALL LISTPDSMEM
CALL AUDITTRAIL
END
CALL CPYPROGRAM
END
I = I + 1
J = J + 1
END
RETURN
AUDITTRAIL:
L = 7
K = CPY.0
DT = DATE('USA')
AUDFND = 'N'
CALL AUDCHKMEM
IF AUDFND = 'Y' THEN DO
AUDIT.AUDITCNT = DT||" "||MEMNAME||" ADDED FROM "||PDSNAME
AUDITCNT = AUDITCNT + 1
END
RETURN
AUDCHKMEM:
DO UNTIL L > CPY.0
IF MEMNAME = STRIP(CPY.L) THEN DO
AUDFND = 'Y'
L = L + CPY.0
END
L = L + 1
END
RETURN