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”转换为字符串,它可以完美地工作,没有错误,再次感谢!