多个设置为宏变量

Multiple set to macro variable

我正在尝试构建一个高级的报告和日志记录系统,但遇到了问题。

示例:

work.check_true 为空。

当这个 table 为空时,像 'czy_wyslac' 这样的变量应该有值 2。 如果此 table 不为空,则变量 'czy_wyslac' 的值应来自 table work.check_true 的字段 "gen"(1 或 0)。 下一步 - 根据变量“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();

如果 work.check 为空,select gen into :czy_wyslac from work.check_true 将不会 return 任何内容,从而保留 &CZY_WYSLAC 中的任何先前值。

因此下面将实现您想要的:

%LET CZY_WYSLAC = 2 ; /* default value */
proc sql noprint ;
  select gen into :CZY_WYSLAC from work.check_true ;
quit ;