Если у вас есть много фильтров, которые указаны как «фрагменты исходного кода шага данных» в возможных макропеременных, вы можете закодировать отдельный макрос (CODEGEN_flag_logic
), чтобы проверить фильтры по имени и определить, стоит лиэтот исходный код должен быть передан как часть шага данных.
Пример:
%MACRO CODEGEN_flag_logic (FILTER, DEFAULT=1);
%* FILTER is name of macro variable containing source code that is data step logical evaluation snippet;
%if %length(&FILTER) %then
%if %symexist (&FILTER) %then
%if %length (&&&FILTER) %then
&&&FILTER;
%else
&DEFAULT;
%else
&DEFAULT;
%else
&DEFAULT;
%MEND;
%let name_flag_logic = name =: "J"; /* extant source code */
data want;
set sashelp.class;
name_flag = %codegen_flag_logic (name_flag_logic);
name_flag_inverse = %codegen_flag_logic (name_flag_logic, DEFAULT=0);
run;
%let name_flag_logic = ; /* extant macro variable with no source code */
data want;
set sashelp.class;
name_flag = %codegen_flag_logic (name_flag_logic);
run;
%SYMDEL name_flag_logic; /* macro variable not present in session or scope */
data want;
set sashelp.class;
name_flag = %codegen_flag_logic (name_flag_logic);
run;
Все еще будут проблемы, если указанные фильтры содержат недопустимый код SAS или имеют дело с переменными, ожидаемыми в PDVчто нет.
Например,
/* snippet uses homeroom (which will be noted in LOG as uninitialized */
%let name_flag_logic = homeroom = 'sunny';
/* snippet is invalid sas code and will show ERROR in the LOG */
%let name_flag_logic = busroute one of (1,2,3);