Sas 多重设置为宏变量
我正试图建立一个先进的报告和日志系统,但我遇到了一个问题 例如: work.check\u true为空 当此表为空时,类似“czy_wyslac”的变量的值应为2。 如果此表不为空,则变量“czy_wyslac”应具有来自表work中字段“gen”(1或0)的值。请检查_true。 下一步-取决于变量“czy_wyslac”的值,从三个步骤处理一个宏到下一个宏。我对此没有问题 下面是我的代码: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
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;
退出
谢谢你的修改。我的英语仍然很差…我可能会错过它,但你是否真的在任何地方陈述了“问题”到底是什么,什么没有发生或正在发生?有一个答案,但这似乎是一个假设,因为我们无法运行你的代码。谢谢你的修改。我的英语仍然很差…我可能会错过它,但你呢在任何地方说明“问题”实际上是什么,什么没有发生或正在发生?有答案,但这似乎是一种假设,因为我们无法运行您的代码。