2016-07-28 112 views
0

我想使用此宏来运行代码的不同部分。当我自己选择并运行%if语句时,它们可以工作。但是,当我尝试运行%begin宏时,SAS EG立即告诉我程序已完成且没有错误。但是,我的代码没有运行。这导致我相信我有一个语法错误。有谁知道发生了什么事?从SAS宏调用宏

%macro begin(); 
%if &run_NLI_LTC. = "Y" %then %do; 
%MDI(1,NonLI_LTC); 
%compare(1); 
%end; 

%if &run_LCE. = "Y" %then %do; 
%MDI(2,LCE); 
%compare(2); 
%end; 
%mend begin; 
%begin; 

感谢您的帮助!

+0

你不能单独运行%IF语句,它在开放代码中不起作用。你必须在宏定义中嵌入宏逻辑如%IF并调用宏。 – Tom

+0

宏变量有什么值?如果两个条件均为假,您的宏将不会执行任何操作。 – Tom

回答

0

您的环境中可能会出现某些宏未正常结束的情况。我可以在EG 7.1中无误地运行以下内容。

%macro printit(s); 
%put &s; 
%mend; 

%macro begin(x); 
%if %sysevalf(&x > 0) %then %do; 
    %printit(x > 0); 
%end; 
%if %sysevalf(&x < 0) %then %do; 
    %printit(x > 0); 
%end; 
%if %sysevalf(&x = 0) %then %do; 
    %printit(x = 0); 
%end; 
%mend begin; 

%begin(1); 

尝试重新连接到SAS(右键单击活动服务器,并选择“断开”)并运行上述操作。

如果这样的话,那么你的代码中可能会有一个未正确结束的宏。也就是说,SAS处于一种认为它仍在编译宏的状态。它会不时发生,修复的最简单方法是重新启动SAS会话。

2

我的猜测,只有您提供的信息,是这个错误是在这里:

%if &run_LCE. = >>"Y"<< %then %do; 

是什么&run_LCE.包含哪些内容? Y"Y"?宏变量不是“字符”变量,所以不使用引号,除非它们实际上是变量内容的一部分。通常情况下,我会只在宏变量Y,所以你需要

%if &run_LCE. = Y %then %do; 

您可以验证%if是通过打开mlogic选项(options mlogic;),这将打印到失败的记录每个逻辑的结果宏观语言比较。