我有一个数据集(liste_institution
),其中包含我在define
语句中想要“proc report
”的变量的所有名称。这是我的代码,当我不动态地调用我的宏(%create_institution(815);
)时。如果我使用带有调用execute的数据语句(在我的代码中的注释中)它不起作用。原因似乎是当我使用调用执行时,代码不会在PROC REPORT中解释,这就是为什么它会给我错误。
proc report data = ventes_all_inst4
missing split = "*" nowd
style(header)=[font_weight=bold background = #339966 foreground = white]
style(column)=[cellwidth=15cm];
%macro create_institution(institution);
define TOTAL_&institution. / display "TOTAL*($)" style(column)=[cellwidth=4cm];
%mend;
/* Give error when I use this data step */
/*data _null_;
set liste_institution;
call execute('%create_institution(' || INS || ');');
run;*/
%create_institution(815);
run;
是否有一种简单的方法可以在包含列名的数据集中在PROC REPORT中创建动态定义语句。
答案 0 :(得分:0)
基本上,您对宏的工作方式和时间有误解。您需要编译proc报告之前的宏列表,但不能使用call execute
,因为它实际上执行代码。您需要创建一个宏变量。
最简单的方法就是这样:
proc sql;
select cats('%create_institution(',ins,')')
into :inslist separated by ' '
from liste_institution
;
quit;
使&inslist
成为现在的机构列表(通过宏调用)。
您也可以使用across
变量来简化此操作;你所拥有的是每ins
一行,一个变量具有该值(定义列名),另一个变量具有数据表部分中的值。然后,SAS将自动为每个across
值创建列。跨变量是使proc report
极其强大的事情之一。