Итеративная проблема% DO L OOP в макросе SAS для автоматической отправки метрик по электронной почте - PullRequest
0 голосов
/ 30 января 2020

У меня есть набор данных под названием 'SampleReport' с указанием сайта c метрик отчетности, и я надеюсь отправить каждому сайту свои метрики в прикрепленном PDF. Файлы PDF генерируются и отправляются по электронной почте на соответствующие сайты, однако при попытке добавить текст ODS в PDF возникают проблемы с определением других моих макросов (в настоящее время в качестве макропеременной сохраняется только «электронная почта», но я также хочу «сайт»). ',' Site_Contact 'и' mcnt_enrolled ').

Ниже приведен набор тестовых данных и мой код; Я новичок в SAS и буду признателен за любую помощь / предложения:

    site    site_enrolled_total mcnt_enrolled   Site_Contact    Email   Expected_Enrolled   NetworkAvg  Overall_Study_Enrollment    Overall_Enrollment_to_Date
site_a  32  7   Homer Simpson   hsimp@gmail.com 40  5   115 1518
site_b  36  8   Jim Schoe   jimmy2schoes@aol.com    40  4   115 1518
site_ c 20  2   Hank Hill   propaneking@yahoo.com   36  7   115 1518
site_d  27  7   Lisa Simpson    lisasimpson@gmail.com   36  5   115 1518

А вот мой код:

    %macro getemail(DATA);
    ods _all_ close;
    %let outdir = %sysfunc(getoption(WORK));
    OPTIONS NODATE NONUMBER;
    ODS GRAPHICS / RESET=ALL;

    ** get list of unique emails;
    proc sql noprint;
        select distinct(email) into :wantemail separated by '~'
            from samplereport
                order by email;
    quit;
    %put &=wantemail;
    **count number of separators(i.e. '~') and count number of unique emails;
    %let cntsep1 = %sysfunc(count(&wantemail,~));
    %let cntemail = %eval(&cntsep1+1);
    ** start do loop to cycle thru list of emails;
    ** and create the site macro var for each loop;
    %do i = 1 %to &cntemail;
        %let email = %scan(&wantemail,&i,~);
        %put This is for by group where email = &email;


    **use site macro variable for file name and WHERE and TITLE;
        ODS PDF (id=dagwood)
            FILE="&outdir.\PDF_&email..PDF" STARTPAGE=NO STYLE=Journal gtitle;
title j=center bold "Metrics for January 2020"; 
ods text= "Email: &email. ";
ods text= "Site: &site. ";
ods text= "Site Contact: &Site_Contact.";
ods text= "Enrolled this Month: &mcnt_enrolled. ";
run;

        ods layout gridded columns=2;
        ods graphics / width=300 height=300;
ods region;
    ods pdf(id=dagwood) style=statdoc;

    PROC SGPLOT DATA=work.samplereport;
        where email = "&email";
        Title "Enrollment Metrics for Your Site";
        vbar site / response=Expected_Enrolled stat=sum DATALABEL LEGENDLABEL="Expected Enrollment for Your Site"
            discreteoffset=-0.5 barwidth=0.2 fillattrs=graphdata2;
        yaxis grid display=(nolabel);
        xaxis display=(noline NOTICKS NOVALUES nolabel);
        vbar site / response=site_enrolled_total stat=sum DATALABEL LEGENDLABEL="Enrolled for Your Site to Date"
            discreteoffset=-0.2 barwidth=0.2 fillattrs=graphdata1;
        yaxis grid display=(nolabel);
        xaxis display=(noline NOTICKS NOVALUES nolabel);
        vbar site / response=mcnt_enrolled stat=sum DATALABEL LEGENDLABEL="Enrolled this Month"
            discreteoffset=0.2 barwidth=0.2 fillattrs=graphdata3;
        yaxis grid display=(nolabel);
        xaxis display=(noline NOTICKS NOVALUES nolabel);
        vbar site / response=NetworkAvg stat=sum DATALABEL LEGENDLABEL="Your Network Avg Enrollment this Month"
            discreteoffset=0.5 barwidth=0.2 fillattrs=graphdata4;
        yaxis grid display=(nolabel);
        xaxis display=(noline NOTICKS NOVALUES nolabel);
    RUN;

ods region;
    ods pdf(id=dagwood) style=statdoc;
    goptions reset=all;

    proc sgplot data=work.samplereport;
        where email = "&email";
        Title "Study-Wide Enrollment to Date and Goal";
        vbar site / response=Overall_Study_Enrollment stat=sum DATALABEL LEGENDLABEL="Enrollment for All Sites"
            discreteoffset=-0.3 barwidth=0.4 fillattrs=graphdata5;
        yaxis grid display=(nolabel);
        xaxis display=(noline NOTICKS NOVALUES nolabel);
        vbar site / response=Overall_Expected_Study stat=sum DATALABEL LEGENDLABEL="Expected Enrollment Goal"
            discreteoffset=0.3 barwidth=0.4 fillattrs=graphdata6;
        yaxis grid display=(nolabel);
        xaxis display=(noline NOTICKS NOVALUES nolabel);
    run;

ODS LAYOUT END;
    %end;

    * get emails from DATA;
    proc sql noprint;
        select EMAIL into :EMAIL1- from &DATA;
        select count(*) into :EMAILN from &DATA;

        * cycle through emails;
        %do I=1 %to &EMAILN;
        filename temp email to="&&EMAIL&I"
        attach="&outdir.\PDF_&&email&I...PDF"
        from="myemail@gmail.com"
            type="text/html"
            subject="Site Metrics";
            ods html file=temp;
    run;

    ods html close;
        %end;
%mend getemail;

%getemail(samplereport);

1 Ответ

1 голос
/ 31 января 2020

Оператор электронной почты %DO l oop не завершен должным образом.

    * cycle through emails;
    %do I=1 %to &EMAILN

Должен быть

    * cycle through emails;
    %do I=1 %to &EMAILN;

И, возможно, ODS HTML CLOSE должен быть вне l oop.

...