Убедитесь, что макрос может обрабатывать несколько значений.В общем случае при вызове макроса не рекомендуется использовать запятую в качестве разделителя в списке значений.
Обычно пробел является лучшим разделителем, так как тогда вы можете использовать значение макроса непосредственно в сгенерированном коде.Например, если все ваши переменные имеют одинаковый тип, вы можете просто использовать шаг данных ARRAY.
%MACRO algo (IN_DS=,VAR_LIST=,DATA_TYPE_LIST=,OUT_DS=);
DATA &OUT_DS;
SET &IN_DS;
array list &var_list ;
do _n_=1 to dim(list);
%if &data_type_LIST = num %then %do ;
list(_n_)=sum(list(_n_),2);
%end;
%else %do;
list(_n_)=cats(list(_n_),'re');
%end;
end;
run;
%mend algo;
Если ваши переменные НЕ имеют одинаковый тип, то вам нужно сгенерировать отдельный оператор для каждой переменной.В этом случае вы можете использовать другой разделитель, если хотите, например, символ конвейера, который легче использовать в качестве разделителя при вызовах макро-функций, таких как %scan()
.
%MACRO algo (IN_DS=,VAR_LIST=,DATA_TYPE_LIST=,OUT_DS=);
%local i var;
DATA &OUT_DS;
SET &IN_DS;
%do i=1 %to %sysfunc(countw(&var_list,|));
%let var=%scan(&var_list,&i,|);
%if %scan(&data_type_LIST,&i,|) = num %then %do ;
&var=sum(&var,2);
%end;
%else %do;
&var=cats(&var,'re');
%end;
%end;
run;
%mend algo;
%algo(IN_DS=HAVE,VAR_LIST=CUST_ID|ACCT_ID,DATA_TYPE_LIST=num|char,OUT_DS=out1);