1

我正在尝试做一件简单的事情 - 在 DATA 语句中编写一个 PROC REPORT 过程。我的主要想法是 - 如果数据步骤中的条件为真 - 让我们执行 PROC REPORT,如果它是假的 - 不要执行 PROC REPORT。有任何想法吗?代码目前运行没有错误,但我看到 IF 语句中的条件未应用并且 PROC REPORT 是 ececute 尽管条件未满足。

先感谢您。

%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;
4

2 回答 2

2

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

但是对于您的简单问题,您可以使用宏变量来修改您的步骤中的RUN;语句。PROC REPORT创建一个宏变量并将其设置为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;
于 2016-06-17T13:19:26.237 回答
2

汤姆的回答很好,也许我会这样做。但是,更确切地说是您在问题中建议的替代方案似乎也合适。

在数据步骤中执行 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;
于 2016-06-17T14:07:22.073 回答