SAS Определить макрос на сервере Unix - PullRequest
0 голосов
/ 28 августа 2018

Привет. Я пытаюсь определить и запустить макрос SAS на сервере Unix.

options symbolgen mprint mlogic;
*options nosymbolgen nomprint nomlogic;

rsubmit;

%let trend_MM = 1;
%let run_date = &sysdate.;

/* loop through Trend_MM number of times to retrieve the MTR completed per each month. */
%macro Trend();
%local start_dt;
%local end_dt;
%local i;

/* loop through each month */
%do i = &Trend_MM. %to 0 %by -1;

/* Calculate set start/end dates to start/end of month */
%let start_dt = %qsysfunc(intnx(month,"&run_date."d,%eval(-1*&i.),b),date9.);
%let end_dt = %qsysfunc(intnx(month,"&run_date."d,%eval(-1*&i).,e),date9.);

    /* select MTR claims in month */
    proc sql;
        create table MTR_&i. as
        select a.claim_id_360
              ,a.claim_id_external 
              ,a.timestamp
              /* v02: a) export date part of the timestamp */
              ,datepart(a.timestamp) as timestamp_dt
              ,a.status_data 
              ,a.status_label 
              ,a.RFE_template_name 
              ,a.brand_name
              ,case when b.claim_id_360 is not missing then "Y" else "N" end as MTR_compl
              ,c.MTR_count
              ,b.last_MTR_comp format = ddmmyy10.
        from 
            /* Base population are all claims where final status is not   */
            (
             select distinct *
             from allg360r._travel_rfe_state_change_hist
             (keep = claim_id_360 claim_id_external timestamp status_data status_label RFE_template_name brand_name)
             where datepart(timestamp) between "&start_dt."d and "&end_dt."d
             group by claim_id_360 
             having timestamp = max(timestamp) and strip(upcase(status_label)) ne "Move to Review"
            ) a

            left join 
        /*     subset with claims that have had a  status in the reference period to obtain  */
        /*     claims that have had such status completed in the period.                                     */
        /*     Also retrieve date of last MTR completed                                                      */
            (
             select distinct claim_id_360, datepart(timestamp) as last_MTR_comp
             from allg360r._travel_rfe_state_change_hist
             (keep = claim_id_360 claim_id_external timestamp status_data status_label RFE_template_name brand_name)
             where (datepart(timestamp) between "&start_dt."d and "&end_dt."d) and status_label = "Move to Review"
             group by claim_id_360
             having timestamp = max(timestamp)
            ) b
            on a.claim_id_360 = b.claim_id_360

            left join 

        /*   Add count of how many since inception of claim  */
        /* v02: b) count how many times in MTR since beginning */
            (
             select distinct
                    claim_id_360
                   ,count(claim_id_360) as MTR_count
             from allg360r._travel_rfe_state_change_hist
             (keep = claim_id_360 claim_id_external timestamp status_data status_label RFE_template_name brand_name)
             where status_label = "Move to Review"
             group by claim_id_360
            ) C
            on a.claim_id_360 = c.claim_id_360
        ;
        quit;

    /* create/append to dataset of all months */

    %if &i. = &trend_MM. %then 
      %do;
        proc sql;
            drop table work.MTR;
            create table work.MTR like work.MTR_&i.;
        quit;
      %end;

    proc append base = work.MTR data = work.MTR_&i.;
    run;
%end;

%mend Trend;

%trend

endrsubmit;

Кажется, что работает нормально, но я продолжаю получать эту ошибку в журнале:

995 endrsubmit; ---------- 180

ОШИБКА 180-322: оператор недействителен или используется неправильно заказ.

Ошибка, похоже, исчезнет, ​​если я поставлю точку с запятой после вызова макроса. Это не имеет смысла для меня, потому что макрос заканчивается бегом; и точка с запятой после вызова не должна иметь никакого значения.

Есть идеи, почему это происходит?

Ответы [ 2 ]

0 голосов
/ 28 августа 2018

Верьте или нет, потому что вы определили свой макрос с пустым списком параметров:

%macro Trend();
  %put TREND running;
%mend trend;

Когда вы пытаетесь вызвать макрос как %trend SAS ожидает, что вы отправите ему список параметров, даже пустого списка будет достаточно. Таким образом, вызов макроса не закончился. Точка с запятой завершит вызов макроса, но вы правы в том, что он не нужен, и это плохая привычка добавлять лишние точки с запятой. Когда вы вызываете макрос, у которого определен список параметров (даже в этом случае, если в определении макроса в круглых скобках было 0 параметров, так что список все еще определен в некотором смысле), вы можете вызвать его как %trend(). Скобки завершают вызов макроса.

С ПК SAS вы можете проверить это, выделив %trend и отправив его. Макрос не запустится. Затем, если вы отправите (), макрос запустится.

Обновление : Так как исправление вызова макроса не сработало, я подозреваю, что это может быть ошибкой в ​​том, как сканер слов распознает оператор endrsubmit. Предполагая, что это можно воспроизвести, я бы добавил комментарий с точкой с запятой. По крайней мере, так ясно, что точка с запятой не является частью завершения вызова макроса. Извините, я не могу выполнить тестирование, поскольку SAS / соединение недоступно.

Что-то вроде:

* endrsubmit needs a semicolon before it ??? ;
endrsubmit ;
0 голосов
/ 28 августа 2018

Причина в том, что вы определили макрос в скобках ()

Добавьте несколько скобок к вызову, и он будет выполняться без точки с запятой.

%trend()

...