2009-09-04 59 views
2

我正在使用SAS 9.1.3在DATA步骤中调用一个宏,但该宏生成一个PROC REPORT步骤,所以我使用CALL EXECUTE调用它,生成所有这些PROC REPORT步骤,然后全部执行它们DATA步骤后。我可以更改SAS中的CALL EXECUTE堆栈的执行顺序吗?

我使用数组,宏每次执行这个阵列中的每个元素:

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; 

的事情是,报告输出出来(通常情况下)向后 - 它将打印question3先,然后是2,然后是1.

有没有办法修改CALL EXECUTE的执行顺序,这样我就可以按顺序打印问题报告,还是只是做自己的事情?

谢谢!

回答

5

我假定你的意思是更多像这样YOUT call execute()行:

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

与测试宏我得到一些日志行像这样,显示出call execute() s的正确的顺序发生。你有类似的东西吗?

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

日志

 
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 
+0

没错,哈哈,忘了对变量的整体串连;) 所以,是的,我得到的日志中生成的步骤的正确顺序,但是当他们开始在输出被吐了出来,他们是看起来完全随机的顺序(我现在使用5个问题作为测试)。 – chucknelson 2009-09-04 15:10:54

+0

好吧 - 我只是做了一个测试,并将ODS转换为HTML,并且报表按照正确的顺序排列。我不明白为什么ODS LISTING会以不同的顺序将它们输出到输出中。 – chucknelson 2009-09-04 15:15:06

+0

呼叫执行的工作正常,为了 - 只是包装这个问题! – chucknelson 2009-09-30 21:31:32

1

我喜欢做的一切宏中使用宏语言有关。我想这个权衡是你的程序中散布了很少的宏。但是,为了防止程序生成报告,只需注释掉宏调用(*%loopit;),您不必输入“question1”,“question2”,“question3”等!
希望这对你有用!

%macro report_by_question(input); 
    %put "Question: " &input; 
%mend; 

%macro loopit; 
    %do i=1 %to 3; 
     %report_by_question("question&i."); 
    %end; 
%mend loopit; 
%loopit; 
+0

感谢您的洞察力,在SAS中还没有涉及到“宏语言”;)上面的这个例子只是简化来解释我的问题。我正在使用DATA步骤来循环遍历事物,并读取变量/问题数据集 - 而不是对这些东西进行硬编码,哈哈。 – chucknelson 2009-09-04 20:39:27

2

数据步骤被编译,然后执行。 call execute(str);将str推入输入队列,以便在之后弹出数据步骤完成执行。订单保存期限。但是,如果您将宏调用放在双引号字符串中,如下所示: call execute(“%report(q)”); 然后宏在编译数据步骤时被调用,甚至在数据步骤开始运行之前。

如果您不想在编译时调用宏,则可以引用宏或将其放入单引号字符串中。下面是一个例子。希望这可以帮助。

/* create a dataset with 1 var and 3 obs */ 
data qs; 
    input q $; 
cards; 
q1 
q2 
q3 
; 
run; 

/* reporting macro -- a mockup */ 
%macro report(q=); 
    %put report for q=&q; 
%mend report; 

/* call the reporting macro for each q */ 
data _null_; 
    set qs;  
    macro = catx(q, '%report(q=', ')'); 
    call execute(macro); 
run; 

/* on log 
report for q=q1 
report for q=q2 
report for q=q3 
*/ 


/* to show what happens when the 
    macro is invoked during the compile 
    time */ 
data _null_; 
    call execute("%report(q=q1)"); 
    put "after call execute"; 
run; 
/* on log 
1 data _null_; 
2  call execute("%report(q=q1)"); 
report for q=q1 
3  put "after call execute"; 
4 run; 
after call execute 
*/ 
相关问题