2016-06-17 63 views
1

我正在尝试做一件简单的事情 - 在DATA语句中写入PROC REPORT过程。我的主要想法是 - 如果数据步骤中的条件为真 - 让我们执行PROC REPORT,如果它是假的 - 不要执行PROC REPORT。有任何想法吗?代码现在可以毫无错误地运行,但是我发现IF语句中的条件没有被应用,并且尽管条件没有被满足,PROC REPORT仍然是可执行的。SAS中的DATA中的PROC报告

先谢谢您。

%let DATO = 13062016; 

PROC IMPORT OUT= WORK.auto1 DATAFILE= "C:\Users\BC1554\Desktop\andel.xlsx" 
DBMS=xlsx REPLACE; 
SHEET="sheet1"; 
GETNAMES=YES; 
RUN; 


data want; 
set WORK.auto1; 
rownum=_n_; 
run; 

DATA tbl2; 
SET want; 
if (rownum => 1 and rownum <=6) then output work.tbl2 ; 
RUN; 

ODS NORESULTS; 
ods LISTING close; 
ODS RTF FILE="C:\Users\BC1554\Desktop\Statistik_andel_&DATO..rtf"; 
title "Statistics from monthly run of DK shares of housing companies (andelsboliger)"; 
data Tbl21 ; 
set work.Tbl2; 
where (DKANDEL='Daekning_pct_24052016' or DKANDEL='Daekning_pct_18042016') ; 
difference = dif(Andel); 
difference1 = dif(Total); 
run; 
data Tbl211 ; 
set work.Tbl21; 
where (DKANDEL='Daekning_pct_18042016') ; 
run; 
data Tbl2111 ; 
set work.Tbl211; 
where (DKANDEL='Daekning_pct_18042016') ; 
if abs(difference) > 10 and abs (difference1) > 107 then ; 
run; 

proc report data= work.Tbl2 spanrows; 

columns DKANDEL Andel Total Ukendt ; 
title2 "-"; 
title3 "We REPORT numbers on p.4-5".; 
title4 "-"; 
title5 "The models coverage"; 
title6 "Run date &DATO."; 
footnote1 "Assets without currency code not included"; 
define DKANDEL/order; 
define Andel /order; 
define Total /order; 
define Ukendt/order; 
define DKANDEL/ display; 
define Andel/display; 
    Compute DKANDEL; 
    call define (_col_,"style","style={background=orange}"); 
    endcomp; 
Compute Andel; 
     call define (_col_,"style","style={background=red}"); 
endcomp; 
run; title; footnote1; 
ODS RTF close; 
ODS LISTING; 
title; 
     run; 
+0

不知道是否理解你的问题。因此,如果条件是'如果abs(差异)> 10和abs(差异1)> 107那么;'并且取决于结果proc报告应该被执行?如果是这样的话,那就不会像你编写它的方式那样工作,你需要使用宏变量来做... – kl78

+0

嗨,kl78, 是的,如果条件满足,那么就要超越PROC REPORT。 – BC1554

回答

1

有条件地执行你需要使用一个宏,以便您可以使用宏逻辑像%IF有条件地生成代码的代码。

但是,对于您的简单问题,您可以使用宏变量修改PROC REPORT步骤中的RUN;语句。创建一个宏变量,并在您不希望该步骤运行时将其设置为值CANCEL

%let cancel=CANCEL; 
... 
if abs(difference) > 10 and abs (difference1) > 107 then call symputx('cancel',''); 
... 
proc report ... ; 
... 
run &cancel ; 

简单的例子。如果有人年满13岁,请出示报告。

%let cancel=CANCEL; 
data _null_; 
    set sashelp.class ; 
    if age=13 then call symputx('cancel',' '); 
run; 
proc report data=sashelp.class ; 
run &cancel; 
+0

非常感谢Tom, 但是你能否这样做,并在这里发表评论,因为我试过了,现在还没有成功...... – BC1554

+0

如果你想要某人测试你需要发布一个带有数据的小示例程序你的代码。尝试使用SASHELP.CLASS添加的示例。 – Tom

1

汤姆的回答是一个很好的答案,也许我会这样做。但是,更准确地说,你在问题中提出的另一种选择似乎也是合适的。

在数据步骤中执行PROC REPORT(或在数据步骤中执行任何非数据步骤代码)的方式是call execute。您可以使用call execute来执行一个宏,或者只是一串代码;由你决定如何处理它。我会把它变成一个宏,因为这会使开发变得更容易(你可以像编写普通代码一样编写宏,并且可以独立测试它)。

下面是一个简单的例子,类似于汤姆在他的回答中所做的。

%macro print_report(data=); 
    proc report data=&data.; 
    run; 
%mend print_report; 


data _null_; 
    set sashelp.class ; 
    if age=13 then do; 
    call execute('%print_report(data=sashelp.class)'); 
    stop; *prevent it from donig this more than once; 
    end; 
run; 
+0

嗨乔, 我试着运行你的代码,我没有看到这个宏的一个点,它只是让我回到同一张表,所以......?这个MACRO的想法在哪里? – BC1554

+0

@ BC1554它从数据集运行PROC REPORT。正如它所写的那样,它或多或少毫无意义,当然,但它会告诉你如何去做你正在做的事情。它可能会变得有用 - 例如,如果您将参数存储在数据集中,并且您希望基于此多次运行“proc report”。 – Joe