如何用下划线分隔两个宏变量数据集名称?

问题描述 投票:0回答:3

我试图通过下划线分隔由两个宏变量创建的数据集名称,但它在%macro create_table中给出了一个错误。

%macro create_tables;
* NOTE THE DOUBLE AMPERSAND! *;
data &&_produto&i_&&_mes_char&j;

我试图在第一个宏变量的末尾使用一个点但是没有按预期工作。我怎么能解决这个问题?

%macro create_tables;
    * NOTE THE DOUBLE AMPERSAND! *;
    data &&_produto&i_&&_mes_char&j;
        set aux_base_defaults;
        if fim_mes = &&_fim_mes&j and cod = &&_id_produto&i;
    run;
%mend create_tables;

*------------------------------------------*;
* DEFINE MACRO VARIABLES *;
*------------------------------------------*;
proc sql;

create table produtos_a_considerar as
select b.sigla, a.cod
    from (select distinct cod
                from aux_base_defaults
            group by cod) a
inner join ecl.referencia_produtos b on b.id_produto = a.cod;

quit;

data _null_;
    set produtos_a_considerar;
    call symput( '_produto' || left(trim(_N_)) , trim(sigla));
    call symput( '_id_produto' || left(trim(_N_)) , cod);
    call symput( '_obs_produto' , _N_ );
run;

data _null_;
    set dim_fim_mes;
    call symput( '_fim_mes' || left(trim(_N_)) , fim_mes );
    call symput( '_mes_char' || left(trim(_N_)) , substr(mes_char,1,7));
    call symput( '_obs_fim_mes' , _N_ );
run;

*-----------------------------------------*;
* SUBMIT EXAMPLE5 FOR EACH DATASET *;
*-----------------------------------------*;
%macro loop;
    %do i=1 %to &_obs_produto;  
        %do j=1 %to &_obs_fim_mes;
            %create_tables;
        %end;
    %end;
%mend loop;
%loop;
sas identifier sas-macro
3个回答
1
投票

在这种情况下,您需要2个点 - 首先将循环变量与下划线分开,然后在解析第一批&符号后将另一个左边的宏变量与下划线分开。

编写一个最小的示例来验证这种事情是否符合您的预期,这通常很有帮助。例如。

%let mvar1 = foo;
%let mvar2 = bar;

%let i = 1;
%let j = 2;

%put &&mvar&i.._&&mvar&j;

输出:

foo_bar

0
投票

你可能需要更多的时期。基本上每个传递一次,宏处理器需要完成以完全解析宏变量引用。

但是重新构建程序可能更容易,因此您不必担心它。

%local dsname ;
%let dsname = &&_produto&i
%let dsname = &dsname._&&_mes_char&j;
data &dsname ;
 ...

0
投票

两种情况都很好!谢谢你们的帮助

%let mvar1 = foo;
    %let mvar2 = bar;

    %let i = 1;
    %let j = 2;

    %put &&mvar&i.._&&mvar&j;
    Output:

foo_bar

%local dsname ;
%let dsname = &&_produto&i
%let dsname = &dsname._&&_mes_char&j;
data &dsname ;
 ...
© www.soinside.com 2019 - 2024. All rights reserved.