View previous topic :: View next topic
|
Author |
Message |
jackzhang75
Active User
Joined: 09 Jun 2014 Posts: 125 Location: US
|
|
|
|
Hi experts,
I want to wirte the rexx to rename list of VSAM and OSAM file in batch . But i got two questions regarding to this .
1. How to use rexx to find all the VSAM or OSAM data set in the system?
for example how to get list of all the data set begining with #IMSS1.**
Code: |
#IMSS1
#IMSS1.GC.GCACPCD1
#IMSS1.GC.GCACPCD1.DATA
#IMSS1.GC.GCACPCD3
#IMSS1.GC.GCACPCD3.DATA
#IMSS1.GC.GCACPCD5
#IMSS1.GC.GCACPCD5.DATA
#IMSS1.GC.GCACPCD7
#IMSS1.GC.GCACPCD7.DATA
#IMSS1.GC.GCACPCD9
#IMSS1.GC.GCACPCD9.DATA
#IMSS1.GC.GCACPCX1
#IMSS1.GC.GCACPCX1.DATA
#IMSS1.GC.GCACPCX1.INDEX |
and so on
2. After step 1, How to rename it , i know for pds using rename but what the command for VSAM and OSAM ?
Thanks |
|
Back to top |
|
|
Nic Clouston
Global Moderator
Joined: 10 May 2007 Posts: 2455 Location: Hampshire, UK
|
|
|
|
Have you referred to the AMS manual? Do you know about LISTCAT? Do you know how to use IDCAMS to rename datasets? |
|
Back to top |
|
|
jackzhang75
Active User
Joined: 09 Jun 2014 Posts: 125 Location: US
|
|
|
|
Hi,
Thanks for your answer, i figured out ,it works.
Here is the code:
Code: |
/* rexx */
THEPDS = "' #IMSS1'" /* data set want to change */
X = OUTTRAP('ML.')
"LISTCAT LEVEL("THEPDS")"
X = OUTTRAP('OFF')
A=0
MEMBER.=0
DO N = 1 TO ML.0
PARSE VAR ML.N MEMBER.N
IF SUBSTR(MEMBER.N,1,7)='NONVSAM'|,
SUBSTR(MEMBER.N,1,5)='INDEX'|,
SUBSTR(MEMBER.N,1,7)='CLUSTER'|,
SUBSTR(MEMBER.N,1,4)='DATA' THEN DO
OUTPUT.N=SUBSTR(MEMBER.N,17,50)
A=A+1
OUTPUT.A=STRIP(OUTPUT.N)
END
end
DO I= 1 to A
OLDNAME=' #IMSS1' /* old data set name */
TMPTXT1= ' #IMSS2' /* new data set name change to any name you want*/
NEWSTR.I =OUTPUT.I
DO WHILE POS(oldname,NEWSTR.I) > 0
NEWSTR.I = SUBSTR(NEWSTR.I, 1 , POS(oldname,NEWSTR.I)-1) ||,
TMPTXT1 || SUBSTR(NEWSTR.I, POS(oldname,NEWSTR.I) + LENGTH(oldname))
END
"ALTER '"OUTPUT.I"'",
"NEWNAME('"NEWSTR.I"')"
END |
|
|
Back to top |
|
|
Nic Clouston
Global Moderator
Joined: 10 May 2007 Posts: 2455 Location: Hampshire, UK
|
|
|
|
Great. Now all you have to do is to amend the program so that it takes THEPDS (need a better name!) as an argument that can be specified on the command line. |
|
Back to top |
|
|
Pete Wilson
Active Member
Joined: 31 Dec 2009 Posts: 580 Location: London
|
|
|
|
You also need to cater for any 'associations' the VSAM files you're renaming....i.e. any that have AlX's or PATH's related to them. In the LISTCAT you need to include the CDILVL parameter (ZOS1.13 and up) if using masking to be certain of identifying them. Or use something like DFDSS DUMP with SPHERE and PARM='TYPRUN=NORUN' on the exec
And for NONVSAM you have to deal with any ALIASes that may be pointing to the file being renamed (usually PDS's, but strictly).
Also consider that by renaming the datasets in place they may effectively be outside the expected storage pool for those names. Sometimes a DFDSS COPY with RENAMEU is better as it renames and moves the files to the correct pool based on DFSMS routines. |
|
Back to top |
|
|
Marso
REXX Moderator
Joined: 13 Mar 2006 Posts: 1353 Location: Israel
|
|
|
|
Because you made the effort to write your own code and post it here, I will make an effort too.
A few remarks about your code:
1. in both loops you use stem variables when not necessary, it just makes the code more complicated.
2. in the 2nd loop, the OLDNAME starts with a space, but you stored the name with STRIP, so there will be no hits.
3. You should assign OLDNAME and TMPTXT1 before the loop, not inside.
4. Use indentation.
5. Add documentation.
Code: |
/* --------------------------------------- Make list of files */
ThePDS = '#IMSS1'
X = OutTrap('ML.')
"LISTCAT LEVEL('"ThePDS"')"
X = OutTrap('OFF')
/* ----------------------------- Keep only relevant filenames */
A = 0
OldList. = ''
Do N = 1 To ML.0
Parse Var ML.N Type . Name .
If WordPos(Type,'NONVSAM INDEX DATA CLUSTER') > 0 Then Do
A = A + 1
OldList.A = Name
End
End
/* --------------------------------------------- Rename files */
OldStr = '#IMSS1'
NewStr = '#IMSS2'
Do I = 1 To A
NewFile = OldList.I
Do Forever
S = Pos(OldStr,NewFile)
If S = 0 Then Leave
NewFile = SubStr(NewFile,1,S-1) || NewStr || ,
SubStr(NewFile,S+Length(OldStr))
End
say 'ALTER from 'OldList.I 'to' NewFile
End |
Of course, you don't have to write like this, that's just how I like to do it |
|
Back to top |
|
|
jackzhang75
Active User
Joined: 09 Jun 2014 Posts: 125 Location: US
|
|
|
|
Hi Marso,
Thanks for your code. I like it.
one thing is i think you missed the actual code to do the rename.
I added it in your code .
Code: |
/* REXX ---------------------------------- MAKE LIST OF FILES */
THEPDS = 'TTAT.TSP.TU14.CHANGED'
X = OUTTRAP('ML.')
"LISTCAT LEVEL('"THEPDS"')"
X = OUTTRAP('OFF')
/* ----------------------------- KEEP ONLY RELEVANT FILENAMES */
A = 0
OLDLIST. = ''
DO N = 1 TO ML.0
PARSE VAR ML.N TYPE . NAME .
IF WORDPOS(TYPE,'NONVSAM INDEX DATA CLUSTER') > 0 THEN DO
A = A + 1
OLDLIST.A = NAME
END
END
/* --------------------------------------------- RENAME FILES */
OLDSTR = 'CHANGED'
NEWSTR = 'HAO'
DO I = 1 TO A
NEWFILE = OLDLIST.I
DO FOREVER
S = POS(OLDSTR,NEWFILE)
IF S = 0 THEN LEAVE
NEWFILE = SUBSTR(NEWFILE,1,S-1) || NEWSTR || ,
SUBSTR(NEWFILE,S+LENGTH(OLDSTR))
END
[b] "ALTER '"OLDLIST.I"'",
"NEWNAME('"NEWFILE"')" [/b]
SAY 'ALTER FROM 'OLDLIST.I 'TO' NEWFILE
END |
|
|
Back to top |
|
|
enrico-sorichetti
Superior Member
Joined: 14 Mar 2007 Posts: 10872 Location: italy
|
|
|
|
nope he did not miss it
it used a say <the command that would be executed>
it is a pretty normal thing to do when testing ...
You say what You are going to do before doing it until the tests show that everything is right |
|
Back to top |
|
|
enrico-sorichetti
Superior Member
Joined: 14 Mar 2007 Posts: 10872 Location: italy
|
|
|
|
a coding alternative with a bit of lateral thinking
Code: |
OldHLQ = "#IMSS1"
NewHLQ = "#IMSS2"
lst.1 = "#IMSS1.DS1"
lst.2 = "#IMSS1.DS1.DATA"
lst.3 = "#IMSS1.DS2"
lst.4 = "#IMSS1.DS2.DATA"
lst.5 = "#IMSS1.DS3"
lst.0 = 5
do l = 1 to lst.0
interpret "parse var lst."l "with '"OldHLQ".' tail"
NewNAME = NewHLQ"."tail
say left("OldNAME("lst.l")",44) "NewNAME("NewNAME")"
end
|
|
|
Back to top |
|
|
jackzhang75
Active User
Joined: 09 Jun 2014 Posts: 125 Location: US
|
|
|
|
Hi enrico,
I am not very familar with " interpret " insturction , what does it do ?
Thanks |
|
Back to top |
|
|
Pedro
Global Moderator
Joined: 01 Sep 2006 Posts: 2545 Location: Silicon Valley
|
|
|
|
re: "what does REXX INTERPRET do?"
See here click here |
|
Back to top |
|
|
|