2017-01-04 3 views
0

Я пытаюсь запустить код, который, как мы надеемся, объединит данные за несколько месяцев или лет. Я пытаюсь выяснить, когда поле было заполнено значением. То есть есть поле XYZ в моем наборе данных, и оно заполнено значением A в ноябре 2016 года. Если я запустил свой код из Jan-Dec, я бы хотел, чтобы новое поле заполнялось датой, когда SAS встречает не пустое значение в этом поле.SAS Ошибка при попытке выполнить цикл через несколько наборов данных

Вот мой код:

options mprint symbolgen source mlogic merror syntaxcheck ; 

%macro append_monthly(iStart_date=, iEnd_date=); 

    %local tmp_date i; 
    %let tmp_date = %sysfunc(intnx(month,&iStart_date,0,beginning)) ; 

    %do %while (&tmp_date le &iEnd_date); 

    %let i = %sysfunc(sum(&tmp_date),yymmn4.); 
    %put &i.; 

    %let tmp_date = %sysfunc(intnx(month,&tmp_date,1,beginning)) ; 

    libname note "my.qualifiers.fords.note&i." disp=shr; 

data new ; 
set note.file ; 

%if ln_note_crbur_date_delinq ne '' %then spc_cmt_date = &i.; 

run; 

    %end; 


%mend; 
%append_monthly(iStart_date=%sysfunc(mdy(5,1,2016)), iEnd_date=%sysfunc(mdy(10,1,2016))); 

LIBNAME _ALL_ CLEAR; 

Вот пример из журнала с ошибками:

SYMBOLGEN: Macro variable TMP_DATE resolves to 20606 
SYMBOLGEN: Macro variable IEND_DATE resolves to 20728 
MLOGIC(APPEND_MONTHLY): %DO %WHILE(&tmp_date le &iEnd_date) condition is TRUE; loop will iterate again. 
MLOGIC(APPEND_MONTHLY): %LET (variable name is I) 
SYMBOLGEN: Macro variable TMP_DATE resolves to 20606 
MLOGIC(APPEND_MONTHLY): %PUT &i. 
SYMBOLGEN: Macro variable I resolves to 1606 
1606 
MLOGIC(APPEND_MONTHLY): %LET (variable name is TMP_DATE) 
SYMBOLGEN: Macro variable TMP_DATE resolves to 20606 
MPRINT(APPEND_MONTHLY): spc_cmt_date = 1605 run; 
SYMBOLGEN: Macro variable I resolves to 1606 
MPRINT(APPEND_MONTHLY): libname note "my.qualifiers.fords.note1606" disp=shr; 
ERROR: Unable to clear or re-assign the library NOTE because it is still in use. 
ERROR: Error in the LIBNAME statement. 
NOTE: The SAS System stopped processing this step because of errors. 
WARNING: The data set WORK.NEW may be incomplete. When this step was stopped there were 0 observations and 622 variables. 
WARNING: Data set WORK.NEW was not replaced because this step was stopped. 
NOTE: The DATA statement used 0.01 CPU seconds and 49483K. 

NOTE: The address space has used a maximum of 4292K below the line and 240388K above the line. 

Я не могу понять, почему это не работает. Возможно, это может работать с помощью Proc append.

В принципе, мне просто нужен мой вывод с полем, которое возвращает дату в форме YYMM, если поле ln_note_crbur_date_delinq не было пустым.

Любая помощь будет принята с благодарностью

ответ

1

Я предполагаю причину вашей ошибки в том, что ручка не очищается от исходного файла до следующего оператора Имя_библиотеки пытается переназначить.

легко исправить будет использовать другой псевдоним (libref) каждый раз, как показано ниже:

libname note&i "my.qualifiers.fords.note&i." disp=shr; 

Затем настроить шаг данных следующим образом:

data new ; 
    set note&i..file ; 

Следующая часть, как представляется, быть путаницей между макро логикой и шагом данных. Просто удалите % символы следующим образом:

if ln_note_crbur_date_delinq ne '' then spc_cmt_date = &i.; 

Наконец, добавьте proc append до %end следующим образом:

proc append base=work.final data=new; run; 

Если work.final не существует, он будет создан в том же формате, как new.

EDIT:

после обсуждения в комментариях, здесь пересмотренный подход:

%macro append_monthly(iStart_date=, iEnd_date=); 
    %local tmp_date i set_statement; 
    %let tmp_date = %sysfunc(intnx(month,&iStart_date,0,beginning)) ; 
    %do %while (&tmp_date le &iEnd_date); 
    %let i = %sysfunc(sum(&tmp_date),yymmn4.); 
    %let tmp_date = %sysfunc(intnx(month,&tmp_date,1,beginning)) ; 
    %let set_statement=&set_statement &i..file; 
    libname note&i "my.qualifiers.fords.note&i." disp=shr; 
    %end; 
    data new ; 
    set &set_statement; 
    if ln_note_crbur_date_delinq ne '' then spc_cmt_date = &i.; 
    run; 
%mend; 
%append_monthly(iStart_date=%sysfunc(mdy(5,1,2016)), iEnd_date=%sysfunc(mdy(10,1,2016))); 

LIBNAME _ALL_ CLEAR; 
+0

Я новичок в макросах. Я всегда предполагал, что вы используете макрофункции внутри макроса, даже если это datastep. Поэтому добавление знака% впереди. Спасибо за это разъяснение :) – DukeLuke

+0

Вопрос: не будет ли команда set конкатенировать новый файл note.file для работы.ново? Я думал, что в наборе утверждений есть другой набор данных, который устраняет необходимость добавления proc? возможно, это переписывает его. Мне просто интересно, как это работает – DukeLuke

+1

Nope .. Язык макросов - это текстовый генератор, который вы используете для написания (не макро) кода SAS. По этой причине операторы макросов всегда выполняются перед базовыми шагами данных и т. Д. –

Смежные вопросы