0

have次のような複数の変数を持つ 1 つのエントリで呼び出されるデータセットがあります。

message reference time  qty  price 
x       101       35000 100  .

上記のデータセットは、ループ内で毎回変更されます。ここでmessageは、="A" にすることができます。message="X"の場合、これは MASTER セットから 100 数量を削除することを意味し、その数は MASTER データベース内のreference数と同じです。= reference。=101priceの下の MASTER データベースに既にあるためです。referenceMASTER データベースは、利用可能な数量のある価格で利用可能なすべての注文を集約します。次のループでmessage="A" の場合、haveデータセットは次のようになります。

メッセージ 参照時間 数量 価格 A 102 35010 150 500

referenceこれは、MASTER データベースに新しい番号を追加することを意味します。つまり、appendMASTERへのラインへ。

messageXがある場合に MASTER データベースの数量を更新するために、ループに次のコードがあります。

data b.master;
modify b.master have(where=(message="X")) updatemode=nomissingcheck;
by order_reference_number;
if _iorc_ = %sysrc(_SOK) then do;
replace;
end;
else if _iorc_ = %sysrc(_DSENMR) then do;
      output;
      _error_ = 0;
    end;
else if _iorc_ = %sysrc(_DSEMTR) then do;
      _error_ = 0;
end;
else if _iorc_ = %sysrc(_DSENOM) then do;
_error_ = 0;
end;
run;

を使用しreplaceて数量を更新します。しかし、price= のエントリ以来。がmessageX の場合、上記のコードはprice='.'を設定します。where reference=101 ステートメントを介して MASTER でreplace...これは望ましくありません。したがって、データセットの価格列 is message=Xを削除することをお勧めしhaveます。messageしかし、このコードを使用しているため、=A の場合に列 price を削除したくありません

proc append base=MASTER data=have(where=(msg_type="A")) force;
run;

したがって、私はこのコード価格を私のModify声明に持っています:

data have(drop=price_alt); 
set have; if message="X" then do; 
output;end; 
else do; /*I WANT TO MAKE NO CHANGE*/ 
end;run;

しかし、それは私が望むことをしません。メッセージが X と等しくない場合、列を削除したくありません。X に等しい場合は、列を削除します。上記のコードを機能させるにはどうすればよいですか?

4

2 に答える 2

3

これを試して:

data outX(drop=price_alt) outNoX;
set have;
if message = "X" then
   output outX;
else
   output outNoX;
run;

@sasfrog がコメントで述べているように、テーブルには列がある場合とない場合があります。MESSAGE="X" をサブセット化する場合は、このようなものを使用して 2 つのデータ セットを作成できます。

于 2013-09-25T22:35:13.123 に答える