声明多个变量用于SAS中的宏?

时间:2016-11-16 21:25:04

标签: 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 个答案:

答案 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;