SAS- Определение разрывов страниц внутри макроса
Мне интересно, есть ли способ определения, когда и где происходят разрывы страниц при использовании макроса для вывода данных. Я знаю, что в различных таджетах ODS можно использовать "Startpage=NOW", но, похоже, это не сработает, если в этом тэге используется макрос. Поэтому в основном я хочу, чтобы две таблицы и график для каждого персонального идентификационного кода были на одной странице, а следующая страница содержит одни и те же сводные графики, диаграммы для этого человека и т. Д. В настоящее время я могу получить только каждую таблицу и диаграмму для своих собственных отдельная страница, которая делает для длинного отчета! Любая помощь / предложения будут оценены!
/*************************************************************************/
/* Create a macro variable of all the ID codes */
/* */
/*************************************************************************/
proc sql noprint;
select personal_id
into :varlist separated by ' ' /*Each identifier code in the list is sep. by a single space*/
from provider;
quit;
%let cntlist = &sqlobs; /*Store a count of the number of id codes*/
%put &varlist; /*Print the codes to the log to be sure our list is accurate*/
ods tagsets.rtf file="C:\USER\test.doc" style=sasdocprinter;
/* macro for generating the output table*/
%macro output(x);
proc print data=prov_&x;
run;
proc print data=prov_revCD_&x;
run;
/*Print graph to template defined earlier*/
ods graphics on / height=500px width=500px;
proc sgrender data=summary_&x template=corf_graphs;
run;
ods graphics on / reset=all;
%mend;
%macro loopit(mylist);
%let else=;
%let n = %sysfunc(countw(&mylist)); /*let n=number of codes in the list*/
data
%do I=0 %to &n;
%let val = %scan(&mylist,&I); /*Let val= the ith code in the list*/
%end;
/*Run a loop for each oscar code. Each code will enter the
%do j=0 %to &n;
%let val = %scan(&mylist,&j); /*Let val= the jth code in the list*/
/*Run the macro loop to generate the required tables*/
%runtab(&val);
%output(&val);
%end;
run;
%mend;
%loopit(&varlist)
/*Run the macro loop over the list of significant procedure code values*/
ods tagsets.rtf close;
3 ответа
Я вставил стартовую страницу = СЕЙЧАС, где это было предложено, и он вставил пустую страницу, поиграв с размещением и посмотрев, что делает код, следующим образом:
ods tagsets.rtf startpage=NOW;
%runtab(&val);
%output(&val);
ods tagsets.rtf startpage=no;
%end;
Макросы - это не что иное, как устройства генерации исходного кода. Они не влияют на эффективность какой-либо конкретной техники, за исключением того, что их (неправильное) использование может затруднить понимание того, как это сделать правильно.
В этом случае, если вы хотите, чтобы полнота каждой отдельной итерации %output()
чтобы быть на одной странице, то вам просто нужно добавить startpage now
перед %output(&val)
вызов.
%runtab(&val);
ods tagsets.rtf startpage=now;
%output(&val);
%end;
Это создаст инструкцию стартовой страницы непосредственно перед выводом. Вы можете так же легко включить его в %output
макрос, если вы всегда будете хотеть новую страницу перед ее вызовом.
Помимо использования макроса, вы также можете рассмотреть использование pageby
с proc print
разделить страницу для вас.