SAS:当“修改”语句中的“where”条件不成立时,如何不覆盖数据集?

时间:2013-09-25 05:26:38

标签: sas

我有以下SAS代码:

data have_1;
modify have_1 have_2(where=(message="X")) updatemode=nomissingcheck;
by reference;
qty=qty-canceled_qty; 
if qty=0 then delete; 
run;

这是在循环内,这意味着对于我的问题,数据集have_2会针对每个循环迭代进行更改。字段条目message更改代码,例如“X”,“A”,“B”......消息的到达顺序。这就是为什么我在一个遍历每个消息序列的循环中工作的原因。 have_2中的每封邮件对have_1都有不同的含义。消息“X”表示我必须将数量更新为特定的参考号。

因此,我对循环内的每个modify都有message语句,因为我不知道消息的顺序是什么。如果在上面的示例中,have_1不等于“X”,我如何避免SAS覆盖我的数据集message

此问题是我之前question

的后续问题

1 个答案:

答案 0 :(得分:3)

“如何避免SAS覆盖我的数据集...” - 如果您的意思是在记录级别覆盖 - 检查_iorc_值将使您可以控制要执行的操作。您可以添加自己的逻辑来更新下面的模板代码。 不匹配的值是“_DSENMR”。

data have_1;
modify have_1 have_2(where=(message="X")) updatemode=nomissingcheck;
by reference;

    if      _iorc_ = %sysrc(_SOK) then do;
      * Update row ;
      replace;
    end;
    else if _iorc_ = %sysrc(_DSENMR) then do;
      * Add row ;
      output;
      _error_ = 0;
    end;
    else if _iorc_ = %sysrc(_DSEMTR) then do;
      * Multiple TRANSACTION data set observations do ;
      * not exist in MASTER data set ;
      _error_ = 0;
    end;
    else if _iorc_ = %sysrc(_DSENOM) then do;
      * No matching observation was found in MASTER data set ;
      _error_ = 0;
    end;
  run;

在此处查看更多http://support.sas.com/documentation/cdl/en/basess/58133/HTML/default/viewer.htm