Я использую SAS, и мне нужно объединить несколько таблиц, каждая из которых имеет суффикс месяца и года в названии. Заданные таблицы c для использования будут переменными в зависимости от заданной пользователем даты начала и окончания. Чтобы добиться этого, я пытаюсь использовать do l oop через макрос для l oop через месяцы / годы в диапазоне дат и добавить к предыдущей таблице. Тем не менее, у меня возникают проблемы (по-видимому, делать с помощью макропеременной для начала / конца года в l oop). Я получаю следующие ошибки:
ERROR: Required operator not found in expression: &start_year.
ERROR: The %FROM value of the %DO QUOTE_YEAR loop is invalid.
ERROR: Required operator not found in expression: &end_year.
ERROR: The %TO value of the %DO QUOTE_YEAR loop is invalid.
ERROR: The macro GET_PRICES will stop executing.
Вот пример тестового кода, с которым я столкнулся, который повторяет проблему, вызвавшую ошибки, над которыми я пытаюсь отладить. Обратите внимание на этот пример, я только циклы по годам. (Я добавлю месяцы, как только решу эту проблему.)
DATA _NULL_;
FORMAT start_date end_date DATE9.;
start_date = '01JUL2018'd;
end_date = '30JUN2019'd;
CALL SYMPUT('start_date',start_date);
CALL SYMPUT('end_date',end_date);
RUN;
%MACRO get_prices(start_date, end_date);
%LET start_year = year(&start_date.);
%LET end_year = year(&end_date.);
%LET start_month = month(&start_date.);
%LET end_month = month(&end_date.);
DATA test;
t = 0;
RUN;
%DO quote_year = &start_year. %TO &end_year.;
DATA test2;
t = "e_year.;
RUN;
PROC APPEND BASE= test DATA= test2;
%END;
%MEND;
%get_prices(&start_date.,&end_date.);
Ожидаемый результат - таблица с одним столбцом 't', с 3 строками: (0, 2018, 2019). (Значение 0, которое я только что включил, чтобы инициализировать непустую таблицу, к которой нужно добавить.) Код работает, когда я заменяю макропеременные на начальный / конечный год в значениях l oop их фактическими значениями.
Не работает
%DO quote_year = &start_year. %TO &end_year.;
Работает
%DO quote_year = 2018 %TO 2019;
Я не могу понять, что вызывает эту ошибку , Я полагаю, что это как-то связано с тем, как я определил макропеременные, но странно то, что, если я полностью удаляю do l oop и получаю следующий шаг данных под операторами% LET, значения выглядят как ожидается.
DATA test_macro_values;
s = &start_year.;
t = &end_year.;
u = &start_month.;
v = &end_month.;
RUN;
Кто-нибудь может увидеть, что идет не так?