在PROC REPORT

时间:2015-05-27 17:38:11

标签: sas

我有一个数据集(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中创建动态定义语句。

1 个答案:

答案 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极其强大的事情之一。