2017-11-06 15 views
1

特定のプログラムが実行されなかったことをユーザに警告する文をSAS Logに出力しようとしています。これを行うには、私は、Putステートメントを使用してSASログに印刷しています:putステートメント内で関数を使用するにはどうすればよいですか? SAS

%let step1 = My program; 
%let rec= cats(&step1.); 

data _null_; 
put "** &rec. did not run"; 
run; 

Putステートメントの版画:「**猫(私のプログラム)が実行されませんでした」。誰もが猫の機能が実行されていない理由を知っていますか? SASのステートメントの前に実行されているマクロコードと関係があると思いますが、どうやってこの作業を行うのか分かりません。

EDIT

おかげReezaとトム。今私はなぜこれが動作していないのか理解しています - 私は%sysfuncを使ってデータステップの外で関数を使う必要があり、put文の中で関数を使うことはできません。

トム - あなたはより完全な例を求めて:

は、私は、ユーザーが簡単に実行し、スキップされたどのプログラムを参照できるように、SASログに声明を印刷しようとしています。私は、次のやっていることを達成しようとしています:私は、このコードは動作しますが、機能Putステートメントの内側に実行させるための方法を見つけ出すことができれば、私は思っ

data _null_; 
array steps(*) $ step1-step7; 
do i=1 to dim(steps); 
    if symget(cats('run',i)) = 'N' then 
    put "** The program "symget(cats('run',i)" did not run"; 
end; 
run; 

。しかし、それは不可能です。私は変数を "i"で変更できるようにする必要があります。

たとえば、iが1の場合、put文は "program1.sasが実行されませんでした"である必要があります。

iが2の場合、putステートメントは「プログラムfile2.sasは実行されませんでした」などとなります。

私が使用してみました:

put "** The program &&step&i did not run"; 

が、SASは私の変数を認識することができません。

これはもう少し文脈を提供してくれることを願っています。

+0

なぜあなたはそのステップを持っていますか? – Reeza

+2

'PUT'文の途中に関数を含めることはできません。あなたの 'PUT'ステートメントは文字リテラルを置いているだけなので、関数を呼び出そうとしていません。あなたが '%sysfunc()'マクロ関数を使わなかったので、2番目の '%LET'文は' cats() '関数を呼び出そうとしていません。あなたは何をしようとしているのより意味のある例がありますか? – Tom

+0

あなたのDOループ上のupperboundを設定する以外に、ARRAYの手順は何ですか? – Tom

答えて

1

あなただけ%DOループを使用して、マクロを実行している場合。

%do i=1 %to 7 ; 
    %if (N=&&run&i) %then %put NOTE: The program &&step&i did not run; 
%end; 

それ以外の場合は、データステップ変数を使用してください。

data _null_; 
    do i=1 to 7 ; 
    if symget(cats('run',i)) = 'N' then do; 
     length program $100 ; 
     program=symget(cats('step',i)); 
     put 'NOTE: The program ' program 'did not run'; 
    end; 
    end; 
run; 
+0

ありがとう!これは私がやろうとしていたものです。配列変数と混同して申し訳ありません! – theponcer

2

%SYSFUNC()を追加してデータステップ外の関数を使用できますが、この場合CATSはプロセスに値を追加しません。

%let step1 = My program; 
%let rec= %sysfunc(cats(&step1.)); 

data _null_; 
put "** &rec. did not run"; 
put "** &step1. did not run"; 
run; 

出力:

293 
294 
295 %let step1 = My program; 
296 %let rec= %sysfunc(cats(&step1.)); 
297 
298 data _null_; 
299 put "** &rec. did not run"; 
300 put "** &step1. did not run"; 
301 run; 

** My program did not run 
** My program did not run 
NOTE: DATA statement used (Total process time): 
     real time   0.00 seconds 
     cpu time   0.00 seconds 
関連する問題