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 разделить страницу для вас.

Смотрите эту ссылку для PageBY

Другие вопросы по тегам