SAS E Guide 5.1宏包装器无法正常工作

时间:2015-09-09 12:02:01

标签: if-statement macros sas conditional enterprise-guide

我希望有条件退出SAS计划。互联网的每个角落都建议我将我的代码封装在一个宏包装器中,但是当我这样做时,代码似乎不再被SAS识别出来(关键字不再是蓝色)。到目前为止,我还没有看到它写在任何地方,但我觉得这个功能可能与Enterprise Guide 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,但它不起作用,除非整个程序在宏包装器中,这将我带到这里。

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

我希望我清楚地阐明这一点。任何SAS向导都可以提供帮助吗?有什么替代方法我没有想到可以适用于我的主要目标吗?

谢谢大家!

3 个答案:

答案 0 :(得分:2)

编辑器完全独立于SAS执行。您在编辑器中看到的颜色编码只是编辑试图理解代码。它对代码是否有效无效。

答案 1 :(得分:1)

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

修复它的一种方法是在宏中插入一个“虚拟”宏。

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

   proc sql;
      your code;
   quit;
%mend your_macro;

假设您按顺序输入,它将正确地突出显示其中的所有内容。

正如Tom所说,这并不意味着代码不起作用,但它当然会使代码更难阅读。

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

在Enterprise Guide中,您应该通过流程利用条件代码执行。

假设您有两个程序 - 一个在&date1. = &date2.运行,另一个运行如果它们是相同的(例如,它会向文本文件打印出来,因此您知道它失败了)。

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

First Condition Window

所以现在我们告诉它该做什么,如果这是真的。如果为true,则运行Program,如果为false,则运行Program1。每个人都有自己的代码,可以在特定情况下做任何你想做的事情(希望有更好的名字!)。

enter image description here

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

enter image description here

答案 2 :(得分:1)

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

使用%abort cancel;语句是我最有条件地中止当前正在运行的程序的方法。只需在SQL代码之前执行测试,如果执行永远不会将其包含在宏中,则无需将所有代码包装在宏中。

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