0

我希望有条件地退出 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 向导都可以提供帮助吗?是否有任何我没有想到的替代方法可以适用于我的主要目标?

感谢大家!

4

3 回答 3

2

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

于 2015-09-09T12:17:23.327 回答
1

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

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

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

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

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

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

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

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

假设您有两个程序 - 一个运行 if &date1. = &date2.,另一个运行如果它们的音符相等(例如,它将某些内容打印到文本文件中,因此您知道它失败了)。

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

第一条件窗口

所以现在我们告诉它如果这是真的该怎么做。如果为真,运行Program,如果为假,运行Program1。它们每个都有自己的代码,可以在特定情况下执行您想要的任何操作(并且希望有更好的名称!)。

在此处输入图像描述

最后,我们看到了流程,它显示了有条件运行的程序。您当然可以这两个设置date1date2. 您会在流程上的程序图标的右上角看到小标志图标,表明它们正在有条件地运行。

在此处输入图像描述

于 2015-09-09T15:05:14.107 回答
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;
于 2015-09-09T15:40:56.107 回答