2015-06-08 8 views
0

Мне интересно, существует ли способ определения того, когда и где происходят разрывы страниц при использовании макроса для вывода данных. Я знаю, что в разных тегах ODS можно использовать «Startpage = NOW», но это не работает, если макрос используется внутри этого набора тегов. Поэтому в основном я хочу, чтобы две таблицы и график для каждого персонального идентификационного кода были на одной и следующей странице, содержали те же самые сводные графики, графики для этого человека и т. Д. В настоящее время я могу получить только каждую таблицу и диаграмму самостоятельно отдельную страницу, которая делает длинный отчет! Любая помощь/предложения будут оценены!SAS- Определение разрывов страниц внутри макроса

/*************************************************************************/ 
    /* 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; 

ответ

0

Макросы - это не что иное, как устройства генерации исходного кода. Они не влияют на эффективность какой-либо конкретной техники, за исключением того, что их (неправильное) использование может затруднить понимание того, как это сделать должным образом.

В этом случае, если вы хотите цельность каждой отдельной итерации %output() быть на одной странице, то вам просто нужно добавить startpage now перед %output(&val) вызова.

%runtab(&val); 

    ods tagsets.rtf startpage=now; 

    %output(&val); 

%end; 

Это будет производить инструкцию по началу работы непосредственно перед выходом. Вы можете так же легко включить его в макрос %output, если вы всегда будете хотите создать новую страницу перед ее вызовом.

0

Я вставил стартовый = NOW, где предложил и вставить пустую страницу, после того, как играть с размещением и глядя на то, что код делает этот следующий надрез он закончил работать:

ods tagsets.rtf startpage=NOW; 

%runtab(&val); 

    %output(&val); 
    ods tagsets.rtf startpage=no; 

%end; 
0

Вне использование макроса, вы также можете рассмотреть использование pageby с proc print, чтобы разделить страницу для вас.

See this link for PageBY

+0

спасибо @ yukclam9, хорошее предложение! – Brad