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;