SAS Email, если происходят ошибки - PullRequest
3 голосов
/ 02 марта 2012

есть ли какой-либо код / ​​макрос, который я могу включить в свою программу sas, которая будет отправлять мне электронное письмо, как только в моем коде sas возникает ошибка, когда он выполняется?

Также возможно ли в этом письме указыватьошибка, которая произошла?

Ответы [ 2 ]

2 голосов
/ 02 марта 2012

Да .... и нет ...

Это возможно - но нет хорошего способа сделать это.Вам придется проверять после каждой процедуры, чтобы увидеть, произошла ли ошибка.По сути, вы вставляете строку кода для выполнения теста десятки (или сотни) раз по всему коду.

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

Этот подход также имеет свой отдельный набор проблем.Чтобы начать с макропеременных SYS, которые содержат информацию об ошибках, храните информацию только для самой последней ошибки.Мы могли бы проверить журнал, но проблема в том, что журнал все еще используется программой, которую мы в данный момент выполняем, и проверить, что мешает нам использовать SAS, чтобы открыть его для чтения из него.

Чтобы обойти это, нужно дважды позвонить в SAS.Первый раз запустить программу и сохранить журнал в указанный файл.Во второй раз запустить программу, которая проверит только что созданный файл журнала, и отправить электронное письмо, если соблюдены определенные критерии (например, строка начинается с ERROR:.

Некоторые подробности ... когда выЗапустите sas во второй раз, вы можете использовать параметр SYSPARM для передачи имени файла журнала, который вы хотите проверить. Вы можете проанализировать файл журнала с помощью кода примерно так (я предлагаю вам настроить условия для вашей собственной ситуации):

**
** READ IN LOGFILE. CHECK FOR PROBLEMS
*;

data problems log;
  length line $1000;

  infile "&logfile";
  input;

  logfile = "&logfile";
  line_no = _n_;
  line    = _infile_;
  problem = 0;

  if 
  (
     line =: "ERROR:"
  or line =: "WARNING:"
  or line =: "NOTE: Numeric values have been converted to character values"
  or line =: "NOTE: Character values have been converted to numeric values"
  or line =: "NOTE: Missing values were generated as a result of performing an operation on missing values"
  or line =: "NOTE: MERGE statement has more than one data set with repeats of BY values"
  or line =: "NOTE: Invalid (or missing) arguments to the INTNX function have caused the function to return"
  or line =: "INFO: Character variables have defaulted to a length of 200"
  or line =: "NOTE: Invalid"
  )
  and not
  (
      line =: "WARNING: Your system is scheduled to expire"
  or  line =: "WARNING: The Base Product product with which Session Manager is associated"
  or  line =: "WARNING: will be expiring soon, and is currently in warning mode to indicate"
  or  line =: "WARNING: this upcoming expiration. Please run PROC SETINIT to obtain more"
  or  line =: "WARNING: information on your warning period."
  or  line =: "WARNING: This CREATE TABLE statement recursively references the target table. A consequence"
  or  line =: "WARNING: Unable to copy SASUSER registry to WORK registry. Because of this, you will not see registry customizations during this"
  or  line =: "WARNING: Estimates did not improve after a ridge was encountered in the objective function."
  or  line =: "WARNING: Estimates may not have converged."
  or  line =: "ERROR: A lock is not available for"
  or  line =: "ERROR: Errors printed on page"
  or (line =: "WARNING: Apparent symbolic reference TODT not resolved." and "%upcase(&jobname)" eq "DIAL800.REPORTING_API")
  )
  then do;
    problem = 1;
    output problems;
  end;
  output log;
run;

filename mymail email content_type="text/html"
                      to=( test@test.test )
                      from=("myemail@test.test")
                      subject="mysubject"
                      attach="&logfile";

data _null_;
  length divider $200;

  file mymail;

  set problems end=eof;

  divider = repeat('=',80);

  if _n_ eq 1 then do;
    put '<font style="font-family:courier new;font-size:9pt"><br>';
    put divider "<br>";
    put "SUMMARY OF PROBLEMS: &logfile <br>";
    put divider "<br><br>";
  end;

  put line_no 5. ": " line "<br>";

  if eof then do;
    put divider "<br>";
    put "END OF SUMMARY     <br>";
    put divider "<br><br>";
  end;

run;

Из вашего вопроса неясно, знаете ли вы, как отправить электронное письмо в SAS, но если нет, то я предлагаю сначала поискать его в Google, а если вы все еще не можете заставить его работать, тогда вернитесь и отправьте сообщение.отдельный вопрос.

РЕДАКТИРОВАТЬ: Вы можете указать, куда SAS должен сохранять файл журнала, используя параметр -LOG "myfile.log" при вызове SAS.

0 голосов
/ 06 марта 2012

Эта краткая статья дает простой код SAS, который показывает, как проверять наличие ошибок и отправлять электронную почту в случае ошибки.Как уже упоминал Роб, вы должны проверять коды ошибок после каждой процедуры.

https://heuristically.wordpress.com/2012/02/09/return-codes-errors-sas/

Этот код не отправляет журнал, но вы можете отправить общую ошибку, определив макроспеременная с кратким описанием типа «не удалось запросить базу данных SQL».В нашей организации мы запускаем около 50-100 (?) Программ SAS в пакетных заданиях и сохраняем каждый журнал с отметкой даты, например 2012-03-05 13:05 daily job.log

...