Thanks for your feedback, it has been extremely helpful!
It's taken me a little while to look at the code and review the usage notes for arrays and macros but I think I finally understand most of what you and Cynthia were getting at.
I have included the code below and it is almost working as desired.
The problem I am running into is that the print file has already been created and there are not a fixed number of lines per page. They vary according to the number of detail lines.
If I specify an array number that is the max number of lines per page, then if there are less than this amount, it fills the page with blank lines at the end so it is not a true copy of the original file.
I tried specifying an array LINE{*} but this gives me the error:
The array LINE has been defined with zero elements
Is it possible to track the number of lines per page (CC=1) and then pass this to the array definition or something like that?
//STEP17 EXEC SASPROC
//SASIN DD DISP=SHR,DSN=PL.DISK.GSGB020B.GRPBUY.BOOKS(0)
//BKS2PRT DD *
BOOKA
BOOKB
BOOKC
BOOKZ
//SASLIST DD SYSOUT=A
//SYSIN DD *
OPTIONS MPRINT MLOGIC SYMBOLGEN;
/**********************************************************/
/* STORE BOOKS TO PRINT AS MACRO VARIABLES */
/**********************************************************/
DATA _NULL_;
INFILE BKS2PRT LENGTH=CARDIN END=EOF;
DO _N_ = 1 BY 1 UNTIL(EOF);
INPUT @1 ABKS2PRT $VARYING80. CARDIN ;
CALL SYMPUT(CATS(ABKS2PRT), CATS(ABKS2PRT));
END;
RUN;
/******************************************************/
/* PRINT ONLY THE BOOKS SPECIFIED IN THE */
/* BKS2PRT FILE ABOVE. */
/******************************************************/
DATA _NULL_ ;
INFILE SASIN LENGTH=RECLEN EOF=EOF;
ARRAY LINE{66} $161 ;
KEEPERFLAG = 0;
DO _N_ = 1 BY 1 UNTIL(CC EQ '1');
INPUT @1 LINE{_N_} $CHAR161. @@;
IF NOT KEEPERFLAG THEN
DO;
PGMID=INDEX(LINE{_N_},'PGM: GSGB020 ');
IF PGMID GT 0 THEN
DO;
BOOKID = SUBSTR(LINE{_N_}, PGMID+23, 1);
BOOKS2PRT = '&BOOK'||BOOKID;
CURBOOK = 'BOOK'||BOOKID;
IF CURBOOK = RESOLVE(BOOKS2PRT) THEN KEEPERFLAG= 1;
END;
END;
INPUT / @1 CC $1. @@;
END;
EOF:
FILE PRINT NOPRINT LS=161;
IF KEEPERFLAG THEN DO _N_ = 1 TO DIM(LINE);
PUT LINE{_N_} $CHAR161.;
END;
RUN;
... View more