Sas 多重设置为宏变量

Sas 多重设置为宏变量,sas,sas-macro,Sas,Sas Macro,我正试图建立一个先进的报告和日志系统,但我遇到了一个问题 例如: work.check\u true为空 当此表为空时,类似“czy_wyslac”的变量的值应为2。 如果此表不为空,则变量“czy_wyslac”应具有来自表work中字段“gen”(1或0)的值。请检查_true。 下一步-取决于变量“czy_wyslac”的值,从三个步骤处理一个宏到下一个宏。我对此没有问题 下面是我的代码: data _null_; call symput('obscnt',0); set work.Che

我正试图建立一个先进的报告和日志系统,但我遇到了一个问题

例如:

work.check\u true为空

当此表为空时,类似“czy_wyslac”的变量的值应为2。 如果此表不为空,则变量“czy_wyslac”应具有来自表work中字段“gen”(1或0)的值。请检查_true。 下一步-取决于变量“czy_wyslac”的值,从三个步骤处理一个宏到下一个宏。我对此没有问题

下面是我的代码:

data _null_;
call symput('obscnt',0);
set work.Check_true;
call symput('obscnt',_n_);
stop;
run;

%macro get_table_size();
%global czy_wyslac;
%If &obscnt=0 %then call SYMPUTX('czy_wyslac',2);

%else
    proc sql noprint;
    select
        gen into: czy_wyslac
    from work.Check_true
    ;quit;
%mend;


%macro Create_log_mail();

   %if &czy_wyslac. = 1 %then
    %do;
        data work.maile;
        zal = "T:\XXX\XXX\Risk\XXXX\XXXX\OUTPUT\Results_of_compare &calosc..xlsx";
        run;

        options emailsys=XXemail host=XXXemailport=XXX;

        FILENAME mail EMAIL;

        DATA _NULL_;
        SET WORK.maile END=eof;
        FILE mail ENCODING='UTF-8';
        PUT '!EM_TO! "XXXXX@XXXXXX"';
        PUT 'Szanowni,';
        PUT 'Załącznik zawiera znalezione różnice między szablonem kalkulatora a zawartym w systemie ATP.';
        PUT 'Wpis _TYPE> = PLIK - baza porównywana';
        PUT 'Wpis _TYPE> = ATP - rekord wyciągnięty z ATP';
        PUT;
        PUT 'Baza zawiera również wynik porównania wyposażenia oraz baseline.';
        PUT;
        PUT 'Pozdrawiam,';
        PUT 'KJ SYSTEM REPORT';
        PUT '!EM_FROM! XXXSYSTEM REPORT <noreply@XXXXX.pl>';
        PUT '!EM_SENDER! XXXXSYSTEM REPORT <noreply@XXXX.pl>';
        PUT '!EM_BCC! ';
        PUT '!EM_SUBJECT! XXXXXXXX';
        PUT '!EM_ATTACH!' zal;
        PUT '!EM_REPLYTO! Please do not reply for this mail - regards :)';
        PUT '!EM_SEND!' / '!EM_NEWMSG!';
        IF eof THEN PUT '!EM_ABORT!';
        RUN;

            proc sql;
            Create table LOG_CREATE as
            Select
            distinct
            date()*86400 format datetime20. as EXTRACT_DATE,
            date()*86400 format datetime20. as REFERENCE_DATE,
            'MAIL: Results_of_compare' as STAGE_NAME,
            '99_02_MAIL_RESULT' as PROCES_NAME,
            '02_CALCULATOR_ATP' as SCHEMA_NAME,
            20 as etap_no,
            'SENT' as STATUS,
            &Count_records_02. as records,
            'Wysłano mail' as Comments,
            . as alert_records,
            '' as Alert_comments,
            &_timer_start format datetime20. as START_PROCESS,
            datetime() format datetime20. as END_PROCESS,
            datetime() - &_timer_start format time13.2 as Duration
            FROM work._PRODSAVAIL
            ;quit;
    %end;

    %else %if &czy_wyslac. = 0 %then %do;
        proc sql;
        Create table LOG_CREATE as
        Select
        distinct
        date()*86400 format datetime20. as EXTRACT_DATE,
        date()*86400 format datetime20. as REFERENCE_DATE,
        'MAIL: Results_of_compare' as STAGE_NAME,
        '99_02_MAIL_RESULT' as PROCES_NAME,
        '02_CALCULATOR_ATP' as SCHEMA_NAME,
        20 as etap_no,
        'NOT SENT' as STATUS,
        . as records,
        '' as Comments,
        . as alert_records,
        '' as Alert_comments,
        &_timer_start format datetime20. as START_PROCESS,
        datetime() format datetime20. as END_PROCESS,
        datetime() - &_timer_start format time13.2 as Duration
        FROM work._PRODSAVAIL
        ;quit;
    %end;
%mend;
%Create_log_mail();
数据\u空\u;
调用symput('obscnt',0);
设置work.Check_true;
调用symput('obscnt',\u n\u);
停止
跑
%宏get_table_size();
%全球czy_wyslac;
%如果&obscnt=0%,则调用SYMPUTX('czy_-wyslac',2);
%否则
proc-sql-noprint;
选择
总工程师:czy_wyslac
从工作中。检查你的真实情况
退出
%修补;
%宏Create_log_mail();
%如果&czy_wyslac.=1%,则
%做;
数据工作.maile;
zal=“T:\XXX\XXX\Risk\XXXX\XXXX\OUTPUT\Results\u of_compare&calosc..xlsx”;
跑
选项emailsys=XXemail host=XXXemailport=XXX;
文件名邮件和电子邮件;
数据为空;
设置WORK.maile END=eof;
文件邮件编码='UTF-8';
把它们放进去XXXXX@XXXXXX"';
把‘Szanowni’;
将“Załcznik zawiera znalezione ró380; dzy szablonem kalkulatora a zawartym w systemie ATP”放在一起;
将“Wpis类型>=PLIK-baza porównywana”;
将“Wpis类型>=ATP-rekord wyciągnięty z ATP”放在一起;
放;
把“Baza zawiera równieżwynik porównania wyposażenia oraz”放在基线上;
放;
放上“波兹德拉维亚姆”;
把"KJ系统报告",;
放入“!EM_FROM!xxx系统报告”;
放入“!EM_SENDER!xxxx系统报告”;
放上“!以密件抄送!”;
放上“!EM_主题!XXXXXXXX”;
放上“!emu_ATTACH!”zal;
将“!EM_REPLYTO!请不要回复此邮件-问候:)”;
放上“!EM_SEND!”/”!EM_NEWMSG!”;
如果是eof,则输入“!EM_ABORT!”;
跑
proc-sql;
创建表日志\u创建为
挑选
不同的
日期()*86400格式datetime20。作为提取日期,
日期()*86400格式datetime20。作为参考日期,
“邮件:比较结果”作为阶段名称,
“99\u 02\u邮件结果”作为过程名称,
“02\u计算器\u ATP”作为模式名称,
20作为etap_编号,
“已发送”作为状态,
&将记录计数为记录,
“Wysłano mail”作为评论,
。根据警讯组的记录,
“”作为警告注释,
&_计时器\u开始格式datetime20。作为开始\u进程,
datetime()格式datetime20。作为END_进程,
datetime()-&_timer_start format time13.2作为持续时间
下班后
退出
%结束;
%如果&czy_wyslac.=0%,则为%do;
proc-sql;
创建表日志\u创建为
挑选
不同的
日期()*86400格式datetime20。作为提取日期,
日期()*86400格式datetime20。作为参考日期,
“邮件:比较结果”作为阶段名称,
“99\u 02\u邮件结果”作为过程名称,
“02\u计算器\u ATP”作为模式名称,
20作为etap_编号,
“未发送”作为状态,
.作为记录,
"作为评论,,
。根据警讯组的记录,
“”作为警告注释,
&_计时器\u开始格式datetime20。作为开始\u进程,
datetime()格式datetime20。作为END_进程,
datetime()-&_timer_start format time13.2作为持续时间
下班后
退出
%结束;
%修补;
%创建日志邮件();

如果
工作。check
为空,则
选择gen into:czy\u wyslac from work。check\u true
将不返回任何内容,从而保留
&czy\u wyslac
中以前的任何值

因此,以下内容将满足您的要求:

%LET CZY_WYSLAC = 2 ; /* default value */ proc sql noprint ; select gen into :CZY_WYSLAC from work.check_true ; quit ; %设CZY_WYSLAC=2;/*默认值*/ proc-sql-noprint; 选择gen to:CZY_WYSLAC from work.check_true; 退出
如果
work.check
为空,则
选择gen into:czy\u wyslac from work.check\u true
将不返回任何内容,从而保留
&czy\u wyslac
中以前的任何值

因此,以下内容将满足您的要求:

%LET CZY_WYSLAC = 2 ; /* default value */ proc sql noprint ; select gen into :CZY_WYSLAC from work.check_true ; quit ; %设CZY_WYSLAC=2;/*默认值*/ proc-sql-noprint; 选择gen to:CZY_WYSLAC from work.check_true; 退出
谢谢你的修改。我的英语仍然很差…我可能会错过它,但你是否真的在任何地方陈述了“问题”到底是什么,什么没有发生或正在发生?有一个答案,但这似乎是一个假设,因为我们无法运行你的代码。谢谢你的修改。我的英语仍然很差…我可能会错过它,但你呢在任何地方说明“问题”实际上是什么,什么没有发生或正在发生?有答案,但这似乎是一种假设,因为我们无法运行您的代码。