Lizette,
I used to do similar things to what you describe. You have a mine field of gotchas to navigate, so it sound to me like you've got a long way to go -- happy coding and debugging.
First there's just listing the file. I thinks the acronym was SMS, system managed storage. You really need to contend with 5 plus file systems to fully do the job. USS, QSAM, VSAM, LMF, and finally SMS variables. For example, I could not really get anywhere until I had programs that told if a dataset was migrated or not, that told if VSAM or not, told if RECFM=U or not, if cataloged or not, or if RACF protected or not.
My REXXLA code links (ZipLink) have bit the dust, but all the code I share are in my files folder at my Yahoo Groups site titled Buddy_Rex; the link is:
http://tech.groups.yahoo.com/group/Buddy_Rex. If that that seems a bit much, I am in the process of launching a new home for my REXX tools; that link is
http://marcirvin.com/rexxsc. The subfolder for TSO stuff is a work in process.
The in code doc for a program named SYSX.REXX(DSNNAMES)
SAY 'REXXNAME: DSNNAMES'
SAY ''
SAY 'FUNCTION: Used IP DSN to pass HOST list of dataset names.'
SAY ''
SAY "ENRTYFMT: DSNNAMES 'HQ.*' <*Resp> <*EXplicit> < *VSam >"
SAY " <*Quiet>"
SAY " <*Loud>"
SAY " <*Test>"
SAY " <*Sort>"
SAY " <*HSTAT>"
SAY " <*BAKDT>"
SAY ''
SAY " *Resp Means return list via the return code parameter. "
SAY " *Loud Means to write a list of the files to the console. "
SAY " *Sort Means sort file names list if HSTAT and BAKDT opts off."
SAY " *HSTAT MEANS TO RETURN THE QUALIFIERS CATALOG INFORMATION."
SAY " *BAKDT MEANS TO RETURN THE DATE DATASET WAS LAST BACKED UP."
SAY " *VSam MEANS TO RETURN LIST OF VSAM FILES. "
SAY " rc=04 Means no file names matched the input file name mask."
say ''
Here is another snippet just to demonstrate some of the hurdles / complexity I dealt with back in the day. There should be short cuts since I wrote this back in the nineties.
SYSX.REXX(LISTDSNS)
/* AN MVI EXEC */
SYS=ADDRESS()
IF SYS = 'TSO' | SYS = 'MVS' | SYS = 'ISREDIT' THEN TSO = 1; ELSE TSO = 0
IF SYS = 'DOS' | SYS = 'KEDIT' | SYS = 'CMD' THEN DOS = 1; ELSE DOS = 0
IF SYS = 'CMS' | SYS = 'XEDIT' | SYS = 'REXX' THEN CMS = 1; ELSE CMS = 0
...
...
BEGIN:
IF DATATYPE(RIGHT(USERID(),1)) = 'NUM'
THEN !USERID = LEFT(USERID(),LENGTH(USERID())-1)
ELSE !USERID = USERID()
"STATE '"!USERID".REXX'"
IF RC ^= 0 THEN DO
"DSNALLOC '"!USERID".REXX' *OPDIR(18)"
IF RC ^= 0 THEN SIGNAL ERR040
END
PARSE VAR ARGSTRING DSNS DSN .
IF LEFT(DSNS,1) = "'" & DSN = '' THEN DO
DSN = DSNS; DSNS = '*'
END
IF DSNS = '' THEN DSNS = '*' /* DEFAULT TO LISTING ENTIRE LIST OF DSNS */
IF DSN = '' THEN DSN = "REXX"
IF POS('(',DSN) > 0 THEN SIGNAL ERR060
IF LEFT(DSN,1) ^= "'" THEN DSN = "'"!USERID"."DSN"'"
GETFILES(DSN)
PICKDSNS()
IF DSNS.0 = 0 THEN SIGNAL ERR028
IF XEXEC
THEN DO
DSNS.0 = DSNS.0 - 6
WRITEMEM("'"!USERID".REXX(CMS)'")
END
ELSE DO N = 1 FOR DSNS.0
SAY DSNS.N
END
IF XEDIT THEN "IEDIT '"!USERID".REXX(CMS)'"
EXIT:
EXIT 000
...
...
GETFILES: PROCEDURE EXPOSE IDSN IDSNFND DSNS. DSNS !USERID
/* ONLY ENTER THIS LOGIC IF INPUT FILE NAME IS A PDS */
PARSE ARG DSN .
IF DSN = '' THEN !X = !USERID
X = OUTTRAP("DSNS.")
"LISTCAT LEVEL("DSN") NAMES"
X = OUTTRAP("OFF")
IDSNFND = 0
DO N = 1 FOR DSNS.0 /* STRIP OFF GARBAGE BEFORE MEM LIST */
IF WORD(DSNS.N,1) ^= 'NONVSAM'
THEN DSNS.N = ''
ELSE DSNS.N = "'"STRIP(WORD(DSNS.N,3))"'"
IF DSNS.N = IDSN THEN IDSNFND = 1
END
X = 0 /* GET RID OF SUPERFLUOUS ENTRIES */
DO N = 1 FOR DSNS.0
IF DSNS.N ^= ''
THEN DO
X = X + 1
DSNS.X = STRIP(DSNS.N)
RC = LISTDSI(DSNS.N)
FMTS.X = LEFT(SYSUNITS,3)'/'RIGHT(SYSUSED,5,'0'),
RIGHT(SYSLRECL,5,'0')'/'RIGHT(SYSBLKSIZE,5,'0'),
LEFT(SYSRECFM,3) LEFT(SYSREFDATE,8) '00:00' LEFT(SYSDSORG,2),
LEFT(SYSVOLUME,6)
END
END
DSNS.0 = X
GETFILEX:
RETURN 'NOP'
PICKMEMS: /* SELECT ALL MEMBERS THAT HAVE THE DESIRED PREFIX. */
IMEM = TRANSLATE(STRIP(IMEM))
X = POS('*',IMEM)
Y = POS('%',IMEM)
L = LENGTH(IMEM)
IF X = L
THEN DO N = 1 FOR MEMS.0 /* SET NULL VALS IF NO MATCH */
IF X = 1 THEN ITERATE
IF X - 1 > LENGTH(MEMS.N) THEN DO
MEMS.N = ''
ITERATE
END
IF POSCOMPR(LEFT(IMEM,X-1),LEFT(MEMS.N,X-1)) THEN MEMS.N = ''
END
IF X > 1 & X < L /* ENTER HERE WHEN STAR(*) IS IN MIDDLE */
THEN DO N = 1 FOR MEMS.0 /* SET NULL VALS IF NO MATCH */
IF POSCOMPR(LEFT(IMEM,X-1),LEFT(MEMS.N,X-1))
THEN DO
MEMS.N = ''
ITERATE N
END
IF POSCOMPR(RIGHT(IMEM,X-L),RIGHT(MEMS.N,X-L))
THEN DO
MEMS.N = ''
ITERATE N
END
END
IF X = 1
THEN DO N = 1 FOR MEMS.0 /* SET NULL VALS IF NO MATCH */
IF POSCOMPR(RIGHT(IMEM,L-1),RIGHT(MEMS.N,L-1)) THEN MEMS.N = ''
END
IF X = 0 & Y = 0
THEN DO
MEMS.0 = 1 /* USE THE MEMBER NAME PROVIDED. */
IF IMEMFND THEN MEMS.1 = IMEM; ELSE SIGNAL ERR030
END
MEMSLIST: /* GET RID OF THE JUNK IN THE MEMS. LIST. */
X = 0; PFX = ''; SFX = ''
IF FTYPE THEN FT = DSN; ELSE FT = ''
IF FNAME THEN FT = ''
IF XEXEC THEN PFX = ' &1 &2'
IF XDATE THEN PARSE VAR DSN "'" XDSN "'" .
Z = MEMS.0 + 1
MEMS.Z = '' /* SET THE EOF */
DO N = 1 FOR MEMS.0
IF MEMS.N ^= ''
THEN DO
X = X + 1
IF XDATE THEN DO
"DSNSTATS '"XDSN"("MEMS.N")' *STACK *QUIET"
IF RC ^= 0 THEN SIGNAL ERR090
PULL SFX
END
MEMS.X = PFX STRIP(MEMS.N) FT SFX
END
END
MEMS.0 = X
RETURN 'NOP'
PICKDSNS: /*SELECT ALL DATASET NAMES THAT HAVE THE DESIRED PREFIX.*/
DSNS = TRANSLATE(STRIP(DSNS))
X = POS('*',DSNS)
Y = POS('%',DSNS)
L = LENGTH(DSNS)
IF X = L
THEN DO N = 1 FOR DSNS.0 /* SET NULL VALS IF NO MATCH */
IF X = 1 THEN ITERATE
IF X - 1 > LENGTH(DSNS.N) THEN DO
DSNS.N = ''
ITERATE
END
IF POSCOMPR(LEFT(DSNS,X-1),LEFT(DSNS.N,X-1)) THEN DSNS.N = ''
END
IF X > 1 & X < L /* ENTER HERE WHEN STAR(*) IS IN MIDDLE */
THEN DO N = 1 FOR DSNS.0 /* SET NULL VALS IF NO MATCH */
IF POSCOMPR(LEFT(DSNS,X-1),LEFT(DSNS.N,X-1))
THEN DO
DSNS.N = ''
ITERATE N
END
IF POSCOMPR(RIGHT(DSNS,X-L),RIGHT(DSNS.N,X-L))
THEN DO
DSNS.N = ''
ITERATE N
END
END
IF X = 1
THEN DO N = 1 FOR DSNS.0 /* SET NULL VALS IF NO MATCH */
IF POSCOMPR(RIGHT(DSNS,L-1),RIGHT(DSNS.N,L-1)) THEN DSNS.N = ''
END
IF X = 0 & Y = 0
THEN DO
DSNS.0 = 1 /* USE THE DATASET NAME PROVIDED. */
IF IDSNFND THEN DSNS.1 = DSNS; ELSE SIGNAL ERR032
END
...
...
DOC:
/*BEGTYPE
REXXNAME: LISTDSNS
FUNCTION: BARELY SIMULATE CMS LISTDSNS COMMAND IN TSO/ISPF.
HOWTORUN: POSSIBLY... LISTDSNS * TDMVS.MIRVI
EXAMPLES:
ENDTYPE*/
IF CMS THEN 'REXSAYIT LISTDSNS EXEC * /*BEGTYPE ENDTYPE*/'
IF TSO THEN "REXSAYIT $DSN 'MIRVI.REXX(LISTDSNS)' SYSEXEC /*BEGTYPE ENDTYPE*/"
EXIT 000
...
...
ERR028:
SAY 'LISTDSNS - NO MEMBERS FOUND IN '''DSN''' USING MEM('IMEM').'
EXIT 028
ERR060:
SAY 'LISTDSNS - THE MEMBER NAME MAY NOT BE SPECIFIED IN THE DSN FIELD.'
EXIT 060
ERR070:
SAY 'LISTDSNS - UNABLE TO ALLOCATE DATASET('DSNMEM').'
EXIT 070
ERR080:
SAY 'LISTDSNS - UNABLE TO WRITE TO DATASET('DSNMEM').'
EXIT 080
ERR090:
SAY 'LISTDSNS - "DSNSTATS" PROBLEM WITH MEMBER ('MEMS.N') IN DSN='XDSN'.'
EXIT 090
Marc Vincent Irvin