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