首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SAS: If条件无法识别datastep中的宏变量

SAS: If条件无法识别datastep中的宏变量
EN

Stack Overflow用户
提问于 2021-10-12 18:43:09
回答 2查看 87关注 0票数 1

在下面的代码中,发送电子邮件的IF语句没有正确计算。我不知道为什么。我试着检查是否为空,但也不起作用。它只是在该语句中总是发送第一个do。在下面的语句中,没有记录的TABLE1存在,而TABLE2不存在。我认为这与&CNT3在proc sql语句中填充了COUNT(*)有关。

代码语言:javascript
复制
%IF %SYSFUNC(exist(TABLE1)) %THEN %DO;

    PROC SQL;
        SELECT COUNT(*) INTO : CNT3 FROM TABLE1;
    QUIT;
    %END;
%ELSE %DO;

    %LET CNT3=0;
    %END;

    %put &cnt3.;

%IF %SYSFUNC(exist(TABLE2)) %THEN %DO;

    PROC SQL;
        SELECT COUNT(*) INTO : CNT4 FROM TABLE2;
    QUIT;
    %END;
%ELSE %DO;

    %LET CNT4=0;
    %END;
    %put &cnt4.;



%IF (&CNT3 ^=0 AND &CNT3^='0') %THEN %DO;

    PROC EXPORT DATA=TABLE1.
        DBMS=XLSX
        OUTFILE="data/REPORT1.xlsx"
        REPLACE;
        SHEET="TEST1";
    RUN;
%END;

%IF (&CNT4 ^=0 AND &CNT4^='0') %THEN %DO;

    PROC EXPORT DATA=&ENV..AUTH_ERRORLOG_&REC_DATE.
        DBMS=XLSX
        OUTFILE="data/REPORT1.xlsx"
        REPLACE;
        SHEET="TEST2";
    RUN;
%END;

%let EMAIL_SUBJECT = "TEST EMAIL.";

FILENAME OUTBOX EMAIL 'TEST@TEST.COM';

DATA _NULL_;
    IF (&CNT3 ^=0 AND &CNT3 ^='0') OR (&CNT4 ^=0 AND &CNT4^='0') THEN
        DO;
            FILE OUTBOX
                TO=('TEST@TEST.COM')
                SUBJECT= &EMAIL_SUBJECT.
                ATTACH=("/data/REPORT1.xlsx" CONTENT_TYPE="APPLICATION/XLSX");
            
        END;
        ELSE DO;

                FILE OUTBOX
                TO=('TEST@TEST.COM')
                SUBJECT= &EMAIL_SUBJECT.;
                PUT"NO ERRORS FOUND";
        END;
            

RUN;
EN

回答 2

Stack Overflow用户

发布于 2021-10-12 22:22:51

这里可能发生了许多事情,所以让我们试着清理一下,看看它是否能解决您的问题。

首先,让我们从感兴趣的表的元数据中获取观察值计数,而不是计算所有观察值。这是一个很好的可重复的宏,我强烈建议将其作为一个始终可用的sasauto:

代码语言:javascript
复制
%macro nobs(data);
    %local dsid nobs rc;

    %let nobs = -1;

    %if(%sysfunc(exist(&data.)) ) %then %do;

        %let dsid = %sysfunc(open(&data.));
        %let nobs = %sysfunc(attrn(&dsid., nlobs));
        %let rc   = %sysfunc(close(&dsid.));
    %end;

    &nobs.
%mend;

这将像一个函数一样,返回SAS表的观测值数量。如果它不存在,则返回-1。例如:

代码语言:javascript
复制
%put The number of obs in sashelp.cars is %nobs(sashelp.cars);
%put The number of obs in a non-existent table is %nobs(doesntexist);

输出:

代码语言:javascript
复制
The number of obs in sashelp.cars is 428
The number of obs in a non-existent table is -1

现在我们保证总是返回一个没有空格的数字。让我们替换程序逻辑:

代码语言:javascript
复制
%if(%nobs(table1) > 0) %then %do;

    PROC EXPORT DATA=TABLE1
        DBMS=XLSX
        OUTFILE="data/REPORT1.xlsx"
        REPLACE;
        SHEET="TEST1";
    RUN;

%end;

%if(%nobs(table2) > 0) %then %do;

    PROC EXPORT DATA=&ENV..AUTH_ERRORLOG_&REC_DATE.
        DBMS=XLSX
        OUTFILE="data/REPORT1.xlsx"
        REPLACE;
        SHEET="TEST2";
    RUN;

%end;

%let EMAIL_SUBJECT = "TEST EMAIL.";

FILENAME OUTBOX EMAIL 'TEST@TEST.COM';

DATA _NULL_;
    IF (%nobs(table1) > 0 OR %nobs(table2) > 0) then do;
        FILE OUTBOX
             TO=('TEST@TEST.COM')
             SUBJECT= &EMAIL_SUBJECT.
             ATTACH=("/data/REPORT1.xlsx" CONTENT_TYPE="APPLICATION/XLSX");
            
        END;
            ELSE DO;
                    FILE OUTBOX
                    TO=('TEST@TEST.COM')
                    SUBJECT= &EMAIL_SUBJECT.;
                    PUT"NO ERRORS FOUND";
            END; 
RUN;
票数 0
EN

Stack Overflow用户

发布于 2021-10-12 23:56:41

这个测试没有任何意义

代码语言:javascript
复制
&CNT3 ^=0 AND &CNT3 ^='0'

在宏逻辑或数据阶跃逻辑中。

如果CNT3会有像0123甚至123这样的值,那么只需要测试它是否为零:

代码语言:javascript
复制
&cnt3 ne 0
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69545521

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档