2016-05-09 4 views
1

У меня есть код, который говорит мне, что что-то пошло не так в файле a.sasSAS% INCLUDE Заявление - продолжить, даже если ошибка

filename myfile email                             
to=&e_mail.                            
subject= "Error"                            
type="text/plain";                              

%macro errmail;                               
%if &syserr ne 0 %then %do;                            
    data _null_;                               
    file myfile;                                                
    put;                                 
    put 'ERROR';                              
    put "&syserrortext";                             
    put; 
    put "Log: \\logs" ; 
    run;                                 
%end;                                 
%mend errmail;                               


%errmail 

Я использую% включают в себя функцию, что в другом файле, но когда у меня есть:

data a; 
infile "/usr/local/abc/load_file" dlm='09'x firstobs=2; 
INPUT id age; 
run; 

PROC SORT DATA=_load_a. NODUPKEY; 
BY id; 

    proc sql noprint; 
delete from abc.my_table; 
quit; 

proc append BASE=abc.my_table; DATA=load_a. FORCE; 

%include "/usr/local/abc/a.sas"; 

и если ошибка здесь (перед включением функции%), тогда я не получаю электронное письмо. Могу ли я использовать функцию% include, если я хочу получить информацию об ошибке, которая есть перед этой функцией?

Ниже приведена часть журнала, поэтому у меня есть ошибка раньше, и часть функции включения не выполнена.

NOTE: 129 records were read from the infile "/usr/local/642.txt". 
     The minimum record length was 25. 
     The maximum record length was 25. 
NOTE: The data set WORK.LOAD_642 has 129 observations and 3 variables. 
NOTE: DATA statement used (Total process time): 
     real time   0.00 seconds 
     cpu time   0.01 seconds 



16   PROC SORT DATA=LOAD_&nr. NODUPKEY; 
17   BY ID; 
3               System SAS         08:15 Tuesday, May 10, 2016 


NOTE: There were 129 observations read from the data set WORK.LOAD_642. 
NOTE: 0 observations with duplicate key values were deleted. 
NOTE: The data set WORK.LOAD_642 has 129 observations and 3 variables. 
NOTE: PROCEDURE SORT used (Total process time): 
     real time   0.00 seconds 
     cpu time   0.01 seconds 


19   proc sql noprint; 
20   delete from a.642_ID; 
sasxdbi: dbicon: special image for SAS/Poland 
sasxdbi: dbicon: special image for SAS/Poland 
NOTE: 135 rows were deleted from a.642_ID. 

20  !            ; 
21   quit; 
NOTE: PROCEDURE SQL used (Total process time): 
     real time   17.44 seconds 
     cpu time   0.08 seconds 


22 
23   proc append BASE=a.642_ID; 
sasxdbi: dbicon: special image for SAS/Poland 
23  !             DATA=LOAD_&nr. FORCE; 
                   ____ 
                   180 
ERROR 180-322: Statement is not valid or it is used out of proper order. 
24   
25   %include "/usr/local/generic.sas"; 

NOTE: Statements not processed because of errors noted above. 
NOTE: The SAS System stopped processing this step because of errors. 
NOTE: SAS set option OBS=0 and will continue to check statements. This might cause NOTE: No observations in data set. 
NOTE: PROCEDURE APPEND used (Total process time): 
     real time   1.20 seconds 
     cpu time   0.07 seconds 




NOTE: DATA statement used (Total process time): 
     real time   0.00 seconds 
     cpu time   0.00 seconds 
+0

Можете ли вы показать журнал с одного из ваших тестовых прогонов с ошибкой и не генерировать электронное письмо? Обратите внимание, что значение & syserr сбрасывается после каждой границы шага, что означает, что ваш пример кода может только обнаружить ошибку на шаге PROC APPEND. Также обратите внимание, что если SAS-ошибки и входят в режим синтаксической проверки (устанавливает obs = 0), ваша электронная почта не будет отправляться, если вы не восстановите режим синтаксического чека. – Quentin

+0

Было бы полезно, если бы макрос% errmail вставлял код в тот же файл? Как я могу восстановить его из режима синтаксического чека? – aola

+1

В макросе перед шагом _null_ добавить 'options obs = max replace nosyntaxcheck; 'Это должно восстановиться из режима синтаксического чека. Когда вы находитесь в режиме synaxccheck, SAS устанавливает obs = 0 (как в примечании в вашем журнале), поэтому код шага данных не выполняется. – Quentin

ответ

2

Обратите внимание, что переменная & SYSERR сбрасывается после каждого шага, так как написано , это будет определять только, произошла ли ошибка в шаге PROC APPEND, который непосредственно предшествует оператору% INCLUDE.

Как сказано в журнале, если ошибки PROC APPEND могут привести к вводу SAS в режим SYNTAXCHECK. См. Примечание о том, что параметр настройки SAS obs = 0. В этом состоянии код не выполняется, SAS просто проверяет код на ошибки компиляции.

Если вы хотите восстановить из режима SYNTAXCHECK, так что SAS будет продолжать выполнение кода, который происходит после ошибки, можно добавить следующие опции заявление вашего% ERRMAIL макроса перед data _null_ шага:

options obs=max replace nosyntaxcheck; 
0

Ваш прок Append имеет дополнительный полу столбец в нем:

proc append BASE=abc.my_table; DATA=load_a. FORCE; 

Должно быть:

proc append BASE=abc.my_table DATA=load_a. FORCE; 
+0

Вы правы, спасибо – aola

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