1

我有以下 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_2have_1. 消息“X”意味着我必须将数量更新为特定的参考编号。

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

这个问题是我上一个问题的后续问题

4

1 回答 1

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

于 2013-09-25T07:06:19.250 回答