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;

person Brad    schedule 08.06.2015    source источник


Ответы (3)


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

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

  %runtab(&val);

  ods tagsets.rtf startpage=now;

  %output(&val);

%end;

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

person Joe    schedule 08.06.2015

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

  ods tagsets.rtf startpage=NOW;

 %runtab(&val);

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

%end;
person Brad    schedule 08.06.2015

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

См. эту ссылку для PageBY

person yukclam9    schedule 09.06.2015