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