我在程序中多次重复使用相同的常量变量,所以我想在宏中声明它们,然后为我的函数调用该宏。
我有一个像这样的例子
%macro vars();
%let trans_1 = ever_30_ct;
%let trans_2 = ever_60_ct;
%mend vars;
%macro run_();
%vars();
proc sql;
select &trans_1 from va_purchase_fico_cts;
run;
%mend run_;
%run_();
但是,如果我将run_宏更改为此,则它不再起作用。
%macro run_();
%vars();
proc sql;
select &trans_1 , &trans_2 from va_purchase_fico_cts;
run;
%mend run_;
它说& trans_2无法解决。有谁知道为什么我不能这样做?
答案 0 :(得分:2)
宏变量范围。它不应该工作任何时间。您很可能在某些时候在测试中声明了变量trans_1。
基本上,宏正在创建宏完成后不再存在的本地宏变量。将它们声明为全局宏变量,并且您可以在宏之外使用它们。
%macro vars();
%global trans_1;
%global trans_2;
%let trans_1 = ever_30_ct;
%let trans_2 = ever_60_ct;
%mend vars;
答案 1 :(得分:1)
%global
是最简单的解决方案。
因为我同时处理几个项目,所以我尽量避免使用全局变量。我更喜欢为我正在处理的每个项目编写一个入口点宏。然后我从那里调用其他宏。这允许您在该入口点根据需要声明尽可能多的%local
个变量。任务完成后,这些变量将消失。像:
%macro wrap_foo/des='Entry point for task foo';
%local _trans1 _trans2;
%foo;
%mend;
如果需要以参数方式初始化变量,则可以创建使用变量的名称的宏。我经常使用它来创建自定义日志消息:
%macro init_constants( varname1, varname2, project )
/des='Parameterized constant initializer.';
%let &varname1 = &project.1;
%let &varname2 = &project.2;
%mend;
%macro foo/des='Actual task foo';
%init_constants( _trans1, _trans2, bar );
%put &=_trans1 &=_trans2;
%mend;
%wrap_foo;