私は最近、このようになりますSASプログラム継承:多面的なプログラマビーイングマクロ実行時にCALL EXECUTEを使用してマクロエラーを直接実行するのはなぜですか?
%MACRO ComplicatedStuff(GroupId=);
%LET FileId = %SYSFUNC(OPEN(Work.BigDataSet));
%PUT 'Doing something really difficult with ' &GroupId.;
%LET CloseRC = %SYSFUNC(CLOSE(&FileId.));
%MEND ComplicatedStuff;
%ComplicatedStuff(GroupId=ABC1);
%ComplicatedStuff(GroupId=DEF2);
%ComplicatedStuff(GroupId=3GHI);
%ComplicatedStuff(GroupId=J4KI);
を、私はこれを見て、「確かに私はこのA少なくとも少しはよりダイナミックにすることができます」と思いました。案の定、私はCALL EXECUTE
を使用して簡単な解決策だと思ったものを開発することができました:それは別のサーバーにComplicatedStuffによって生成されたファイルをFTPで転送する時間が来るまで
DATA Work.IDs;
INPUT ID $4.
;
DATALINES;
ABC1
DEF2
3GHI
J4KI
RUN;
DATA Work.CommandDebug;
SET Work.IDs;
Command = CATS(
'%ComplicatedStuff(GroupId=', ID, ');'
);
CALL EXECUTE(Command);
RUN;
私は、このソリューションには満足でした。私たちのSASサーバーは、UNIX上で実行されていて、SAS管理者は、私たちは(私が言われてきたので、x
コードが本当に醜くなる)%sas_sftp
命名呼び出すために役立つ少しのマクロを作成しました。それは私の会社に所属し、私は彼らがSOにそれをしたいとは思わない - 残念ながら、私は%sas_sftp
コードを投稿することはできません。
私は(両方の第二CALL EXECUTE
と同じデータステップ内、及び第二のデータ工程として)%ComplicatedStuff
マクロが、(約30の)最初のファイルを呼び出していたと同じようにマクロ%sas_sftp
を呼び出すことになる試みそれを目的地にする。私は、ログを見ると、2番目のマクロが実行を開始したように、FTPが終了(次のftpが開始する前に、FTPパイプ、または何でもそれはあるが、リリースされていなかった)いたので、その後のFTPSは、単に黙って失敗していました前に、それが見えましたリソースが利用できないために(私は推測します)。
私はEXECUTEは基本的に私のマクロ呼び出しをキューして、(彼らはもともとあったように)、それらを順次コードに位置していたかのようにそれらを実行するだろうと思った - 一度に一つ。明らかに、何か他のことが起こっているのは、上記の最初のアプローチが問題なく働いていたのに対し、私のダイナミックなソリューションは失敗したからです。私はCALL EXECUTE: How and WhyとSAS documentation上に注いだが、私はちょうど彼らが話しているのか理解していないんです。
私は最終的に「回答」として以下に投稿した回避策を見つけましたが、EXECUTE関数とそれがどのように機能するかを説明する人がいます。 CALL EXECUTE
を使用して私の最初の試みは、うまくいかなかったのはなぜ
?
あなたの問題がどこにあるのかは不明です。この他のマクロ '%sas_sftp'を実行しようとしていますが、あなたのコードにそのマクロを表示していません。 2番目の 'CALL EXECUTE'を同じデータステップに追加しようとしているのですか、'%sas_sftp'パーツだけを実行する2番目のデータステップがありますか?そして、私は同じ名前のユーティリティマクロを持っています!この問題は、マクロが行っていることとまったく同じである可能性があります。私は 'expect'スクリプトを作成して実行するので、' CALL EXECUTE'を実行しても心配するつもりはないと思います。 – BellevueBob
@BellevueBob - 私はコードへのアクセス権がなく、公開フォーラムに投稿するのが私のものではないため、部分的にはsas_sftpマクロを投稿できません。データステップに2番目の 'CALL EXECUTE'を追加しようとしました。それがうまくいかなかったら、私は2番目のDATA _NULL_ステップを試みました。どちらの場合も同じ結果になります。 – JDB
私は実際に、マクロ自体ではなく、エラーがあったコードの例を見たいと思っていました。答えは、呼び出し中に '%nrstr'マクロ関数を使うという単純なものです。言い換えれば、動作するコードを表示しますが、動作しないコードは表示しませんでした。 – BellevueBob