Всем привет.
Сегодня рассмотрим казусный момент сравнение макропеременных и в чем нужно быть внимательным.
И так поехали:
Для начала зайдем на страничку sas и возьмем от туда пример кода:
%macro compare(first,second); %if &first>&second %then %put &first > &second; %else %if &first=&second %then %put &first = &second; %else %put &first<&second; %mend compare;
Данный макрос является рабочим при работе с целыми значениями.
Мы можем в этом убедиться, запустив сравнение например 11 и 100:
%compare(11,100);
Результатом будет в логе:
MLOGIC(COMPARE): %IF condition (&first>&second) is FALSE
MLOGIC(COMPARE): %IF condition &first=&second is FALSE11<100
Теперь давайте запустим тоже самое, только сравнивать будем 11.1 и 100, т.е. дробное значение и целое:
%compare(11.1,100);
Получаем результат:
MLOGIC(COMPARE): %IF condition (&first>&second) is TRUE
11.1 > 100
т.е. 11 целых и 1 десятая стала больше 100.
Вот такие дела.
Для того чтобы избежать такой ошибки нужно воспользоваться функцией %sysevalf
давайте изменим наш макрос на следующий:
%macro compare(first,second); %if %sysevalf(&first>&second) %then %put &first > &second; %else %if &first=&second %then %put &first = &second; %else %put &first<&second; %mend compare;
И запустим еще раз пример сравнения 11.1 и 100:
MLOGIC(COMPARE): %IF condition %sysevalf(&first>&second) is FALSE
MLOGIC(COMPARE): %IF condition &first=&second is FALSE11.1<100
Теперь все отработало так как надо.
Так что будьте внимательны.
P.S. Подпишитесь и получайте новые сватьи в день выхода.