Search code examples
sassas-macro

Can I change the execution order of the CALL EXECUTE stack in SAS?


I'm using SAS 9.1.3 to call a macro in a DATA step, but the macro generates a PROC REPORT step, so I am using CALL EXECUTE to call it, generate all those PROC REPORT steps, and then execute them all after the DATA step.

I'm using an array, and the macro is executed each time for every element in this array:

DATA macro_test;
  ARRAY questions[3] $ 32 ('question1' 'question2' 'question3');

  DO i=1 to 3;
    a_question = questions(i);
    CALL EXECUTE( "%report_by_question(a_question)" ); 
  end;

RUN;

The thing is, the report outputs are coming out (usually) backwards - it will print question3 first, then 2, then 1.

Is there a way to modify the execution order of CALL EXECUTE so I can have the question reports print in order, or does it just do its own thing?

Thanks!


Solution

  • I assume you mean something more like this for yout call execute() line:

     CALL EXECUTE( "%report_by_question(" || trim(left(a_question)) || ");" ); 
    

    With a test macro I get some log lines like this, showing that the call execute()s are happening in the right order. Do you get anything similar?

    Macro

    %macro report_by_question(a);
    data test_&a;
      do i=1 to 10000000;
        output;
      end;
    run;
    %mend;
    

    Logs

    NOTE: CALL EXECUTE generated line.
    1   + data test_question1;   do i=1 to 10000000;     output;   end; run;
    
    NOTE: The data set WORK.TEST_QUESTION1 has 10000000 observations and 1 variables.
    NOTE: DATA statement used (Total process time):
          real time           6.14 seconds
          cpu time            0.45 seconds
    
    
    1   +                                                                   ;
    2   + data test_question2;   do i=1 to 10000000;     output;   end; run;
    
    NOTE: The data set WORK.TEST_QUESTION2 has 10000000 observations and 1 variables.
    NOTE: DATA statement used (Total process time):
          real time           3.87 seconds
          cpu time            0.53 seconds
    
    
    2   +                                                                   ;
    3   + data test_question3;   do i=1 to 10000000;     output;   end; run;
    
    NOTE: The data set WORK.TEST_QUESTION3 has 10000000 observations and 1 variables.
    NOTE: DATA statement used (Total process time):
          real time           3.12 seconds
          cpu time            0.45 seconds