SAS编程:SDTM程序中检查宏程序issue思路介绍

最近,公司检查SDTM CT的宏程序更新了一版,在运用过程中总会有Issue存在。在解决Issue的过程中,我弄清了这个宏的代码思路。这个思路对于我来讲,是比较新颖和奇妙的。

日常我们工作的重点是相关标准、规则的应用,编程内容并不复杂。编程中具体宏的开发,有专门的团队去开发、维护。不过从遇到问题到相关部门解决这个问题,流程时间稍微有点长。于是,我就自己试着解决这个问题了。下面介绍一下,解决宏程序issue的思路。

宏程序相关issue问题的解决,一般有两个思路:

  1. 查看宏程序的源代码;
  2. 输出宏程序运行时的代码。

这两个途径各有优缺点。一般在宏程序的源代码中,宏程序以及各个宏参数的作用都会有详细的说明,通过这一块我们可以对宏程序有整体的清晰认知。但对于宏程序具体运行环节的内容,直接看源代码的效率并不高,因为宏程序中可能涉及大量宏条件、宏循环语句,不容易展现实际运行的具体思路。这时候,直接查看宏运行的程序,效率就高很多。

我检查CT宏程序运用的是第二个思路。这里介绍两个宏系统选项:

options mprint symbolgen;

MPRINT宏系统选项,指定是否将宏执行生成的SAS语句写入SAS日志。这样我们可以直接SAS日志中查看宏程序实际执行的语句,方便定位具体的issue发生的代码块。NOMPRINT是不输出的选项。我用一个简单的宏程序进行举例:

oprions mprint;
%macro print(indt=);
  proc print data = &indt.;
  run;
%mend;

%print(indt=sashelp.class);

运行以上程序,SAS日志中显示了宏程序实际执行的语句:


SAS编程:SDTM程序中检查宏程序issue思路介绍_第1张图片
Log 1

SYMBOLGEN宏系统选项,指定是否将解析宏变量引用的结果写入SAS日志以进行调试。这个选项方便查看,宏程序运行过程中,宏变量的具体值。NOSYMBOLGEN是不输出的选项。具体看代码演示:

options nomprint symbolgen ;
%macro print(indt=);
  proc print data = &indt.;
  run;
%mend;

%print(indt=sashelp.class);

宏程序实际运行过程中,宏变量的解析值就会在日志中显现,方便调试代码:


SAS编程:SDTM程序中检查宏程序issue思路介绍_第2张图片
Log 2

通常,我会直接使用这两个选项,先在日志中查看宏程序的具体运行代码;如果代码比较复杂,直接阅读不容易理解,我会日志内容复制到程序中,删除不必要的文字说明,直接一步一步运行程序,进行理解。

当然,你也可以将MPRINT内容输出到外部文件中,这需要使用MFILE宏系统选项,并指定具体的输出路径。大多数情况我是直接总SAS日志中复制的,这样比较便捷。不过,使用MPRINT选项也有一个优点,输出的内容是完整的运行程序,不会有多余的说明文字。这就不必像从日志复制内容那样,进行删减处理。具体看以下程序:

options nomprint symbolgen mfile ;
filename mprint "./Print.txt";

%macro print(indt=);
  proc print data = &indt.;
  run;
%mend;

%print(indt=sashelp.class);

日志输出结果如下:


SAS编程:SDTM程序中检查宏程序issue思路介绍_第3张图片
Log 3

对应地址下TXT文件内容如下:


SAS编程:SDTM程序中检查宏程序issue思路介绍_第4张图片
MFILE

当然,可以直接将宏程序运行内容直接输出到.sas文件中(不过,个人觉得TXT文档打开比较方便快捷):

filename mprint "./Print.sas";

以上。

若有疑问,欢迎评论区交流!

你可能感兴趣的:(SAS编程:SDTM程序中检查宏程序issue思路介绍)