【问题标题】:Call a Macro in to another macro sas将宏调用到另一个宏 sas
【发布时间】:2018-02-08 21:04:13
【问题描述】:

我想将一个宏调用到另一个宏中,这会创建一个我想在另一个宏中使用的宏变量。但输出是“警告:明显的符号引用 TEST33 未解析。”

data Base1;
input v1 v2 v3;
datalines;
1 7 8
;
run;

%let number = 6;
%Macro test1;    
proc sql noprint;
    select
    case when (
        case when &number eq 3 then v1
             when &number eq 6 then v2
             when &number eq 12 then v3
        end ) ge 6 then 1 else 0 end into: Test22 from _last_; quit;
%let Test33 = &Test22;
%Mend test1;

options mlogic mprint symbolgen;
%Macro test2;
%test1
%put &= &Test33;
%Mend;
%test2;

【问题讨论】:

  • 您是否考虑过使用 CALL EXECUTE 代替?这可能是动态多次执行宏的更好方法。
  • 试图找到这个问题的一个像样的重复链接,但我的搜索技巧让我失望了。
  • 这是一个范围问题,因此是本地与全局,尽管总体而言更好的实现可能是使用 CALL EXECUTE 或 PROC FCMP。

标签: macros sas


【解决方案1】:

您的代码有两个错误,但不确定它们是真正的错误还是演示代码的拼写错误。

无论哪种方式:

  1. 如果要在宏外部使用,则需要将宏内部的变量声明为 GLOBAL。宏变量具有范围,即局部或全局。
  2. 您引用了数据集last,而您的演示数据称为 BASE1。

这对我来说很好用:

data Base1;
input v1 v2 v3;
datalines;
1 7 8
;
run;

%let number = 6;
%Macro test1; 
%global Test33; 
proc sql noprint;
    select
    case when (
        case when &number eq 3 then v1
             when &number eq 6 then v2
             when &number eq 12 then v3
        end ) ge 6 then 1 else 0 end into: Test22 from base1; quit;
%let Test33 = &Test22;
%Mend test1;

options mlogic mprint symbolgen;
%Macro test2;
%test1
%put &= &Test33;
%Mend;
%test2;

【讨论】:

  • 非常感谢,用 global 关键字声明宏变量,效果很好。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-23
相关资源
最近更新 更多