Ошибка при использовании макропеременной в DO l oop в SAS: обязательный оператор не найден в выражении - PullRequest
2 голосов
/ 11 февраля 2020

Я использую 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 = &quote_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;

Кто-нибудь может увидеть, что идет не так?

1 Ответ

4 голосов
/ 11 февраля 2020

Нет макросов, называемых year и month. Вы должны использовать %sysfunc:

%LET start_year = %sysfunc(year(&start_date.));
%LET end_year = %sysfunc(year(&end_date.));
%LET start_month = %sysfunc(month(&start_date.));
%LET end_month = %sysfunc(month(&end_date.));
...