Правильный служебный макрос примет все абстракции обработки в качестве параметров:
data=
, набор данных для работы на
copy=
, переменные оставить в покое (копия - дань уважения оператору копирования в TRANSPOSE)
char_prefix=XC_
, префикс для применения к именам непереписанных символьных переменных, по умолчанию XC_
num_prefix=XN_
, префикс для применения к именам не скопированных числовых переменных, по умолчанию XN_
Внутренности служебного макроса - это черный ящик. Иногда дизайн внутренних элементов указывается для того, чтобы можно было выполнять шаги DATA и PROC.
Пример кода
Proc SQL
используется для заполнения макропеременной списком пар старых = новых имен, которые можно использовать в операторе RENAME
, выполняемом Proc DATASETS
%macro Fixer ( data=, copy=, char_prefix=XC_, num_prefix=XN_ );
%let syslast = &data;
%local lib mem rename_clause;
%let lib = %scan(&syslast,1);
%let mem = %scan(&syslast,2);
proc sql noprint;
select
trim(name) || '=' ||
case type
when 'num' then "&num_prefix" || name
when 'char' then "&char_prefix" || name
else ''
end
into :rename_clause separated by ' '
from
dictionary.columns
where
libname = "&lib"
and memname = "&mem"
and indexw (%upcase("©"), upcase(name)) = 0
;
proc datasets nolist;
modify &data;
rename &rename_clause;
run;
quit;
%mend;
data class;
set sashelp.class;
teacher = 'Davidowski';
run;
options mprint;
%Fixer ( data=class, copy=Name )
В других случаях внутренности не должны генерировать какой-либо код. Для этого вопроса такой макрос будет использовать макрофункцию %SYSFUNC
для доступа к функциям набора данных, таким как open
, close
, attrn
, vartype
, varname
, поскольку он проверяет критерии переименования и накапливает old = new name пары, которые будут выбраны для использования вызываемым абонентом.