2016-11-16 149 views
1

我在程序中多次重复使用相同的常量变量,所以我想在宏中声明它们,然后为我的函数调用该宏。声明SAS中用于宏的多个变量?

我有一个这样的例子,工程

%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不能得到解决。有谁知道我为什么不能这样做?

回答

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; 
+0

完美。谢谢。 –

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;