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_2に対して異なる意味を持ちますhave_1。「X」というメッセージは、数量を特定の参照番号に更新する必要があることを意味します。

したがって、メッセージの順序がわからない場合は、ループ内modifyにそれぞれのステートメントがあります。上記の例で「X」と等しくない場合、 messageSAS がデータセットを上書きしないようにするにはどうすればよいですか?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 に答える