Hi,
I have a following a jcl step and I know it is not a jcl forum, but I would be highly oblidged to get a help...
//STEP102 EXEC PGM=IDCAMS
//SYSPRINT DD DSN=CHMICST.LISTCAT3,DISP=SHR
//SYSIN DD *
LISTCAT LVL('EDIB88T.NTRCS1T.D102916.T*.M*.ENTC')ALL
/*
Is there any other way other than to hardcode the date 'D102916' cause its a dynamic name. SO i want to get another way to give the name instead of hard coding it.
@Tom @rogerjdeangelis @Patrick I got it and heres the solution... If you guys need it in future in any of your endeavors..
//RDDATA EXEC SAS,WORK='40000,40000'
//SYSPRINT DD SYSOUT=*
//CTLR DD DSN=CHMICST.LISTCAT.OUTPUT,DISP=SHR
//SYSIN DD *
OPTIONS NOCENTER PS=1000 ;
DATA DATE;
%LET TODAY=%SYSFUNC(TODAY(),MMDDYYN7.);
* %PUT D&TODAY.;
%LET DTVAR = D&TODAY. ;
%PUT &DTVAR;
RUN;
DATA FINAL;
SET DATE;
INPUT FUNCTION $ 4-16
EDINAME $ 17-24
SECNDQUL $ 25-32
DTEQUAL $ 33-41
TIMEQUL $ 42-44
MQUAL $ 45-47
LASTQUL $ 48-52
EQUAL $ 53-57
;
DTEQUAL = "&DTVAR" ;
;
DATALINES;
LISTCAT LVL('EDIB88T.NTRCS1T.D&DTVAR...T*.M*.CTLR')ALL
;
PROC PRINT DATA=FINAL NOOBS;
;
DATA _NULL_;
SET FINAL ;
FILE CTLR NOPRINT NOTITLES MOD ;
PUT FUNCTION $ 4-16
EDINAME $ 17-24
SECNDQUL $ 25-32
DTEQUAL $ 33-39
TIMEQUL $ 40-42
MQUAL $ 43-45
LASTQUL $ 46-50
EQUAL $ 51-58
;
RUN;
which gives me the output in the dataset : CHMICST.LISTCAT.OUTPUT
as :
LISTCAT LVL('EDIB88T.NTRCS1T.D010417.T*.M*.CTLR')ALL
Thanks,
Hope you find it useful
There are ways in JCL to actually code this and then use a variable instead of the name - but JCL is now so long ago for me that I would have to look up all the details of how that's done as well.
Another approach I've used in a SAS life long long ago was to generate the code - JCL and SAS code - and then pass it to the internal reader (intrdr).
Not sure if this is still relavant but I used it in the late 80's
I believe IDCAMS can be run interactively so you can
wrap it in macro, or you can create a JCL proc with an argument
Untested proc
HERE IS A PROC WITH THREE PARAMETERS
//*
//* PROC PARAMETERS
//* STATE IS STATE TO PROCESS
//* PRIOR IS STATE TO STACK THIS ONE BEHIND
//* FILE IS FILE SEQUENCE NUMBER
//*
//* NOTE: - FIRST STATE HAS STARTING VOLSERS CODED AS OVERRIDE
//*
//MAT PROC DATE=DEC87
//UNCATLG EXEC PGM=IEFBR14
//DUM DD UNIT=(CART,,DEFER)
// DD UNIT=AFF=DUM,DISP=(MOD,UNCATLG),
// DSN=XXXXXXX.M12.M703.FULL.&STATE..&DATE
// DD UNIT=AFF=DUM,DISP=(MOD,UNCATLG),
// DSN=XXXXXXX.M12.M703.STRIP.&STATE..&DATE
//*
//MATCH EXEC PGM=YYYY532
//SYSPRINT DD SYSOUT=*
//SYSOUT DD SYSOUT=*
//IDQ11521 DD DSN=XXX.XXX.STIDFILE,DISP=SHR
//IDQ11522 DD DSN=XXX.XXXZIPSTAT,DISP=SHR
//SORTWK01 DD UNIT=SYSDA,SPACE=(CYL,(100,25))
//SORTWK02 DD UNIT=SYSDA,SPACE=(CYL,(100,25))
//SORTWK03 DD UNIT=SYSDA,SPACE=(CYL,(100,25))
//SORTWK04 DD UNIT=SYSDA,SPACE=(CYL,(100,25))
//SORTWK05 DD UNIT=SYSDA,SPACE=(CYL,(100,25))
//SORTWK06 DD UNIT=SYSDA,SPACE=(CYL,(100,25))
//SORTWK07 DD UNIT=SYSDA,SPACE=(CYL,(100,25))
//SORTWK08 DD UNIT=SYSDA,SPACE=(CYL,(100,25))
//SORTWK09 DD UNIT=SYSDA,SPACE=(CYL,(100,25))
//SORTWK10 DD UNIT=SYSDA,SPACE=(CYL,(100,25))
//OUT DD UNIT=CARTX,
// DCB=(LRECL=532,RECFM=FB,BLKSIZE=32452,TRTCH=COMP),
// DISP=(,CATLG),
// LABEL=&FILE,
// VOL=(,RETAIN,,99,
// REF=XXXXXXX.M12.M703.FULL.&PRIOR..&DATE),
// DSN=XXXXXXX.M12.M703.FULL.&STATE..&DATE
//STRIP DD UNIT=CARTX,
// DCB=(LRECL=144,RECFM=FB,BLKSIZE=32688,TRTCH=COMP),
// DISP=(,CATLG),
// LABEL=&FILE,
// VOL=(,RETAIN,,99,
// REF=XXXXXXX.M12.M703.STRIP.&PRIOR..&DATE),
// DSN=XXXXXXX.M12.M703.STRIP.&STATE..&DATE
//LONG DD DISP=(MOD,CATLG),DCB=(LRECL=532,RECFM=FB,BLKSIZE=27664),
// SPACE=(CYL,(10,10),RLSE),UNIT=SYSDA,
// DSN=XXXXXXX.MAR97.LONG.ADDRESS.RECORDS
//IN DD DISP=OLD,DSN=YYYY0397.S0400.XXXS04.STATE&STATE,
// DCB=TRTCH=COMP
// PEND
//*
//* PROC PARAMETERS
//* STATE IS STATE TO PROCESS
//* PRIOR IS STATE TO STACK THIS ONE BEHIND
//* FILE IS FILE SEQUENCE NUMBER
//*
//* NOTE: - FIRST STATE HAS STARTING VOLSERS CODED AS OVERRIDE
//*
//MA EXEC MAT,STATE=MA,FILE=01,
// PRIOR=NONE
//MATCH.OUT DD VOL=(,RETAIN,,99) FULL STARTING VOLSER
//STRIP DD VOL=(,RETAIN,,99) STRIP STARTING VOLSER
//*
//RI EXEC MAT,STATE=RI,FILE=02,PRIOR=MA
//NH EXEC MAT,STATE=NH,FILE=03,PRIOR=RI
//ME EXEC MAT,STATE=ME,FILE=04,PRIOR=NH
//VT EXEC MAT,STATE=VT,FILE=05,PRIOR=ME
//CT EXEC MAT,STATE=CT,FILE=06,PRIOR=VT
//NJ EXEC MAT,STATE=NJ,FILE=07,PRIOR=CT
//NY EXEC MAT,STATE=NY,FILE=08,PRIOR=NJ
//PA EXEC MAT,STATE=PA,FILE=09,PRIOR=NY
//DE EXEC MAT,STATE=DE,FILE=10,PRIOR=PA
//DC EXEC MAT,STATE=DC,FILE=11,PRIOR=DE
It is possible to eliminate JCL entirely and run using
old text editor. You run 'interactive' batch
that can communicate with a master interactive SAS.
I found this very usefull back in the 80s, although IT hated it.
Here is some info (somewhat incomplete) on 'interactive' MVS batch.
%MACRO UTLTSO(STATE)
/ des="Bring up TSO batch xeq SAS and SAS objects";
/*-------------------------------------*\
| |
| This is some really old code circa |
| 1988 |
| |
| The pupose of this utility was to |
| run a second SAS MVS 'interactive' |
| batch session while in old text |
| editor. No JCL. |
| |
| I used to use this code to do |
| some tasks batch while I was doing |
| other things in display manager. |
| |
| You may ask why: |
| |
| 1. A JCL oriented MVS batch |
| environment is quite different |
| from other batch environments |
| ie Unix, OS/2, WinNT etc. |
| This utility gives the user |
| some of the properties of MVS |
| batch, ie batch queues, good |
| mutiprogamming, time and |
| storage limits etc. |
| |
| 2. No JCL needed |
| |
| 3. All TSO utilities like IEBCOPY, |
| IDCAMS available with |
| IEBGENER available with |
| SAS 'X' command. No JCL. |
| Also things like LISTDS |
| |
| 4. Programs run exactly the same |
| in true interactive or |
| interactive batch |
| |
| 5. Some SAS interactive commands |
| are available in 'interactive' |
| batch. |
| |
| |
| Inputs |
| ====== |
| |
| 1. A member UTLPRTX in PDS |
| XLR82SAS.UTL(UTLPRTX) |
| |
| |
| %UTLPRTX |
| ( |
| UIN=XLR2SAS.UTL.SDL, |
| UMEM=SASCOBOL, |
| UPRN=NO, |
| UOT=XLR82SAS.UTL.&UTLTSO.PRT, |
| UFLOP=05.06.07 |
| ); |
| |
| 2. You may want to customize the |
| config and autoexec files for |
| communication between the two |
| interactive SAS sessions. |
| |
| |
| Process |
| ======= |
| |
| In an active display manager |
| submit the following code |
| |
| %utltso(utlprtx); |
| |
| What happens: |
| |
| 1. UTLTSO is located in |
| the current autocall |
| library |
| |
| 2. SAS dynamically creates |
| MVS JCL and submits the JCL |
| the appropriate batch que. |
| (using the internal reader) |
| |
| 3. MVS brings up a TSO session |
| in batch mode. |
| |
| 4. The Batch TSO session executes|
| the SAS clist. |
| |
| A. SASTSO is the name of |
| the CLIST. |
| |
| B. The Clist communicates |
| with the interactive |
| session through |
| |
| 5. Job runs. |
| |
| |
| OUTPUT |
| ======= |
| |
| XLR82SAS.UTL.UTLPRTX.PRT |
| |
|=======================================|
| |
| |
\*-------------------------------------*/
FILENAME OUTRDR SYSOUT=A PGM=INTRDR RECFM=FB LRECL=80;
DATA _NULL_;
LENGTH J1-J8 $72.;
FILE OUTRDR NOPRINT NOTITLES;
J1="//XLR82SASW JOB (XXXXXXXX,XXXXXXX),MSGCLASS=X,CLASS=B,REGION=0M";
J2="//TSO EXEC PGM=IKJEFT01,REGION=16M,DYNAMNBR=30";
J3="//SYSTSPRT DD SYSOUT=*";
J4="//SYSPRINT DD SYSOUT=*";
J5="//SASUSR DD DSN=XLR82SAS.UTLTSO.SASUSER.SDL,DISP=OLD";
J6="//SASIN DD DISP=SHR,DSN=XLR82SAS.UTL(&STATE)";
J7="//SYSTSIN DD *";
J8="EX 'XLR82SAS.CLIST(SASTSO)'";
PUT (J1-J8) ($CHAR72. /);
RUN;
%MEND UTLTSO;
%utltso(state=FL);
%utltso(state=NY);
@rogerjdeangelis Hi Roger, Thanks!
but I need to use listcat and have the value pass through instream sysin. Can you help me with that
Instead of using
//SYSIN DD *
to read the list from the JCL stack point SYSIN to an actual file that you created in a earlier step.
It hase been over 20 years since I was on the maiframe but I found this code.
I am not sure this is relavent. Just can't remember.
This is an interactive solution?
Also I think you can stil use a JCL proc, but you may need aparameter for each listcat,
Some special chars did not map correctly to ascii. I think this does a bunch of listcats.
%macro utl04LP(__OF=&__OF., /* DSN of output file */
__USTR=&__USTR., /* HLQ String (blank-delimited) */
__OPTS=&__OPTS.); /* LISTCAT Options */
%utldelf(&__OF); * delete output fiel if it exists;
filename a "&__OF." disp=(mod,catlg)
space=(trk,(50,10),rlse) recfm=vba lrecl=255;run;
%local __C __HLQ __UGH;
%let __C = 1;
%let __HLQ = %scan( &__USTR., &__C., ' ' );
%do %while ( &__HLQ ª= );
%let __UGH = %str('&__HLQ.');
x "listcat level(&__UGH.) ofile(A) &__OPTS.";run;
%let __C = %eval( &__C. + 1 );
%let __HLQ = %scan( &__USTR., &__C., ' ' );
%end;
filename a clear;run;
%mend utl04LP;
@Tom @rogerjdeangelis @Patrick I got it and heres the solution... If you guys need it in future in any of your endeavors..
//RDDATA EXEC SAS,WORK='40000,40000'
//SYSPRINT DD SYSOUT=*
//CTLR DD DSN=CHMICST.LISTCAT.OUTPUT,DISP=SHR
//SYSIN DD *
OPTIONS NOCENTER PS=1000 ;
DATA DATE;
%LET TODAY=%SYSFUNC(TODAY(),MMDDYYN7.);
* %PUT D&TODAY.;
%LET DTVAR = D&TODAY. ;
%PUT &DTVAR;
RUN;
DATA FINAL;
SET DATE;
INPUT FUNCTION $ 4-16
EDINAME $ 17-24
SECNDQUL $ 25-32
DTEQUAL $ 33-41
TIMEQUL $ 42-44
MQUAL $ 45-47
LASTQUL $ 48-52
EQUAL $ 53-57
;
DTEQUAL = "&DTVAR" ;
;
DATALINES;
LISTCAT LVL('EDIB88T.NTRCS1T.D&DTVAR...T*.M*.CTLR')ALL
;
PROC PRINT DATA=FINAL NOOBS;
;
DATA _NULL_;
SET FINAL ;
FILE CTLR NOPRINT NOTITLES MOD ;
PUT FUNCTION $ 4-16
EDINAME $ 17-24
SECNDQUL $ 25-32
DTEQUAL $ 33-39
TIMEQUL $ 40-42
MQUAL $ 43-45
LASTQUL $ 46-50
EQUAL $ 51-58
;
RUN;
which gives me the output in the dataset : CHMICST.LISTCAT.OUTPUT
as :
LISTCAT LVL('EDIB88T.NTRCS1T.D010417.T*.M*.CTLR')ALL
Thanks,
Hope you find it useful
Are you ready for the spotlight? We're accepting content ideas for SAS Innovate 2025 to be held May 6-9 in Orlando, FL. The call is open until September 25. Read more here about why you should contribute and what is in it for you!
Learn how use the CAT functions in SAS to join values from multiple variables into a single value.
Find more tutorials on the SAS Users YouTube channel.