Как объяснено в ответах на ваш другой вопрос , плохая идея определять макрос в другом определении макроса. В вашем примере это означает, что вы можете переместить определение макроса утилиты% nos_obs:
%macro nos_obs(dsn=,where_stmt=);
proc sql;
select
count(*)
into :l_decision
from &dsn.
&where_stmt.
;quit;
%mend ;
Этот блок кода не должен быть внутри блока:
%macro GENERATE_STOCK;
...
%mend GENERATE_STOCK;
Вы по-прежнему можете вызывать% nos_obs из% generate_stock. Только не вкладывайте определения макросов. В итоге вы получите:
*define a macro;
%macro nos_obs(dsn=,where_stmt=);
...
%mend ;
*define a macro that does some stuff and invokes another macro;
%macro GENERATE_STOCK;
...
%nos_obs(dsn=...)
...
%mend GENERATE_STOCK;
%generatestock
В этом и заключается общий смысл отсутствия вложенных определений макросов. К вашей общей картине похоже, что вы пишете планировщик в SAS. Например, linux cron или windows scheduler, где вы решаете, какие программы запускать в зависимости от дня недели. Обычно лучше использовать специальное решение планировщика (cron, LSF, планировщик Windows и т. Д.), А не писать свое. Лучше означает проще, удобнее в обслуживании, более гибко и т. Д. Они позволят вам управлять зависимостями , пауза и перезапуск и т. д. и т. д.
Тем не менее, если вы пишете свой собственный планировщик в SAS (многим это удается, иногда трудно устоять перед искушением), я думаю, что код, который вы показали, намного сложнее, чем он должен быть.
У вас есть контрольный набор данных, в котором перечислены дни, в которые должен выполняться каждый процесс:
data CONTROL_FILES_BASE;
input Priority : 2.
ACTIVE: 1.
PROCES_NAME: $10.
Nr_week_day: $10.
; cards;
1 1 TEST_01 (1,3,6)
2 1 TEST_02 0
3 1 TEST_03 (4,5)
;
Если вы хотите определить, какие процессы должны запускаться сегодня, вам просто нужно выяснить, какой сегодня день недели, и соответственно выбрать записи. Что-то вроде:
data General_Stock ;
set CONTROL_FILES_BASE ;
where findc(Nr_week_day,put(weekday(today()),1.)) ;
run ;
Когда я пишу это, это суббота, поэтому weekday (today ()) возвращает 7, и выше выбирается 0 записей, потому что нет процессов, запланированных для выполнения по субботам.
Если вам нужен макрос, потому что вы хотите проверить, какие процессы ваш контрольный набор данных будет запускать в разные даты, вы можете написать небольшой макрос, в который вы введете дату извлечения. Что-то вроде:
%macro GENERATE_STOCK
(data=/*name of input control dataset*/
,out= /*name of output dataset*/
,ExtractDate=/*extract date is a SAS date or expression like today() */
);
data &out ;
set &data ;
where findc(Nr_week_day,put(weekday(&extractDate),1.)) ;
run ;
title1 "Printout of &out genenerated when ExtractDate=%superq(ExtractDate)" ;
proc print data=&out ;
run ;
title1 ;
%mend GENERATE_STOCK ;
Тест как:
%generate_stock(data=control_files_base,out=wantToday ,extractdate=today())
%generate_stock(data=control_files_base,out=wantSunday ,extractdate="11Nov2018"d)
%generate_stock(data=control_files_base,out=wantMonday ,extractdate="12Nov2018"d)
%generate_stock(data=control_files_base,out=wantTuesday ,extractdate="13Nov2018"d)
%generate_stock(data=control_files_base,out=wantWednesday,extractdate="14Nov2018"d)
%generate_stock(data=control_files_base,out=wantThursday ,extractdate="15Nov2018"d)
%generate_stock(data=control_files_base,out=wantFriday ,extractdate="16Nov2018"d)
%generate_stock(data=control_files_base,out=wantSaturday ,extractdate="17Nov2018"d)