Red River Valley SAS User’s Group

August 6, 2003

Show & Tell by Carol Tschakert, NDSU

Example of using PROC COPY to facilitate reading multiple datasets from multiple tapes:

//ADCJTM JOB (acctnum,UCCM),'TSCHAKERT 1-7161',TIME=1,CLASS=N,

// MSGCLASS=Q

/*ROUTE PRINT R350

//JOBMSG EXEC JOBMSG

JOB=ADCJTM CLASS=N TIME=1

TAPE=USER.NDSU.TH951994(0) RING OUT

TAPE=USER.NDSU.SAS98(0) RING OUT

TAPE=USER.NDSU.SAS99(0) RING OUT

TAPE=USER.NDSU.SAS00(0) RING OUT

// EXEC ADSAS,INST='USER.NDSU',PRNTA=Q

//SASLOG DD SYSOUT=Q

//TAPEC DD DSN=USER.NDSU.TH951994(0),DISP=OLD

//TAPE98 DD DSN=USER.NDSU.SAS98(0),DISP=OLD,UNIT=AFF=TAPEC

//TAPE99 DD DSN=USER.NDSU.SAS99(0),DISP=OLD,UNIT=AFF=TAPEC

//TAPE00 DD DSN=USER.NDSU.SAS00(0),DISP=OLD,UNIT=AFF=TAPEC

//PCDOWN DD DSN=ADCJT.MATH3WK.FILE,DISP=(OLD,KEEP),UNIT=SYSDA,

// DCB=(LRECL=60,RECFM=VB,BLKSIZE=6004),SPACE=(TRK,(5,5),RLSE)

OPTIONS LINESIZE=80 PAGESIZE=76;

PROC COPY IN = TAPEC OUT = WORK;

SELECT CWSAS981 CWSAS983 CWSAS984

CWSAS991 CWSAS993 CWSAS994;

PROC COPY IN = TAPE98 OUT = WORK;

SELECT TS981OC0 TS983OC0 TS984OC0;

PROC COPY IN = TAPE99 OUT = WORK;

SELECT TS991OC0 TS993OC0 TS994OC0;

PROC COPY IN = TAPE00 OUT = WORK;

SELECT TS001OC0 TS003OC0 TS004OC0;

/* READ COURSE WORK FROM LIBRARY */

DATA CRSLIB;

SET ADMIN.CWSAS001 ADMIN.CWSAS003 ADMIN.CWSAS004

ADMIN.CWSAS011 ADMIN.CWSAS013 ADMIN.CWSAS014

ADMIN.CWSAS021 ADMIN.CWSAS023 ADMIN.CWSAS024;

KEEP CALLNUM CHKDGT DEPNM CRSNUM CREDITS TERM COUNT NAID NAME;

IF DATEID1 = '0' OR DATEID2 = '0' THEN DELETE;

IF DATEID1 = '4' OR DATEID2 = '4' THEN DELETE;

IF ACPTIND = 'X' OR ACPTIND = 'W' THEN DELETE;

IF DEPNM = 'MATH';

COUNT = 1;

TERM = '20' || TERMCD;

/* READ COURSE WORK FROM BACKUP TAPE */

DATA CRSTAPE;

SET WORK.CWSAS981 WORK.CWSAS983 WORK.CWSAS984

WORK.CWSAS991 WORK.CWSAS993 WORK.CWSAS994;

KEEP CALLNUM CHKDGT DEPNM CRSNUM CREDITS TERM COUNT NAID NAME;

IF DATEID1 = '0' OR DATEID2 = '0' THEN DELETE;

IF DATEID1 = '4' OR DATEID2 = '4' THEN DELETE;

IF ACPTIND = 'X' OR ACPTIND = 'W' THEN DELETE;

IF DEPNM = 'MATH';

COUNT = 1;

TERM = '19' || TERMCD;

DATA COURSE; SET CRSLIB CRSTAPE;

PROC SORT; BY TERM CALLNUM;

PROC MEANS N NOPRINT; BY TERM CALLNUM;

ID CREDITS CRSNUM ; VAR COUNT;

OUTPUT OUT=SECTSUM N=;

/* NOW READ EACH TERM SCHEDULE */

DATA SCHD981; SET WORK.TS981OC0;

KEEP CALLNUM INSTR1 INSTRNM1 TERM;

IF DEPT = 'MATH'; TERM = '19981';

DATA SCHD983; SET WORK.TS983OC0;

KEEP CALLNUM INSTR1 INSTRNM1 TERM;

IF DEPT = 'MATH'; TERM = '19983';

DATA SCHD984; SET WORK.TS984OC0;

KEEP CALLNUM INSTR1 INSTRNM1 TERM;

IF DEPT = 'MATH'; TERM = '19984';

DATA SCHD991; SET WORK.TS991OC0;

KEEP CALLNUM INSTR1 INSTRNM1 TERM;

IF DEPT = 'MATH'; TERM = '19991';

DATA SCHD993; SET WORK.TS993OC0;

KEEP CALLNUM INSTR1 INSTRNM1 TERM;

IF DEPT = 'MATH'; TERM = '19993';

DATA SCHD994; SET WORK.TS994OC0;

KEEP CALLNUM INSTR1 INSTRNM1 TERM;

IF DEPT = 'MATH'; TERM = '19994';

DATA SCHD001; SET WORK.TS001OC0;

KEEP CALLNUM INSTR1 INSTRNM1 TERM;

IF DEPT = 'MATH'; TERM = '20001';

DATA SCHD003; SET WORK.TS003OC0;

KEEP CALLNUM INSTR1 INSTRNM1 TERM;

IF DEPT = 'MATH'; TERM = '20003';

DATA SCHD004; SET WORK.TS004OC0;

KEEP CALLNUM INSTR1 INSTRNM1 TERM;

IF DEPT = 'MATH'; TERM = '20004';

DATA SCHD011; SET ADMIN.TS011OC0;

KEEP CALLNUM INSTR1 INSTRNM1 TERM;

IF DEPT = 'MATH'; TERM = '20011';

DATA SCHD013; SET ADMIN.TS013OC0;

KEEP CALLNUM INSTR1 INSTRNM1 TERM;

IF DEPT = 'MATH'; TERM = '20013';

DATA SCHD014; SET ADMIN.TS014OC0;

KEEP CALLNUM INSTR1 INSTRNM1 TERM;

IF DEPT = 'MATH'; TERM = '20014';

DATA SCHD021; SET ADMIN.TS021OC0;

KEEP CALLNUM INSTR1 INSTRNM1 TERM;

IF DEPT = 'MATH'; TERM = '20021';

DATA SCHD023; SET ADMIN.TS023OC0;

KEEP CALLNUM INSTR1 INSTRNM1 TERM;

IF DEPT = 'MATH'; TERM = '20023';

DATA SCHD024; SET ADMIN.TS024OC0;

KEEP CALLNUM INSTR1 INSTRNM1 TERM;

IF DEPT = 'MATH'; TERM = '20024';

DATA TERMSCHD;

SET SCHD981 SCHD983 SCHD984

SCHD991 SCHD993 SCHD994

SCHD001 SCHD003 SCHD004

SCHD011 SCHD013 SCHD014

SCHD021 SCHD023 SCHD024;

PROC SORT; BY TERM CALLNUM;

DATA ALL; MERGE SECTSUM (IN=M) TERMSCHD ;

BY TERM CALLNUM; IF M;

PROC SORT; BY TERM INSTR1 CRSNUM;

PROC MEANS N SUM NOPRINT; BY TERM INSTR1 CRSNUM;

ID CREDITS INSTRNM1 ; VAR COUNT;

OUTPUT OUT=MATH N=NUMSECT SUM=NUMSTUD;

PROC SORT; BY TERM INSTRNM1 CRSNUM;

PROC FORMAT;

VALUE $SEM '19981' = 'FALL 1997'

'19983' = 'SPRING 1998'

'19984' = 'SUMMER 1998'

'19991' = 'FALL 1998'

'19993' = 'SPRING 1999'

'19994' = 'SUMMER 1999'

'20001' = 'FALL 1999'

'20003' = 'SPRING 2000'

'20004' = 'SUMMER 2000'

'20011' = 'FALL 2000'

'20013' = 'SPRING 2001'

'20014' = 'SUMMER 2001'

'20021' = 'FALL 2001'

'20023' = 'SPRING 2002'

'20024' = 'SUMMER 2002' ;

DATA _NULL_; SET MATH;

LENGTH SEM $ 6;

FILE PRINT NOTITLES HEADER=TOP;

BY TERM INSTRNM1;

TAB = '05'X;

CURRENT = TODAY();

IF FIRST.TERM THEN

DO;

TOTHRS = 0;

PUT _PAGE_;

END;

CRHRS = CREDITS * NUMSTUD;

TOTHRS + CRHRS;

IF INSTRNM1 = ' ' THEN INSTRNM1 = 'NO NAME GIVEN';

IF FIRST.INSTRNM1 THEN PUT ;

PUT @1 INSTRNM1 @36 NUMSECT 2. @43 CREDITS 2. @52 CRSNUM

@64 NUMSTUD 4. @74 CRHRS 5.;

*IF LAST.INSTRNM1 THEN PUT /;

IF LAST.TERM THEN

PUT / @65 'TOTAL' @73 TOTHRS 6.;

FILE PCDOWN NOTITLES;

INSTRNM1 = TRIM(INSTRNM1);

CRSNUM = TRIM(CRSNUM);

PUT @1 TERM +(-1) TAB +(-1)

INSTRNM1 +(-1) TAB +(-1)

NUMSECT TAB +(-1)

CREDITS 2. TAB +(-1)

CRSNUM TAB +(-1)

NUMSTUD ;

RETURN;

TOP:

PUT 'THIRD WEEK ENROLLMENT FOR MATH COURSES'

/ @15 TERM $SEM. @55 CURRENT WORDDATE20. //

@5 'NAME' @34 '#SESS CREDITS MATH #STUDENTS'

@73 'CR HRS' ;

RETURN;