我希望有条件退出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向导都可以提供帮助吗?有什么替代方法我没有想到可以适用于我的主要目标吗?
谢谢大家!
答案 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.
运行,另一个运行如果它们是相同的(例如,它会向文本文件打印出来,因此您知道它失败了)。
首先进入流程流程,右键单击其中一个程序,然后选择“条件” - > '加'。然后您可以添加条件,例如:
所以现在我们告诉它该做什么,如果这是真的。如果为true,则运行Program
,如果为false,则运行Program1
。每个人都有自己的代码,可以在特定情况下做任何你想做的事情(希望有更好的名字!)。
最后,我们看到了流程,它显示了有条件运行的程序。您当然可以在之前运行另一个程序这两个设置date1
和date2
的程序。您会在流程中的程序图标右上方看到小旗图标,表示它们正在有条件地运行。
答案 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;