Как я могу выполнить итеративную программу макросов с последовательными постоянными числами в sas?

Я новичок в макросе. Я модифицировал макропрограмму и работает. Но я должен написать следующий макрос сто раз следующим образом.

%quint(dsn=cc1, var=MB, quintvar=MB5, num=111) ;    
%quint(dsn=cc1, var=MB, quintvar=MB5, num=112)  ;  
%quint(dsn=cc1, var=MB, quintvar=MB5, num=113) ;
-
- 
%quint(dsn=cc1, var=MB, quintvar=MB5, num=400)  ;  

Каждый раз, когда я делаю программу для этой работы, num распознается как arugment вместо постоянных чисел. Как я могу сделать короткий и легкий для этого?

2 ответа

Вы можете использовать оператор RETAIN и CALL EXECUTE.

%macro quint (dsn, var, quintvar, num);
    %put &dsn;
    %put &var;
    %put &quintvar;
    %put #
%mend;

data _null_;
    retain numv 111;
    do until (numv = 400);
        call execute ('%quint(cc1, MB, MB5,'||numv||')');
        numv+1;
    end;
run;

Это работает.

Использование вызова execute обычно нормально, но это может быть немного затруднительно, чтобы правильно процитировать цитаты, и я обнаружил, что иногда он не может правильно обрабатывать сложные макросы. Я предпочитаю использовать макроподход, переписывая исходный макрос, чтобы принимать параметры для начала и конца цикла, или записывая макрос-обертку, например

%macro quint (dsn, var, quintvar, num);
    %put &dsn;
    %put &var;
    %put &quintvar;
    %put #
%mend;

%macro run_quint(dsn, var, quintvar, num_from, num_to);
    %local i;
    %do i = &num_from %to &num_to;
        %quint(dsn=&dsn, var=&var, quintvar=&quintvar, num=&i)
    %end;
%mend;

%run_quint(dsn=cc1, var=MB, quintvar=MB5, num_from=111, num_to = 115);
Другие вопросы по тегам