【问题标题】:SYMBOLIC REFERENCE - SCAN function within DO LOOPSYMBOLIC REFERENCE - DO LOOP 中的 SCAN 函数
【发布时间】:2017-06-13 08:34:18
【问题描述】:

我是使用宏变量的相对新手,似乎已经陷入困境。

我有一个宏,它可以打开一个表并生成一个宏变量 &TBL_DIM。使用 PROC SQL 选择进入。

%macro CREATE_DIM_VAR(tbl, var); %macro _; %mend _;

%syslput tbl = &tbl. / remote=gidwsas;
%syslput var = &var. / remote=gidwsas;

rsubmit;
        PROC SQL NOPRINT;

            *Create SELECT statement for columns we want;
            SELECT ALL_DIM INTO: TBL_DIM SEPARATED BY ', '
            FROM ALLDIM_LIST
            WHERE TBL = "&TBL." AND VAR = "&VAR." 
            ;
        QUIT;
endrsubmit;
%mend;

%CREATE_DIM_VAR(A, GENDER);

当我执行以下操作时:

rsubmit;
    %put &TBL_DIM.;
endrsubmit;

效果很好。

但是现在,当我尝试在另一个宏中调用它时:

%macro Execute(); %macro _; %mend _;

rsubmit;
%do n = 1 %to 10;
    %let THIS_VAR = %scan(&TBL_DIM., &n.));
    %put &THIS_VAR.;
%end;
endrsubmit;

%mend;

%执行();

我收到以下错误: 警告:未解析明显的符号引用 TBL_DIM。

如何将 TBL_DIM 传递给另一个宏?

编辑: 当我修改 %Execute() 以完全从远程服务器运行时,它可以工作 - 但我仍然不明白为什么......

rsubmit;
%macro Execute(); %macro _; %mend _;

    %do n = 1 %to 10;
        %let THIS_VAR = %scan(&TBL_DIM., &n.));
        %put &THIS_VAR.;
    %end;

%mend;
endrsubmit;

rsubmit;
    %Execute();
endrsubmit;

【问题讨论】:

  • 第一个宏创建了 TBL_DIM,所以没有定义 VAR_DIM 也就不足为奇了。假设这只是一个错字,问题可能是由于宏变量的全局与局部范围。尝试添加 '%global tbl_dim;'在两个宏的开头...
  • @ChrisLong 是的,这是一个错字对不起!
  • @ChrisLong 添加 %GLOBAL 似乎可以解决宏变量,但它们显示为空白
  • 回复:您的编辑,您有一个本地 SAS 会话和一个远程 SAS 会话,它们是完全独立的 - 在一个中创建的宏变量在另一个中不存在。如果您在本地会话中声明并运行 Execute 宏,则它无权访问远程会话中存在的 TBL_DIM 宏变量。
  • @ChrisLong 尽管 %EXECUTE 宏引用了 &TBL_DIM。在宏内的 rsubmit 会话中?

标签: loops macros sas


【解决方案1】:

我正在添加我的最后一条评论作为答案,因为下面的参考给出了 OP 观察到的行为的明确原因。

计算服务和宏处理之间的交互

http://support.sas.com/documentation/cdl/en/connref/61908/HTML/default/viewer.htm#a001584568.htm

在您的非工作情况下,本地宏处理器在将处理后的块发送到远程服务器之前处理您的 rsubmit/endrsubmit 块中的代码。但是,当您在 rsubmit/endrsubmit 块中声明宏时,会远程提交和定义整个宏。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-23
    • 2022-01-12
    • 1970-01-01
    • 2018-02-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多