这是继以前这篇文章的补充说明
起因是用公司的宏解析程序,发现解析后的程序运行出的数据集和未解析运行出的数据集对不上。如果这要是交给了CDE的话,问题挺严重的。
所以大家以后当了LSP的话,要养成一个triple QC的习惯(虽然这个解析只能算自己QC自己),同时要有一个意识就是对交付出去的东西对看一眼,至于能看出什么东西,这个就跟经验有关了。
比如你转成的XPT大小都是0KB,这可能吗?或者listing分页了;这些问题可大可小,申办方较真起来也能对你的公司印象变得很差。
同时还是很好奇,CDE那些老师在复现程序的时候,他们是自己写一遍呢(我感觉不可能),还是说重新运行一遍你的程序看下跑出来的结果和你交付的结果是否一致?
假设是运行你递交的程序,我感觉解析宏程序之后的程序很乱(但是只需要设置一下逻辑库就可以了),还不如用没解析宏之前的程序,把关键部分单独拎出来跑(但是report那部分,分页那部分可能复现不了)。
所以有知道的大神欢迎赐教或者有机会问问CDE老师的伙伴可以问问,据了解,就是如果把未解析宏程序的程序递交,最后也通过了CDE的审核(以前的项目)
我最终用的解析宏程序如下
%let path_1=D:\Practice;
%let path_2=D:\Practice2;
%macro resopa(name=);
filename mprint "&path_2\&name..sas"; /*输出解析后的宏程序文件*/
options mprint mfile; /*必须加上这个选项,要不然文件夹里不会有文件*/
%include "&path_1\&name..sas";
options nomprint nomfile;
%
mend resopa;
%
resopa(name=remacro);
%
resopa(name=remacro2);
那个filename mprint CLEAR没啥用,上面的程序也只是会导致解析后的每个程序结尾会加上options nomprint nomfile,不影响程序的运行,如果你有强迫症的话,可以手动删除。
大家解析之后,记得运行解析之后的程序,看看数据集和原始程序运行出来的数据集是否匹配的上,我这边试过了是可以的。
同时在解析宏的过程中,发现一个编程习惯可能导致解析后的程序运行出错。先看一段程序
data test;
set sashelp.class;
run;
data test2;
set sashelp.cars;
run;
%macro resolvema(name=,out=);
data cc_&out;
set test
%if &out=1 %then %do;test2%end;;
run;
%mend;
%resolvema(name=Alfred,out=1);
%resolvema(name=Thomas,out=2);
data final;
set cc_:;
run;
关键在这行 %if &out=1 %then %do;test2%end;;看起来是不是没什么问题。是不是认为会变成set test test2;
但是实际情况是这样,SAS set的是testtest2,中间的空格没了,而且最关键的是,明明没有这个数据集,但是SAS运行之后没有一个log,还分别读取了test和test2数据集。至于为什么没报错,我就不研究了。
这里讲讲为什么会解析成testtest2,虽然在上面这个程序中没有报错,但是在项目中是报了error的,明确指出其中的一个数据集不存在。
我一开始以为是在%if前面没有加空格,但是不管我加了多少空格或者换行,输出的结果还是这样。其实是空格加错了地方,空格应该加在%do; test2之间,也就是在分号后面要加上空格。
虽然在宏里面,你的%do;test2不加空格能正确运行,但是解析之后,这个分号后面的代码就和前面的代码完全粘在一起。所以大家现在养成一个习惯就是在%do的分号后面加上空格!%if %then %do; XXX;%end;