Sas 在过程报告中动态创建和定义

Sas 在过程报告中动态创建和定义,sas,Sas,我有一个数据集(liste_institution),其中包含我想在我的proc report语句中“define”的变量的所有名称。这是我的代码,当我不动态调用我的宏时可以使用(%create_institution(815);)。如果将data语句与调用execute(在代码中的注释中)一起使用,它将不起作用。原因似乎是当我使用调用execute时,代码没有在PROC报告中解释,这就是为什么它会给我错误 proc report data = ventes_all_inst4

我有一个数据集(
liste_institution
),其中包含我想在我的
proc report
语句中“
define
”的变量的所有名称。这是我的代码,当我不动态调用我的宏时可以使用(
%create_institution(815);
)。如果将data语句与调用execute(在代码中的注释中)一起使用,它将不起作用。原因似乎是当我使用调用execute时,代码没有在PROC报告中解释,这就是为什么它会给我错误

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报告中动态创建define语句。

基本上,您对宏的工作方式和计时有误解。您需要在proc报告之前编译宏列表,但不能使用
callexecute
,因为它实际上执行代码。您需要创建一个宏变量

最简单的方法如下:

proc sql;
  select cats('%create_institution(',ins,')')
    into :inslist separated by ' '
    from liste_institution
  ;
quit;
这使得
&inslist
现在是机构列表(带有宏调用)


您还可以跨变量使用
,使这变得更容易;您需要的是每个
ins
中有一行,其中一个变量具有该值(定义列名),另一个变量具有数据表部分中的值。然后SAS将自动为跨
值的每个
创建列。跨变量是使
proc report
极其强大的因素之一。

调用执行
方法并非不可能,但您需要在数据步骤中生成整个
proc report
块,而不仅仅是重复位。Joe的方法很好,只要你没有达到宏变量字符的限制。我没有费心提及这一点,因为我非常害怕一个拥有足够25个字符的列的报告达到这个限制;)它工作了谢谢你,现在唯一的事情是proc sql语句再次给我错误,就像SAS试图解释代码时,当我在proc报告中调用我的宏变量时,它工作得很好!我发现了为什么我的变量“INS”是数字,所以在中仍然有错误。我只是将“INS”转换为字符串,它可以完美地工作,没有错误,再次感谢!