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

Sas 如何用下划线分隔两个宏变量数据集名称?,sas,identifier,sas-macro,Sas,Identifier,Sas Macro,我试图用下划线分隔由两个宏变量创建的数据集名称,但它在%macro create_table中给了我一个错误 %macro create_tables; * NOTE THE DOUBLE AMPERSAND! *; data &&_produto&i_&&_mes_char&j; 我试图在第一个宏变量的末尾使用一个点,但没有按预期工作。我怎样才能解决这个问题 %macro create_tables; * NOTE THE DOUBLE

我试图用下划线分隔由两个宏变量创建的数据集名称,但它在%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;

在本例中,您需要2个点-首先将循环变量与下划线分隔开,然后在解析第一批符号后,再使用另一个点将生成的左宏变量与下划线分隔开

写一个简单的例子来验证这类事情是否按照您所期望的方式工作,通常是很有帮助的。例如

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

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

%put &&mvar&i.._&&mvar&j;
输出:

foo_bar

你可能需要更多的月经。基本上,宏处理器为了完全解析宏变量引用而需要进行的每一次传递都有一次

但重新构建程序可能更容易,这样您就不必担心了

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

两种情况都很好!谢谢你们的帮助
%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 ;
 ...

您可能会有一个更清晰的工作流程演示,学习如何通过组处理执行
。一旦你们记下来了,你们就不必计算by变量的每个组合,也不必处理其中的每个组合子集。你们能更详细一点吗?我没有在表中列出变量并描述它们是如何链接的。看起来您正在将两个表的不同键值放入大量宏符号中,然后嵌套循环它们,为每个组合创建一个单独的表。您真的需要在表名中包含produto和mes_char值的单独表吗?在SQL中,内部联接一次执行基本相同的联接处理,数据可以更简单地在下游使用适当的
BY
WHERE
语句。是的,Richard,我需要每个表都有produto和mes\u char值,因为我试图为每个produto和mes\u char计算给定默认曲线的损失。但我有你的想法谢谢