У меня возникают трудности с использованием оператора IF в макросе SAS - PullRequest
0 голосов
/ 29 октября 2019

Я настраиваю пакетный скрипт в SAS, я хочу, чтобы он запускался ежемесячно и выводился в таблицу, код работает при ручном запуске, но у меня возникают трудности при настройке макросов.

Я создал 3макросы, один за предыдущий месяц (пожалуйста, игнорируйте жестко запрограммированный код 12 и закомментированный код, я просто проверял, сработал он или нет, закомментированный код останется, а код 12 с жестким кодом будет удален, когда я смогу заставить его работать), один для текущего года и один для предыдущего года. Проблема, которая у меня возникнет, заключается в том, что скрипт собирает данные о конце месяца, поэтому в январе будет установлен 2020 год, но месяц будет искать данные за декабрь.

`%let pmonth = 12 /*%sysfunc(month(%sysfunc(intnx(month,"&sysdate"d ,-1))))*/;`

`%put &pmonth;` 

`%let year1 = %sysfunc(year("&sysdate"d));`

`%put &year1;` 

`%let year2 = %sysfunc(year(%sysfunc(intnx(year,"&sysdate"d ,-1))));`

`%put &year2;` 

`%macro year;
%if &pmonth = 12 %then %do;
&year2;
%end;
%else %do;
&year1;
%end;
%mend;
%year;`

То, что я хотел бы, это длямакрос год, который используется в моем коде, для правильного выбора между годами 1 и год 2 в зависимости от месяца макросов. Я немного поэкспериментировал с макросами, но, если честно, это не та область SAS, которой я часто пользовался.

1 Ответ

1 голос
/ 29 октября 2019

Сначала немного терминологии. В вашем коде определен один макрос ,% YEAR. Он имеет три макропеременных с именами YEAR1, YEAR2 и PMONTH. И нет макропеременной с именем YEAR, которую ваш код пытается создать или использовать. И в вашем коде нет операторов IF. Но в определении макроса YEAR есть один оператор% IF.

Возможно, вы захотите преобразовать значения макропеременных в фактические значения DATE, чтобы справиться с проблемой года. Поэтому, если вы введете две макропеременные с YEAR и MONTH, вы можете преобразовать это в дату.

%let year1=2018;
%let month=1;
%let date=%sysfunc(mdy(&month,1,&year1));

Тогда, если вы хотите найти конец предыдущего месяца, вы можете использовать дату в INTNX () вызов функции.

%let end_of_prev_month=%sysfunc(intnx(month,&date,-1,e));

Тогда, если вам нужно, вы можете получить ГОД и МЕСЯЦ для этой новой даты.

%let year2=%sysfunc(year(&end_of_prev_month));
%let month2=%sysfunc(month(&end_of_prev_month));
...