If statement SAS E Guide 5.1宏包装器不工作

If statement SAS E Guide 5.1宏包装器不工作,if-statement,macros,sas,conditional,enterprise-guide,If Statement,Macros,Sas,Conditional,Enterprise Guide,我希望有条件地退出SAS程序。互联网的每个角落都建议我将代码封装在宏包装器中,但当我这样做时,SAS似乎不再“识别”代码(关键字不再为蓝色)。到目前为止,我还没有在任何地方看到它的编写,但我觉得这个功能可能与EnterpriseGuide 5.1不兼容 %macro wrapper; PROC SQL; All this is just grey text, to include the PROC SQL and QUIT that should be blue ;QUIT; %mend

我希望有条件地退出SAS程序。互联网的每个角落都建议我将代码封装在宏包装器中,但当我这样做时,SAS似乎不再“识别”代码(关键字不再为蓝色)。到目前为止,我还没有在任何地方看到它的编写,但我觉得这个功能可能与EnterpriseGuide 5.1不兼容

%macro wrapper;
PROC SQL;
    All this is just grey text, to include the PROC SQL and QUIT that should be blue
;QUIT;
%mend wrapper;
最终,我希望在我的代码中有这样的东西

IF date1 ^= date2 THEN ABORT(the entire program if possible)
我尝试使用%IF%THEN%GOTO,但除非整个程序都在宏包装器中,否则它无法工作,这就是我的目的

(我尝试在数据步骤中中止IF条件,但它只是中止该代码块,而不是程序。)

我希望我已经清楚地表达了这一点。有没有SAS向导能帮上忙?有没有其他我没有想到的方法可以应用于我的主要目标


谢谢大家

编辑器完全独立于SAS执行。您在编辑器中看到的颜色编码只是编辑器试图理解代码。它应该对代码是否工作没有影响。

编辑器完全独立于SAS执行。您在编辑器中看到的颜色编码只是编辑器试图理解代码。它应该不会影响代码是否工作。

您所描述的是SAS代码荧光笔中的一个众所周知的缺陷。在DM和《企业指南》中都是如此。有趣的是,EG自动补全器没有这个问题——它知道在这种情况下正确地自动补全——所以我不确定他们为什么没有修复它

解决此问题的一种方法是在宏中插入一个“虚拟”宏

%macro your_macro;
   %macro fix_color; %mend fix_color;

   proc sql;
      your code;
   quit;
%mend your_macro;
假设您按顺序输入,它将正确地突出显示其中的所有内容

正如Tom所指出的,这并不意味着代码不起作用,但它确实使阅读代码变得更加困难

现在,回答你更大的问题:你还能怎么做

在《企业指南》中,您应该通过流程流利用条件代码执行

假设您有两个程序—一个在
&date1.=&date2.
和一个在注释相等时运行的文件(例如,它将某些内容打印到文本文件中,这样您就知道它失败了)

首先进入流程,右键单击其中一个程序,然后选择“条件”->“添加”。然后可以添加一个条件,例如:

现在我们告诉它如果这是真的该怎么办。如果为true,则运行
程序
,如果为false,则运行
程序1
。它们都有自己的代码,可以在特定情况下执行任何您想要的操作(希望有更好的名称!)

最后,我们看到了进程流,它显示程序正在有条件地运行。当然,您可以在设置
date1
date2
的这两个程序之前运行另一个程序。您可以在流中程序图标的右上角看到小的标志图标,表示它们正在有条件地运行


您所描述的是SAS代码荧光灯中的一个众所周知的缺陷。在DM和《企业指南》中都是如此。有趣的是,EG自动补全器没有这个问题——它知道在这种情况下正确地自动补全——所以我不确定他们为什么没有修复它

解决此问题的一种方法是在宏中插入一个“虚拟”宏

%macro your_macro;
   %macro fix_color; %mend fix_color;

   proc sql;
      your code;
   quit;
%mend your_macro;
假设您按顺序输入,它将正确地突出显示其中的所有内容

正如Tom所指出的,这并不意味着代码不起作用,但它确实使阅读代码变得更加困难

现在,回答你更大的问题:你还能怎么做

在《企业指南》中,您应该通过流程流利用条件代码执行

假设您有两个程序—一个在
&date1.=&date2.
和一个在注释相等时运行的文件(例如,它将某些内容打印到文本文件中,这样您就知道它失败了)

首先进入流程,右键单击其中一个程序,然后选择“条件”->“添加”。然后可以添加一个条件,例如:

现在我们告诉它如果这是真的该怎么办。如果为true,则运行
程序
,如果为false,则运行
程序1
。它们都有自己的代码,可以在特定情况下执行任何您想要的操作(希望有更好的名称!)

最后,我们看到了进程流,它显示程序正在有条件地运行。当然,您可以在设置
date1
date2
的这两个程序之前运行另一个程序。您可以在流中程序图标的右上角看到小的标志图标,表示它们正在有条件地运行


此解决方案假定已将date1和date2的值保存到宏变量中。如果您需要帮助,请告诉我,我会更新此答案

使用
%abort取消语句是我最喜欢的有条件中止当前正在运行的程序的方法。只需在编写SQL代码之前执行测试,如果执行过程从未完成,则无需将所有代码封装在宏中

%macro exit_if_dates_dont_match;
  %if &date1 ^= &date2 %then %do;
    %abort cancel;
  %end;
%mend;
%exit_if_dates_dont_match;

此解决方案假定已将date1和date2的值保存到宏变量中。如果您需要帮助,请告诉我,我会更新此答案

使用
%abort取消语句是我最喜欢的有条件中止当前正在运行的程序的方法。只需在编写SQL代码之前执行测试,如果执行过程从未完成,则无需将所有代码封装在宏中

%macro exit_if_dates_dont_match;
  %if &date1 ^= &date2 %then %do;
    %abort cancel;
  %end;
%mend;
%exit_if_dates_dont_match;

值得注意。谢谢这正常吗?编辑器是否开始“忽略”SAS宏包装中的所有内容?值得注意。谢谢这正常吗?编辑器是否开始“忽略”SAS宏包装中的所有内容?