Как разделить имя набора данных двух макропеременных подчеркиванием? - PullRequest
0 голосов
/ 08 января 2019

Я пытаюсь отделить имя набора данных, которое создается двумя макропеременными, подчеркиванием, но оно выдает ошибку в% 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;

Ответы [ 3 ]

0 голосов
/ 08 января 2019

Вам, вероятно, нужно больше периодов. По сути, по одному на каждый проход, который необходимо выполнить макропроцессору для полного разрешения ссылок на макропеременные.

Но, вероятно, проще реструктурировать вашу программу, так что вам не нужно об этом беспокоиться.

%local dsname ;
%let dsname = &&_produto&i
%let dsname = &dsname._&&_mes_char&j;
data &dsname ;
 ...
0 голосов
/ 17 января 2019

Оба случая работали нормально! Спасибо ребята за вашу помощь

%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 ;
 ...
0 голосов
/ 08 января 2019

В этом случае вам понадобятся 2 точки - сначала для отделения переменной цикла от подчеркивания, а затем для отделения результирующего левого макроса var от подчеркивания после разрешения первой партии амперсандов.

Часто полезно написать минимальный пример, чтобы убедиться, что такого рода вещи работают так, как вы ожидаете. Э.Г.

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

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

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

Выход:

foo_bar
...