日期:2014-05-16  浏览次数:20455 次

SAS比较常见的错误测试
测试环境,
  every R&D group,都有统一测试环境(强调下,这个测试环境,要确保其独有性,不能同步进行,多个人同时在该环境下测试会有问题的,
  一方面,测试数据会相互影响,另外,测试可能是在做性能调优),是真实数据,有全局性的稳定结构,和其他组进行的沟通环节都基于此。
  所有数据更新后都及时更新测试环境的数据。所有其他组都从测试环境获取测试数据,而且确保测试数据的多期多样性。
  理论上说,开发之初,数据集合和部署情况应该有文档和标准了,所有sas程序也有命名和规范了。框架已经出来了。
  因为,在开发中,曾经遇见多次,因为环境不一致导致的校验出错。
  就像以前在BD时,所有R&D提交的code都经过Q&A编译才送测,那我们现在可以R&D自己在统一测试环境中进行单元测试然后提交代码。
  1,验证code在开发测试前完成,这样的好处,在单测时就可以进行合数(对某些关键性指标合计)。
  2,另外,用sql语句建表,追加时,proc append进行追加,可以新生成数据是否和base一致。
  教训:
  有多次因为开发测试的数据不一致导致的程序错误,
  也有多次因为自己开发环境某些配置,某些数据存在,导致程序可以跑通,容忍了一次错误.
  关于sas易见错误,误区:
  1,merge容易出现问题:
  merge a b;
  我们往往是要实现左连接的功能,但是使用中往往没有去连接键的重复,导致连接后面数据量增加.
  这样需要在merge前sort时候,nodupkey一把.如此使用也需要注意是否可以随意的去重,某些时候应该是有条件的保留,
  如,我们在统计30天内活动卡量时候,我们是把交易中的活动card_nbr取出,但是统计活动卡量得用card_id(因为可能涉及到换卡),所以
  proc sort data=tmp by card_id card_nbr;run;
  data tmp;set tmp;if last.card_id then output;run;只取了最后一张卡片.然后用改表去做merge.
  其他方法,可以用sql语句左连接可以避免大量代码问题.
  检查日志时候,merge,提示by变量有多个重复观测;有缺失值;未初始化变量
  2,缺失值的问题,如果涉及到+/-计算,连接,缺失值会出现问题的,需要对缺失值做统一处理.在开发前要规划好,在哪个步骤处理比较合理.
  3,代码review和单元测试去除一些warning
  应该消灭所有warning.
  常见warning,如merge时by变量长度不一致问题;如proc sql中,create table用了已有表(个人建议不要这样用法,data步里面这样用也值得商榷);data步中引用了未初始化的变量;如merge时by变量未去重
  4,避免使用全局性的macro变量.
  变量,
  对sasmacro变量生命周期的思考
  写在9.2发布之前
  据说9.2有命名空间之说,这样可以免去很多变量命名上的麻烦和苦恼.
  早期版本中,sas中宏变量有local和global之说,而且同名情况下会相互覆盖.
  宏函数里面不声明宏变量类型时候,会出现这种状况,会修改同名宏的值,若没有同名宏其作用范围也只限于该宏函数里面.
  下面谈谈宏变量生命周期,如果显示的声明local和global.则各自有自己独立的生命周期.global是全局性
  变量.就像C中的全局变量一样,不要随便定义,除非真的需要.
  local只会在宏函数存在的范围内有效,宏函数里面使用宏变量的时候,应该把他们声明成local,绝对不要用%let直接赋值,这样可能会改写外面的变量的.
  另外,也建议形成规范,global用g_来定义.