Search code examples
sqlerror-handlingsasmacrossas-macro

Cannot call macro - ERROR 180-322: Statement is not valid or it is used out of proper order


%macro g;
    proc sql outobs=1;
        create table working_day as 
            select max(calendar_date9) format date9. as WK_day, 
                   (select cur_date from cur_date) as current_date format date9.
            from rank_job_calendar_list_s1 
            where (calendar_date9 <= (select cur_date from cur_date)) and rundate_ind = 'Y';
    quit;

    proc sql;
        select WK_day into: work_day from working_day;
    quit;

    %put &work_day.;
%mend gg;

data rank_job_calendar_list_due(keep=calendar_date calendar_date9 rundate_ind rank due_day_rank);
    set rank_job_calendar_list_s1(where=(rundate_ind = 'Y' and weekday(datepart(calendar_date)) \< 7));

    if calendar_date9="&cur_date."d then due_day_rank=rank +44;

    else if calendar_date9^="&cur_date."d then %gg;
run;

Solution

  • Your code as written cannot work, because the macro is a code generator, not a code executor. It generates a PROC SQL step, but you end up with your DATA step trying to call a PROC SQL step, which doesn't work.

    In this case, it would be easier to run the PROC SQL step to create the macro variable, then use the macro variable in the DATA step, e.g.:

    proc sql outobs=1;
        create table working_day as 
            select max(calendar_date9) format date9. as WK_day, 
                       (select cur_date from cur_date) as current_date format date9.
            from rank_job_calendar_list_s1 
            where (calendar_date9 <= (select cur_date from cur_date)) and rundate_ind = 'Y';
    quit;
    
    proc sql;
        select WK_day into: work_day from working_day;
    quit;
    
    %put &work_day.;
    
    
    data rank_job_calendar_list_due(keep=calendar_date calendar_date9 rundate_ind rank due_day_rank);
        set rank_job_calendar_list_s1(where=(rundate_ind = 'Y' and weekday(datepart(calendar_date)) \< 7));
    
        if calendar_date9="&cur_date."d then due_day_rank=rank +44;
    
        else if calendar_date9^="&cur_date."d then &work_day;
    run;