Проверка на существование макропеременных

Всем привет!

В данной статье я опишу способы проверки существования макропеременных. Случается, что несуществующая макропеременная в функции ломает программу, то есть в логе появляется запись типа ERROR:…


Самый колхозный случай, который обычно применяется в случае дебага, это вывод всех макропеременных в лог (или куда-либо ещё):
%PUT _ALL_;
Так же могут быть варианты типа вывода только локальных (_LOCAL_) или глобальных (_GLOBAL_) макропеременных.
Далее уже идёт обработка этого списка на наличие или отсутствие необходимых значений.
Можно также вывести значение переменной NAME:
%PUT &NAME;

Другой вариант проверки предоставляет сам SAS. Существует функция %SYMEXIST, которая проверяет макропеременную на наличие:
           %SYMEXIST(макропеременная)
Функция возвращает значение 1 (TRUE) или 0 (FALSE).

Пример кода, с официальной страницы прост и понятен:

%global x;
%macro test;
%local y;
%if %symexist(x) %then %put %nrstr(%symexist(x)) = TRUE;
%else %put %nrstr(%symexist(x)) = FALSE;
%if %symexist(y) %then %put %nrstr(%symexist(y)) = TRUE;
%else %put %nrstr(%symexist(y)) = FALSE;
%if %symexist(z) %then %put %nrstr(%symexist(z)) = TRUE;
%else %put %nrstr(%symexist(z)) = FALSE;
%mend test;
%test;

А вот что появится в ЛОГе:

%symexist(x) = TRUE
%symexist(y) = TRUE
%symexist(z) = FALSE

И третий способ заключается в написании своего собственного способа. Здесь вариантов много, всё зависит от задачи.
Данный вариант взят с официального сайта поддержки.

%macro check(mvar);
    %local i tmp;
    %let dsid=%sysfunc(open(sashelp.vmacro));
    %let num=%sysfunc(varnum(&dsid,name));

    %do %until(&ob = -1);
        %let i=%eval(&i+1);
        %let ob=%sysfunc(fetchobs(&dsid,&i));
        %let val=%sysfunc(getvarc(&dsid,&num));

        %if &val = %upcase(&mvar) %then
            %do;
                %let ob = -1;
                %let tmp=yes;
            %end;
        %else
            %do;
                %let tmp=no;
            %end;

        %if &ob=-1 %then
            %do;
                &tmp
            %end;
    %end;
    %let rc=%sysfunc(close(&dsid));
%mend check;

Или вот один из примеров, взятых отсюда:
%macro isBlank(param);
       %sysevalf(%superq(param)=,boolean)
%mend isBlank;
В это плане мне нравится сравнительная статья.

На этом всё!

Добавить комментарий

Войти с помощью: 

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Лимит времени истёк. Пожалуйста, перезагрузите CAPTCHA.