2017-01-30 6 views
0

私はCLIENT_IDという変数を持っています。これは、コードの束をループするために使用されます。問題はマクロが以下のようなクライアントの特定のリストを探していることです:SAS - 列に値がリストにない場合、コードを停止する必要があります

%stuff(CLIENTX) 
%stuff(CLIENTA) 

などです。そのため、新しいクライアントがデータに表示された場合(例:CLIENTY)、そのクライアントは出力に含まれません。

私はどちらかしたいと思います

  1. は、マクロを手動で
  2. 更新することができますので、そのクライアントの名前を出力し、既存のクライアントのリストに対するコードチェックを持っているし、新しいクライアントが発見された場合に停止
  3. は新しいクライアントのためのコードチェックを持っているし、新しいがある場合は、自動的に私は新しいクライアントIDを見つけるために比較する方法を知っている

マクロリストに追加する、それだけでコードを停止したり、コードを更新しています私が苦労しているクライアント。おそらく第二のものは不可能でしょうか?しかし、私はこの問題を解決する方法が少なくともあることを願っています。

私はマクロの専門家ではないことを完全に認めます。

+0

私はプログラムを視覚化するのに少し問題があります。いくつかのデータポイントを使って何をしているのかの小さな例を投稿できますか? –

+0

類似の性質を持つ質問がいくつかあります。「データ駆動型プログラミングSAS」を検索してください。 – Joe

+0

@StuSztukowski - 私はジョーが働くと思います。しかし、私はいつもより多くの提案に開放しています。基本的には、すべての顧客がすべてのアカウントを持つ主要なデータセット(何百万もの可能性があります)と他の情報があります。今日のマクロは、クライアントを使用してループし、それらのフィールドのいくつかをプルダウンし、すべてのデータを一緒に追加しています。主なデータセットは非常に大きいので、これを行う理由です。しかし、我々は予告なしに新しい顧客を獲得するので、ハードコーディングされたマクロはそれらを逃してしまいます。私はここで例を得る方法を完全にはわかりません。 – Bliss

答えて

0

あなたのやりたいことは、書かれたコードからではなく、あなたのデータからあなたのマクロを呼び出すことです。

あなたが

ので、代わりの

%yourMacro(clientX) 
%yourMacro(clientY) 

proc sql; 
    select distinct cats('%yourMacro(',clientID,')') 
    into :macro_call_list separated by ' ' 
    from your_Data 
    ; 
quit; 

&macro_call_list.; 

メインデータセットに、それはあなたが持っているものだ場合、または有効なクライアントのリストにあなたのいずれかの直接your_dataあなたがいることを持っている場合別のファイル(クライアントの場所の横断歩道など)で管理されています。最新のデータを持つものは何でも。クエリにdistinctを追加すると、clientIDごとに1回の呼び出しが保証されます。その後、&macro_call_listには%yourMacro(clientX)などのすべての呼び出しが含まれており、その参照をオープンコードに入れるだけで呼び出します。

+0

私は小さなリストでそれをテストし、それは働いた。私は現在、メインファイル全体でこれをテストしています。これは約10億レコードです。それは実行されているが、私はそれが動作すると思います。私はむしろ手動ですべての時間を更新するよりも長い実行時間を持っています。ありがとう! – Bliss

関連する問題