SAS E Guide 5.1 宏包装器不工作
SAS E Guide 5.1 Macro Wrapper not working
我希望有条件地退出 SAS 程序。互联网的每个角落都建议我将我的代码封装在一个宏包装器中,但是当我这样做时,代码似乎不再是 SAS 的 'recognized'(关键字不再是蓝色)。到目前为止,我还没有看到它被写入任何地方,但我觉得这个功能可能与 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,但它不起作用,除非整个程序都在宏包装器中,这让我来到这里。
(我试过 IF 条件在 DATA 步中中止,但它只是中止了该代码块,而不是程序。)
我希望我已经清楚地表达了这一点。任何 SAS 向导都可以提供帮助吗?是否有任何我没有想到的替代方法可以适用于我的主要目标?
谢谢大家!
编辑器完全独立于 SAS 执行。您在编辑器中看到的颜色编码只是编辑器试图理解代码。它应该对代码是否有效没有影响。
您所描述的是 SAS 代码突出显示中的一个众所周知的缺陷。在 DM 和 Enterprise Guide 中都是如此。有趣的是,EG Autocompleter 没有这个问题——它知道在那个上下文中正确地自动完成——所以我不确定他们为什么没有修复它。
修复它的一种方法是在宏中插入一个 'dummy' 宏。
%macro your_macro;
%macro fix_color; %mend fix_color;
proc sql;
your code;
quit;
%mend your_macro;
假设您按顺序输入,它将正确突出显示其中的所有内容。
正如 Tom 指出的那样,这并不意味着代码无法运行,但它确实使代码更难阅读。
现在,回答你更大的问题:你还能怎么做?
在企业指南中,您应该通过流程流利用条件代码执行。
假设您有两个程序 - 一个是 运行s 如果 &date1. = &date2.
另一个是 运行s 如果它们是相等的(比如,它打印一些东西到文本文件,所以你知道它失败了)。
首先转到流程,右键单击其中一个程序,然后选择 'Condition' -> 'Add'。然后你可以添加一个条件,例如:
所以现在我们告诉它如果这是真的该怎么做。如果为真,运行 Program
,如果为假,运行 Program1
。每个人都有自己的代码,可以在特定情况下做任何你想做的事(希望有更好的名字!)。
最后,我们看到了流程,它显示了程序是有条件的 运行。你当然可以有另一个程序 运行s before 这两个设置 date1
和 date2
的程序。您会在流程中的程序图标的右上角看到小旗帜图标,表明它们是有条件的 运行.
此解决方案假定您已将 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;
我希望有条件地退出 SAS 程序。互联网的每个角落都建议我将我的代码封装在一个宏包装器中,但是当我这样做时,代码似乎不再是 SAS 的 'recognized'(关键字不再是蓝色)。到目前为止,我还没有看到它被写入任何地方,但我觉得这个功能可能与 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,但它不起作用,除非整个程序都在宏包装器中,这让我来到这里。
(我试过 IF 条件在 DATA 步中中止,但它只是中止了该代码块,而不是程序。)
我希望我已经清楚地表达了这一点。任何 SAS 向导都可以提供帮助吗?是否有任何我没有想到的替代方法可以适用于我的主要目标?
谢谢大家!
编辑器完全独立于 SAS 执行。您在编辑器中看到的颜色编码只是编辑器试图理解代码。它应该对代码是否有效没有影响。
您所描述的是 SAS 代码突出显示中的一个众所周知的缺陷。在 DM 和 Enterprise Guide 中都是如此。有趣的是,EG Autocompleter 没有这个问题——它知道在那个上下文中正确地自动完成——所以我不确定他们为什么没有修复它。
修复它的一种方法是在宏中插入一个 'dummy' 宏。
%macro your_macro;
%macro fix_color; %mend fix_color;
proc sql;
your code;
quit;
%mend your_macro;
假设您按顺序输入,它将正确突出显示其中的所有内容。
正如 Tom 指出的那样,这并不意味着代码无法运行,但它确实使代码更难阅读。
现在,回答你更大的问题:你还能怎么做?
在企业指南中,您应该通过流程流利用条件代码执行。
假设您有两个程序 - 一个是 运行s 如果 &date1. = &date2.
另一个是 运行s 如果它们是相等的(比如,它打印一些东西到文本文件,所以你知道它失败了)。
首先转到流程,右键单击其中一个程序,然后选择 'Condition' -> 'Add'。然后你可以添加一个条件,例如:
所以现在我们告诉它如果这是真的该怎么做。如果为真,运行 Program
,如果为假,运行 Program1
。每个人都有自己的代码,可以在特定情况下做任何你想做的事(希望有更好的名字!)。
最后,我们看到了流程,它显示了程序是有条件的 运行。你当然可以有另一个程序 运行s before 这两个设置 date1
和 date2
的程序。您会在流程中的程序图标的右上角看到小旗帜图标,表明它们是有条件的 运行.
此解决方案假定您已将 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;